找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4186|回复: 3
收起左侧

利用51单片机做时钟--对于初学者来说是一个很好的例子。

[复制链接]
ID:50574 发表于 2013-6-29 03:53 | 显示全部楼层 |阅读模式
215750rm6rqlejro6p6qqe.jpg
单片机做时钟,实现功能:
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我们大家也是要多看,多写,多练,多调试,多动手才是硬道理。
回复

使用道具 举报

ID:50574 发表于 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;
}
}
回复

使用道具 举报

ID:50813 发表于 2013-7-1 11:50 | 显示全部楼层
好,,,主意
回复

使用道具 举报

ID:66287 发表于 2018-8-1 08:58 | 显示全部楼层
楼主真高手也,这么多语句,没一句有注释,时间长了你自己都看不懂吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表