标题: 利用51单片机做时钟--对于初学者来说是一个很好的例子。 [打印本页]

作者: h333    时间: 2013-6-29 03:53
标题: 利用51单片机做时钟--对于初学者来说是一个很好的例子。

单片机做时钟,实现功能:
1、定时器一秒定时;
2、小时、分、秒显示 ;
3、按键设置时间,使用四个按键
步骤如下: 第一次按KEY-SET ,设置小时;第二次按KEY-SET ,设置分钟;第二次按KEY-SET ,设置秒。
     在设置过程中,按UP循环加1;按down循环减1;按KEY-ENTER退出设置。
4、按键设置时间时相应的位闪烁:设置”小时“时,小时闪烁 12.20.30                 
                                                  设置”分钟“时,分钟闪烁  12.20.30        
                                                  设置”秒“时,秒闪烁  12.20.30   
这里闪烁我用红色代替。   

我对51单片机的掌握还不是很熟练,有什么不懂和不足的地方还请大家多多指教。      
本来是想把proteus仿真图上传上来的,可是因为很少发帖 不知道怎么弄(请大侠指教啊),所以只有截图了,大家可以自己去画下这个图,难度不大。
对于51我们大家也是要多看,多写,多练,多调试,多动手才是硬道理。

作者: h333    时间: 2013-6-29 03:55
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key_set=P3^4;
sbit key_up=P3^5;
sbit key_down=P3^6;
sbit key_enter=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71,0x00};
uchar count,num,num1,hour,hour1,hour2,min,min1,min2,sec,sec1,sec2,shan;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}
void display(uchar hour,uchar min,uchar sec)
{
hour1=hour/10;
hour2=hour%10;
min1=min/10;
min2=min%10;
sec1=sec/10;
sec2=sec%10;
if(shan==1)
{
   if(count==1)
    {
     //TR0=0;
     hour1=16;
     hour2=16;
    }
    if(count==2)
    {
     //TR0=0;
     min1=16;
     min2=16;  
    }
    if(count==3)
    {
        //TR0=0;
        sec1=16;
     sec2=16;
    }
      if(key_enter==0)
      {
        count=0;
     shan=0;
     TR0=1;
      
      }

}
dula=1;
P0=table[hour1];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
dula=1;
P0=table[hour2]|0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
dula=1;
P0=table[min1];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
dula=1;
P0=table[min2]|0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
dula=1;
P0=table[sec1];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);
dula=1;
P0=table[sec2];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(1);
}
void keyscan()
{
if(key_set==0)   //key_set键的程序
{
  delayms(5);
  if(key_set==0)
  {

   count++;
     TR0=0;
   if(count==4)
         count=1;
      if(count<4)
      {
       TR1=1;
     
     shan=1;
      }
  while(!key_set)  
  display(hour,min,sec);
  }

}
if(key_up==0)
{
  delayms(5);
  if(key_up==0)
  {
   while(!key_up)
   display(hour,min,sec);
  
   if(count==1)
   {
    hour++;
    if(hour==24)
       hour=0;
   }
    if(count==2)
   {
    min++;
    if(min==60)
       min=0;
  
      }
    if(count==3)
   {
    sec++;
    if(sec==60)
       sec=0;
   }
        }
}

if(key_down==0)
{
  delayms(5);  
  if(key_down==0)
  {
    while(!key_down)
   display(hour,min,sec);
  
   if(count==1)
   {
    hour--;
    if(hour==255)
       hour=23;
   }
    if(count==2)
   {
    min--;
    if(min==255)
       min=59;
  
      }
    if(count==3)
   {
    sec--;
    if(sec==255)
       sec=59;
   }
        }
      }
   
   
if(key_enter==0)
{
  delayms(5);
  if(key_enter==0)
  {
      while(!key_enter)
   display(hour,min,sec);
   
   count=0;
      shan=0;
   TR0=1;
  /* TR1=0;
   TH0=(65536-46080)/256;
        TL0=(65536-46080)%256;*/      
  }
}
}
void init()
{
TMOD=0x11;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
TH1=(65536-46080)/256;
TL1=(65536-46080)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
}
void main()
{
init();
while(1)
{
  keyscan();
  display(hour,min,sec);
}
}

void T0_time() interrupt  1
{
  TH0=(65536-46080)/256;
  TL0=(65536-46080)%256;
num++;
if(num==20)
{
  num=0;
  sec++;
  if(sec==60)
  {
   sec=0;
   min++;
   if(min==60)
   {
    min=0;
    hour++;
    if(hour==24)
    hour=0;
   }
  }
}
}
void T1_time() interrupt 3  
{
TH1=(65536-46080)/256;
TL1=(65536-46080)%256;
num1++;
if(num1==10)
{      
  num1=0;
  shan=~shan;
}
}

作者: 波少    时间: 2013-7-1 11:50
好,,,主意
作者: bhjyqjs    时间: 2018-8-1 08:58
楼主真高手也,这么多语句,没一句有注释,时间长了你自己都看不懂吧?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1