找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2117|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机6个数码管显示的数字钟程序

[复制链接]
跳转到指定楼层
楼主
这是我上个月写的,因为第一次写所以挑了个简单的数字钟练下手。
附件里包含代码和仿真图。



单片机源程序如下:
  1. #include<reg51.h>
  2. sbit no_off = P1^0;                //该按键用于暂停计时,设置时间
  3. sbit select = P1^1;                //该按键选择调秒,分钟,还是调小时,上电默认选择秒
  4. sbit add = P1^2;                        //该按键往上调
  5. sbit sub = P1^3;                        //该按键往下调
  6. sbit set = P1^4;                        //该按键用于设置闹钟
  7. sbit led = P3^1;                        //设置了闹钟,该指示灯亮,否则不亮
  8. sbit beep = P3^7;                        //用于设置闹钟

  9. unsigned char state = 0;                 //匹配选择调秒、调分或者调时的状态
  10. unsigned char hour = 0;
  11. unsigned char min = 0;
  12. unsigned char sec = 0;
  13. unsigned char set_hour=0;
  14. unsigned char set_min=0;
  15. unsigned char count = 0;
  16. unsigned char num=0;                        //该变量用来设置led闪烁,定时时间到,led闪烁1秒钟
  17. unsigned char disp[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};                //共阳数码管字形码

  18. void delay(unsigned int k);
  19. void scan(void);
  20. void alarm(void);
  21. void display(void);

  22. void main(void)
  23. {
  24.        
  25.         TMOD=0x11;
  26.         TH0=(65535-50000)/256;
  27.         TL0=(65535-50000)%256;
  28.         TH1=(65535-500)/256;
  29.         TL1=(65535-500)%256;
  30.         EA=1;
  31.         ET0=1;
  32.         ET1=1;
  33.         TR0=1;
  34.         TR1=0;
  35.         led=1;
  36.         while(1)
  37.         {
  38.                 scan();
  39.                 display();
  40.         }
  41. }

  42. void delay(unsigned int k)                //延时
  43. {
  44.         unsigned int i;
  45.         for(i=0;i<k;i++);
  46. }

  47. void scan(void)                                                        //按键扫描
  48. {
  49.         if(no_off==0)
  50.         {
  51.                 delay(1200);
  52.                 if(no_off==0) {TR0=~TR0;}
  53.                 while(!no_off);
  54.         }
  55.         if(select==0)
  56.         {
  57.                 delay(1200);
  58.                 if(select==0)
  59.                 {
  60.                         state++;
  61.                         if(state==3) state=0;
  62.                 }
  63.                 while(!select);
  64.         }
  65.   if(add==0)
  66.         {
  67.                 delay(1200);
  68.                 if(add==0)
  69.                 {
  70.                         switch(state)
  71.                         {
  72.                         case 0:{ sec++; if(sec==60) sec=0;break;}
  73.                         case 1:{ min++; if(min==60) min=0;break;}
  74.                         case 2:{ hour++; if(hour==24) hour=0;break;}
  75.                         default :        ;
  76.                         }       
  77.                 }
  78.                 while(!add);
  79.         }
  80.         if(sub==0)
  81.         {
  82.                 delay(1200);
  83.                 if(sub==0)
  84.                 {       
  85.                         switch(state)
  86.                         {
  87.                         case 0:{ sec--; if(sec==255) sec=59;break;}
  88.                         case 1:{ min--; if(min==255) min=59;break;}
  89.                         case 2:{ hour--; if(hour==255) hour=23;break;}
  90.                         default :        ;
  91.                         }
  92.                 }
  93.                 while(!sub);
  94.         }
  95.         if(set==0)
  96.         {
  97.                 delay(1200);                        //消抖
  98.                 if(set==0)
  99.                 {
  100.                         led=~led;
  101.                         set_hour=hour;        //设置闹钟的小时
  102.                         set_min=min;                //设置闹钟的分钟
  103.                         while(!set);                //等待按键释放
  104.                 }
  105.         }
  106. }

  107. void display(void)                //数码管扫描显示函数
  108. {
  109.         unsigned char i;
  110.         for(i=0;i<6;i++)
  111.         {
  112.                 switch(i)
  113.                 {
  114.                         case 0: {P0=disp[hour/10];P2=0x01;break;}
  115.                         case 1: {P0=disp[hour%10];P2=0x02;break;}
  116.                         case 2: {P0=disp[min/10];P2=0x04;break;}
  117.                         case 3: {P0=disp[min%10];P2=0x08;break;}
  118.                         case 4: {P0=disp[sec/10];P2=0x10;break;}
  119.                         case 5: {P0=disp[sec%10];P2=0x20;break;}
  120.                 }
  121.                 delay(200);
  122.                 P0=0xff;                        //消隐
  123.         }
  124. }

  125. void time(void) interrupt 1                //定时1s
  126. {
  127.         EA=0;TR0=0;
  128.         TH0=(65535-50000)/256;
  129.         TL0=(65535-50000)%256;
  130.         count++;
  131.         if(count==20)
  132.         {
  133.                 count=0;
  134.                 sec++;
  135.                 if(sec==60)
  136.                 {
  137.                         sec=0;
  138.                         min++;
  139.                         if(min==60)
  140.                         {
  141.                                 min=0;
  142.                                 hour++;
  143.                                 if(hour==24)
  144.                                 {
  145.                                         hour=0;
  146.                                 }
  147.                         }
  148.                 }
  149.         }
  150.                 if((min==set_min)&&(hour==set_hour)&&(led==0)&&(TR0=1)) TR1=1;                        //时间到,闹钟响
  151.                 if((min==set_min+1)&&(hour==set_hour)) {TR1=0;led=1;}                                                                //闹钟响一分钟后关闭,同时关闭指示灯
  152.                 EA=1;TR0=1;
  153. }

  154. void alarm() interrupt 3                //闹钟响应
  155. {
  156.         EA=0;TR1=0;
  157.         TH1=(65535-500)/256;
  158.         TL1=(65535-500)%256;
  159.         beep=~beep;
  160.         num++;
  161.         if(num==250)
  162.         {
  163.                 num=0;
  164.                 led=~led;                                                        //led灯闪烁
  165.         }
  166.         EA=1;TR1=1;
  167. }
复制代码

Keil代码下载:
数字钟.zip (92.47 KB, 下载次数: 31)


评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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