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

单片机数码管电子钟(C语言)

发布时间:2020-08-25 发布时间:
|
//***********************************

// 软件名:   LED数码 电子钟
//***********************************
//
// 软件版本:V1.0.3
//
//
//***********************************

#include
#include
#define uchar unsigned char


void delay (void);
start_time ();
key_adjust ();
void alarm (void);
time_end (void);
// k1调秒 k2调分 K3调时
sbit k0=P1^0; // 电子时钟 START/STOP 键
sbit k1=P1^1; //调时
sbit k2=P1^2;  //调分
sbit k3=P1^3;  //调秒
sbit beep=P2^1;  //蜂鸣器
bit on_off;

uchar code LOAD[8]={0xff,0xff,0xc7,0xc0,0x88,0xa1,0xff,0xff};//显示LOAD字样数据
uchar code LED_DATA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9数字数据
uchar data DATA_TEMP[8]; //显示缓存区
uchar data digit; //移位变量(动态扫描时选通)
static uchar data t,k,i;
static char data sec,min,hour;
int f,h,j;
char d;

main ()
{    

 TMOD=0X01;  //定时器0
 ET0=1;   //开定时器0中断
 EA=1;   //开总中断
 TH0=0XFC; //定时器0 定时1ms
 TL0=0X18;
 TR0=1;    //启动定时器
 RCAP2H=0X3C; //定时器2 定时50ms
 RCAP2L=0XAD;
 ET2=1;
 digit=0xfe;
 P3=0XFF;  //关闭显示
 d=0;
 on_off=1;

//***************开机显示 LOAD *************
while (d<8)
{
  DATA_TEMP[d]=LOAD[d];
  d++;
}
for (h=600;h>0;h--)   //开机后显示LOAD延时
 {
   for (j=500;j>0;j--);
 }

TR2=1;//开始倒时时
//*****************************************
 
 //******对时钟进行初始化赋值*******
 hour=12;   
 min=0;
 sec=0;
 //********时间:00-00-00 *****************
 
 start_time ();  //调用调时间函数,使之对时钟进行初始化赋值
 DATA_TEMP[2]=0XBF;  //使之LED显示格式为xx-xx-xx
 DATA_TEMP[5]=0XBF;
 
 while (1) // 总循环
  {
   key_adjust ();
    //*********************时钟走时部分******************
  if (k0==0) 
   {
   delay ();
    while (k0==0);//等待按键释放
     on_off=~on_off; //做标记,用于判断K0键状态(是继续还是暂停计数器)
  if (on_off==0) TR2=0;
    else TR2=1;
  }
 while (t==20) //到1 秒了吗?
  {
  t=0;
  sec++;
  
  if (sec>59)  //到1 分钟了吗?
    {
      sec=0;
   min++;
   
   if (min>59)  //到1 小时了吗?
   {
   min=0;
   hour++;
   
     if (hour>23) hour=0;
      
   DATA_TEMP[1]=LED_DATA[hour%10];
                   if (LED_DATA[hour%10]==0) DATA_TEMP[1]=0xFF;   
    DATA_TEMP[0]=LED_DATA[hour/10];
   }

  DATA_TEMP[4]=LED_DATA[min%10];
                  if (LED_DATA[min%10]==0) DATA_TEMP[1]=0xFF;
   DATA_TEMP[3]=LED_DATA[min/10];
    }

 DATA_TEMP[7]=LED_DATA[sec%10];
         if (LED_DATA[sec%10]==0) DATA_TEMP[1]=0XFF;
  DATA_TEMP[6]=LED_DATA[sec/10]; 
   }
    while ((hour==8)&&(min==0)&&(sec==0))  //设置闹钟
   {
   time_end();
    }
  }
//**************************************************
  
}

void displayscanf (void) interrupt 1  //定时器0中断服务程序,用于数码管动态显示扫描
{    
  
  TH0=0XFC;
  TL0=0X18;
     P0=DATA_TEMP[i];
  i++;
  P3=digit;
  digit=_crol_(digit,1);  //动态显示时,依次选通数码管
  if (i>7)   //扫描完一圈后,回到第一位,准备下一次扫描
    {
      i=0;
   digit=0xfe;
    }
}

void timer_server (void) interrupt 5     //时钟走时定时
{

  TF2=0;
  t++;

}

start_time ()    //对时间初始化赋值,并更新DATA_TEMP数组里的数据
{
 DATA_TEMP[1]=LED_DATA[hour%10];   
 DATA_TEMP[0]=LED_DATA[hour/10];
 DATA_TEMP[4]=LED_DATA[min%10];
    DATA_TEMP[3]=LED_DATA[min/10];
   DATA_TEMP[7]=LED_DATA[sec%10];
   DATA_TEMP[6]=LED_DATA[sec/10];
}

key_adjust()    //调时函数
{
  if (k1==0)   //调时
   { 
      ET2=0;
      delay ();
   if (k1==0)
    {
      hour++;
   if (hour>23) hour=0;
   while (k1!=1); //等待按键释放,使每按一次,小时自动+1
    delay ();
    ET2=1; 
   start_time ();
     
    }
   }

   if (k2==0)    //调分
   { 
      ET2=0;
      delay ();
   if (k2==0)
    {
      min++;
   if (min>59) min=0;
   while (k2!=1); //等待按键释放,使每按一次,分钟自动+1
    delay ();
     ET2=1;
   start_time ();
      
    }
   }

   if (k3==0)   //调秒
   { 
      ET2=0;
      delay ();
   if (k3==0)
    {
      sec++;
   if (sec>59) sec=0;
   while (k3!=1);  //等待按键释放,使每按一次,秒数自动+1
    delay ();
    ET2=1; 
   start_time ();
      
    }
   }
}


void delay (void)   //延时,防止键抖动
{
 unsigned char data x,y;
 
 for (x=0;x<=30;x++)
  {
     for (y=0;y<=130;y++)
   {}
  }
  
}

void alarm (void)   //报警函数
{
   for (f=0;f<=3000;f++);
     beep=~beep;
 
 }

time_end (void)   //判断计时器是倒数是否数完(为0),如果是则停止计时,并报警
{
  
   
   alarm();
 
}



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

热门文章 更多
如何为单片机选择合适的负载电容