找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5138|回复: 2
收起左侧

简易数字钟proteus仿真与单片机代码

[复制链接]
ID:407946 发表于 2018-10-11 10:34 | 显示全部楼层 |阅读模式
简易数字钟仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int         
  4. sbit s1=P2^0;                  //数码管位选控制端
  5. sbit s2=P2^1;
  6. sbit s3=P2^2;
  7. sbit s4=P2^3;
  8. sbit s5=P2^4;
  9. sbit s6=P2^5;
  10. sbit s7=P2^6;
  11. /*k1设置时间,k2定时。k1,k2使用不自动弹起按键。
  12. k3时分秒选择,k4加数字,k5减数字。*/
  13. sbit k1=P1^0;         
  14. sbit k2=P1^1;
  15. sbit k3=P1^2;
  16. sbit k4=P1^3;
  17. sbit k5=P1^4;
  18. uchar count=0,sec,min,hour,ss=0;s=60,m=60,h=24;
  19. uchar code mum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0-9编码
  20. void delayms(uint k)           //延时函数
  21. {
  22.         uint i,j;
  23.         for(i=k;i>0;i--)
  24.                 for(j=110;j>0;j--);
  25. }
  26. /*通过count获得hour,min,sec变量值        */
  27. void timecontrol()      
  28. {
  29.         sec++;
  30.         if(sec==60)
  31.         {
  32.                 sec=0;
  33.                 min++;
  34.                 if(min==60)
  35.                 {
  36.                         min=0;
  37.                         hour++;
  38.                         if(hour==24)
  39.                         hour=0;
  40.                 }
  41.         }
  42. }
  43. void display(uchar zs,uchar zm, uchar zh)                        //数码管显示函数
  44. {         
  45.   s1=1;
  46.   P0=mum[zh/10];
  47.   delayms(5);
  48.   s1=0;
  49.    
  50.   s2=1;
  51.   P0=mum[zh%10]&0x7f;           // 时的个位加上小数点
  52.   delayms(5);
  53.   s2=0;
  54.    
  55.   s3=1;
  56.   P0=mum[zm/10];      
  57.   delayms(5);
  58.   s3=0;
  59.   
  60.   s4=1;
  61.   P0=mum[zm%10]&0x7f;                //分的个位加上小数点
  62.   delayms(5);
  63.   s4=0;
  64.    
  65.   s5=1;
  66.   P0=mum[zs/10];
  67.   delayms(5);
  68.   s5=0;
  69.    
  70.   s6=1;      
  71.   P0=mum[zs%10];
  72.   delayms(5);
  73.   s6=0;
  74. }
  75. void keyscan_settime()                  //时间设置模块
  76. {
  77.         uchar st,mt,ht;
  78.         if(k1==0)
  79.         {
  80.                 delayms(10);
  81.                 if(k1==0)
  82.                 {
  83.                 st=sec,mt=min,ht=hour;
  84.                 TR0=0;                 //关闭定时器
  85.                 while(k1==0)         //等待用户按键
  86.                 {
  87.                         display(st,mt,ht);                       
  88.                         if(k3==0)
  89.                         {
  90.                                 delayms(10);
  91.                                 if(k3==0)         
  92.                                 {
  93.                                 while(!k3);
  94.                                 ss++;
  95.                                 if(ss==3)        ss=0;
  96.                                 }
  97.                         }
  98.                         /*通过ss选择时分秒设置*/
  99.                         if(k4==0)                //加数
  100.                                 {
  101.                                          delayms(10);
  102.                                         if(k4==0)
  103.                                         {
  104.                                         while(!k4);
  105.                                         switch(ss)
  106.                                         {
  107.                                         case 0:st++;if(st==60)st=0;break;
  108.                                         case 1:mt++;if(mt==60)mt=0;break;
  109.                                         case 2:ht++;if(ht==24)ht=0;break;      
  110.                                         default :;                                               
  111.                                         }
  112.                                         }      
  113.                                 }
  114.                         if(k5==0)                //减数
  115.                                 {
  116.                                          delayms(10);
  117.                                         if(k5==0)
  118.                                         {
  119.                                         while(!k5);
  120.                                         switch(ss)
  121.                                         {
  122.                                         case 0:if(st>0)st--;
  123.                                                         else        st=0;break;
  124.                                         case 1:if(mt>0)mt--;
  125.                                                         else        mt=0;break;
  126.                                         case 2:if(ht>0)ht--;
  127.                                                         else        ht=0;break;      
  128.                                         default : ;
  129.                                         }                                                                                                                                       
  130.                                         }      
  131.                                 }
  132.                                 }
  133.                         TR0=1;
  134.                         sec=st,min=mt,hour=ht;                                                      
  135.                         }                                               
  136.                 }               
  137.                 display(sec,min,hour);
  138. }
  139. void keyscan_time()                //用户定时模块
  140. {
  141.         if(k2==0)
  142.         {
  143.                 delayms(10);               
  144.                 if(k2==0)
  145.                 {
  146.                 s=sec;m=min;h=hour;

  147.                 while(k2==0)         //开始定时设置
  148.                 {
  149.                         display(s,m,h);
  150.                         if(k3==0)
  151.                         {
  152.                                 delayms(10);
  153.                                 if(k3==0)         
  154.                                 {
  155.                                 while(!k3);
  156.                                 ss++;
  157.                                 if(ss==3)        ss=0;
  158.                                 }
  159.                         }
  160.                         /*通过ss选择时分秒设置*/
  161.                         if(k4==0)                //加数
  162.                                 {
  163.                                          delayms(10);
  164.                                         if(k4==0)
  165.                                         {
  166.                                         while(!k4);
  167.                                         switch(ss)
  168.                                         {
  169.                                         case 0:s++;if(s==60)s=0;break;
  170.                                         case 1:m++;if(m==60)m=0;break;
  171.                                         case 2:h++;if(h==24)h=0;break;      
  172.                                         default :;                                               
  173.                                         }
  174.                                         }      
  175.                                 }
  176.                         if(k5==0)                //减数
  177.                                 {
  178.                                          delayms(10);
  179.                                         if(k5==0)
  180.                                         {
  181.                                         while(!k5);
  182.                                         switch(ss)
  183.                                         {
  184.                                         case 0:if(s>0)s--;
  185.                                                         else        s=0;break;
  186.                                         case 1:if(m>0)m--;
  187.                                                         else        m=0;break;
  188.                                         case 2:if(h>0)h--;
  189.                                                         else        h=0;break;      
  190.                                         default : ;
  191.                                         }                                                                                                                                                }      
  192.                                         }
  193.                                 }                                               
  194.                         }
  195.         }
  196. }
  197. void buz()
  198. {
  199. if((hour==h)&&(min==m)&&(sec==s))
  200.         {
  201.         s7=0;
  202.         delayms(40);
  203.         s7=1;
  204.                 delayms(40);
  205.         }
  206. }
  207. void zhengdian()
  208. {
  209. uchar i=0;
  210. if((sec==0)&(min==0))
  211.   {
  212.    for(i=0;i<10;i++)
  213.     {
  214.      TR0=1;
  215.      buz();
  216.      delayms(20);
  217.     }
  218.   }
  219. }
  220. void main()
  221. {
  222.         TMOD=0x01;                                //定时器0工作在方式1
  223.         TH0=(65536-45872)/256;           //装初值,50ms
  224.         TL0=(65536-45872)%256;
  225.         EA=1;                  //总中断允许
  226.         ET0=1;                 //T0中断允许
  227.         TR0=1;                 //开定时器0
  228.         while(1)
  229.         {
  230.                 keyscan_settime();
  231.                 keyscan_time();      
  232.                 buz();
  233.                                 zhengdian();      
  234.         }
  235. }
  236. void T0_ms() interrupt 1          //中断入口程序
  237. {
  238.         TH0=(65536-45872)/256;                //重新装初值
  239.         TL0=(65536-45872)%256;
  240.         count++;
  241.         if(count==20)                 //判定1s时间是否已到
  242.         {
  243.                 count=0;
  244.                 timecontrol();
  245.         }
  246. }
复制代码

所有资料51hei提供下载:
简易数字钟.rar (126.3 KB, 下载次数: 87)

评分

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

查看全部评分

回复

使用道具 举报

ID:746940 发表于 2020-7-8 17:41 | 显示全部楼层
您好这个程序有没有闹钟功能?
回复

使用道具 举报

ID:971637 发表于 2021-10-19 16:47 | 显示全部楼层
这个功能有些啥?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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