×
单片机 > 单片机程序设计 > 详情

LED数码管时钟程序+电路-时间可调

发布时间:2020-06-23 发布时间:
|


 

不来废话上程序:
/***************************************************************
* 程序名称:51单片机数码管电子钟+定时闹钟  晶振:12.00
* 实验对象:51hei单片机学习开发板
* 单 片 机:AT89S52或STC89C52  闹钟时间:7:10分(程序自定义)
*使用定时器方式,数码管显示24小时“00-00-00”(增加中断进入对时功能
P1为按键,P2为段选,P0为位选,      
****************************************************************/
/***使用定时器方式,数码管显示24小时“00-00-00”(增加进入对时功能)
P1为按键,P2为段选,P0为位选,{闹钟暂时不可调待完善})***/ 
#include  
#define uchar unsigned char           /*宏定义 */ 
#define uint unsigned int             /*宏定义 */ 
uchar hour,hour_h,hour_l;             /*定义小时,小时的高位,小时的低位*/ 
uchar min,min_h,min_l;                /*分*/ 
uchar sec,sec_h,sec_l;         /*秒*/ 
uchar int_num;            /*定时溢出作用标号*/ 
sbit key_secadd=P1^1;     /*定义了 p1.1为秒增1键,用在调时中断里*/ 
sbit key_minadd=P1^2;     /*定义了 p1.2为分增1键,用在调时中断里*/ 
sbit key_houradd=P1^3;    /*定义了 p1.3为时增1键,用在调时中断里*/ 
sbit key_intime=P1^0;     //按P1.0进入调时
sbit key_quit=P1^5;    //P1.5退出调时
sbit bell=P1^5;     //小喇叭
void delay(uchar time);        /*延时子函数声明*/ 
void display();                /*显示子函数声明*/ 
void inter_init();         /*定时器初始化子函数声明*/ 
void time24();
/****专用数码管显示表***/ 
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40}; /*0x40显示“一”符号*/ 
uchar code wema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00}; 
/*小时hour  分min  秒sec*/ 

//---------------------延时子函数--------------------------------
void delay(uchar time)   /*延时子函数*/ 
  { 
   uchar time_1; 
   for (;time>0;time--) 
    for (time_1=100;time_1>0;time_1--); 
  } 

//---------------------初始化T0函数-------------------------- 
void time0(void) interrupt 1  /*定时器T0服务子程序*/ 
 { 
  TH0=(65535-50000)/256; 
  TL0=(65535-50000)%256; 
  int_num++; 
 }

//---------------------定时器函数--------------------------
void inter_init()     /*定时器初始化子函数*/ 
  { 
   EA=1;    /*开总中断*/ 
   EX0=1;    /*开外部中断0*/ 
   ET0=1;     /*打开定时器T0*/ 
   TMOD=0x01; /*工作方式1*/ 
   TCON = 0x00;   /*触发方式*/ 
   IP = 0x01;    /*中断优先级别,T0优先*/ 
   TH0=(65535-50000)/256; /*置初值,大约50ms一个中断 */ 
   TL0=(65535-50000)%256; 
   TR0=1;    /*置位TR0,启动定时器0*/ 
  } 
//---------------------24小时时间自加 --------------------------
 void time24()       /*时间递增*/ 
  { 
   if(int_num==20)  /*值满20,大约就是一秒的时间。*/ 
    {         /* 其值设为2,则定时时间快10倍,可做毫秒计时*/ 
     int_num=0; 
     sec++;       /*秒值加1*/ 
     if(sec==60)  /*如果秒值满60,就归0*/ 
      { 
       sec=0; 
       min++;  /*分值加1*/ 
       if(min==60) 
        { 
         min=0; 
         hour++;    /*分值归0,时值加1*/ 
         if(hour==24) 
          { 
           hour=0;   /*时值满24归0*/ 
          } 
        }  
      } 
    }
  }

//-----------按键调整子函数-------------------------------------
void key(void) //按键调整子函数
 
{ 
 if(key_intime==0)
  {EA=0;  //      关中断
   sec=0;  //秒归零
 
 while(100) //正确   
 { display();
  if(key_quit==0)
   {
    EA=1;
    break;
   }
  if(key_secadd==0) 
   { 
    delay(1); 
    if(key_secadd==0) 
     { 
    sec++; 
      while(!key_secadd); 
      if(sec==60) 
       { 
        sec=0; 
       } 
     } 
   } 
  if(key_minadd==0) 
   { 
    delay(80); 
    if(key_minadd==0) 
        { 
      min++; 
      while(!key_minadd); 
      if(min==60) 
       { 
        min=0; 
       } 
     } 
   } 
  if(key_houradd==0) 
   { 
    delay(80); 
    if(key_houradd==0) 
     { 
      hour++; 
      while(!key_houradd); 
      if(hour==24) 
       {
        hour=0; 
       } 
      } 
    }
  } } 
} 

//---------------------数码管显示子函数------------------------------------- 
void display()  /*数码管显示子函数*/  
  {
   sec_h=sec/10;     /*求出秒高位需要显示的字符*/ 
   sec_l=sec%10;   /*求出秒低位需要显示的字符*/ 
   min_h=min/10; 
   min_l=min%10; 
   hour_h=hour/10; 
   hour_l=hour%10;  
   P2=duma[sec_h];  /*显示秒高位*/ 
   P0=wema[6]; 
   delay(10);
  
   P2=duma[sec_l];  /*显示秒低位*/ 
   P0=wema[7]; 
   delay(10); 
 
   P2=duma[10]; /* “一”符号的显示 */ 
   P0=wema[5]; 
   delay(10);
 
   P2=duma[min_h];   /*分*/ 
   P0=wema[3]; 
   delay(10);
 
   P2=duma[min_l]; 
   P0=wema[4]; 
   delay(10);
 
   P2=duma[10];   /* “一”符号的显示 */ 
   P0=wema[2]; 
   delay(10); 
 
   P2=duma[hour_h];    /*时*/ 
   P0=wema[0]; 
   delay(10);
 
   P2=duma[hour_l]; 
   P0=wema[1]; 
   delay(10);
 
  } 

 //---------------------主函数--------------------------------
/*void alarm_clock() //闹钟子函数-变频发声
{
   uint i,j,y,m;
   if(hour==00)//时到了00点?
     {
      if(min>=01){m=0;} //分大于或等于01就把m清零,若不成立向下执行
      if(min==00)//到了00分?
        {
         if(m<15)
           {
           do{    //循环-变频
               m++; display();
               for(i=0;i<2000;i++) 
               {bell=~bell;for(j=0;j<24;j++);} //取反/ 
               for(y=0;y<2000;y++)
               {bell=~bell;for(j=0;j<25;j++);} //取反/
      for(i=0;i<2000;i++) 
               {bell=~bell;for(j=0;j<26;j++);} //取反/ 
    for(i=0;i<2000;i++) 
               {bell=~bell;for(j=0;j<27;j++);} //取反/ 
             }
           while(m<15); //闹15次结束
          }
       }
     } 
}*/

//---------------------主函数--------------------------------
void main() 
{ 
  inter_init();       /*定时器初始化*/ 
  hour=23;         /*自定义一个初值,方便快速观察翻转状态(可修改)*/ 
  min=59; 
  sec=50; 
 while(1)
 
  {  
   key();   
   time24();  /*分开时间,分别显示字符*/ 
   //alarm_clock();//闹钟函数
   display();    /*调用显示函数来显示*/ 
  } 
} 
关键字:LED  数码管  时钟程序  时间可调 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项