找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的电子时钟proteus仿真设计

[复制链接]
跳转到指定楼层
楼主
有proteus的仿真,还有源程序。
有兴趣的朋友可以一起学习!!


单片机源程序如下:
  1. #include <reg52.h>
  2. #include "ds1302.h"
  3. #include "key.h"

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. bit WATCH_TIME=1;        //数码管显示时间标志位,默认情况下显示时间
  7. bit WATCH_DATE=0;        //数码管显示日期标志位
  8. bit SET_TIME=0;            //数码管显示调时时的在调时间
  9. bit SET_DATE=0;                //数码管显示在调日期
  10. bit SET_CLOK=0;                //数码管显示在调闹钟的数值
  11. bit CLK;                        //开闹钟标志位

  12. sbit led=P2^1;
  13. sbit wela=P2^2;
  14. sbit dula=P2^3;
  15. sbit beef=P2^4;
  16. sbit tom=P2^0;

  17. //uchar tab_date[14]="2012-11-06 TUE";//表示年月日星期
  18. //uchar tab_time[8]="00:00:00";//表示时分秒
  19. uchar tab_t[6],tab_c[6],tab_d[6],date[6],time[6];         //用来显示调节时间、闹钟、日期时显示相应数据
  20. uchar tiao,second;//调时或设置闹钟时,相应的时分秒跳动
  21. uchar code tabdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*共阴极数*/
  22. uchar code tabwe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  23. uchar keyval,tiao=2;
  24. uchar hour,min,sec;
  25. uchar year,month,day;
  26. uchar clkh,clkm,clks;

  27. void delay(uint t)
  28. {
  29.         uint x,y;
  30.         for(x=0;x<t;x++)
  31.                 for(y=0;y<40;y++);
  32. }
  33. //------------------------------------------
  34. //              数据转换
  35. //------------------------------------------
  36. void trans()
  37. {
  38.          date[0]=tab_1302[6]/10;     //年十位
  39.          date[1]=tab_1302[6]%10;     //年个位
  40.          date[2]=tab_1302[4]/10;     //月十位
  41.          date[3]=tab_1302[4]%10;     //月个位
  42.          date[4]=tab_1302[3]/10;     //日十位
  43.          date[5]=tab_1302[3]%10;     //日个位
  44.        
  45.          time[0]=tab_1302[2]/10;     //小时十位
  46.          time[1]=tab_1302[2]%10;     //小时个位
  47.          time[2]=tab_1302[1]/10;     //分十位
  48.          time[3]=tab_1302[1]%10;     //分个位
  49.          time[4]=tab_1302[0]/10;     //秒十位
  50.          time[5]=tab_1302[0]%10;     //秒个位
  51. }
  52. void Getval(uchar hour1,uchar min1,uchar sec1)
  53. {
  54.         tab_t[0]=hour1/10;
  55.         tab_t[1]=hour1%10;
  56.         tab_t[2]=min1/10;
  57.         tab_t[3]=min1%10;
  58.         tab_t[4]=sec1/10;
  59.         tab_t[5]=sec1%10;
  60. }
  61. void Getdate(uchar year1,uchar month1,uchar day1)
  62. {
  63.         tab_d[0]=year1/10;
  64.         tab_d[1]=year1%10;
  65.         tab_d[2]=month1/10;
  66.         tab_d[3]=month1%10;
  67.         tab_d[4]=day1/10;
  68.         tab_d[5]=day1%10;
  69. }
  70. void clkinit()
  71. {
  72.         tab_c[0]=2;
  73.         tab_c[1]=4;
  74.         tab_c[2]=0;
  75.         tab_c[3]=0;
  76.         tab_c[4]=0;
  77.         tab_c[5]=0;
  78. }
  79. void Getclok()
  80. {
  81.         tab_c[0]=clkh/10;
  82.         tab_c[1]=clkh%10;
  83.         tab_c[2]=clkm/10;
  84.         tab_c[3]=clkm%10;
  85.         tab_c[4]=clks/10;
  86.         tab_c[5]=clks%10;
  87. }
  88. void dsptime()          //显示实时时间
  89. {
  90.         uchar i;
  91.         led=0;
  92.         for(i=0;i<6;i++)
  93.         {
  94.                 P3=tabwe[i];
  95.                 P0=tabdu[time[i]];               
  96.                 delay(5);
  97.         }
  98. }

  99. void dspdate()        //显示日期
  100. {       
  101.         uchar i;
  102.         led=1;
  103.         for(i=0;i<6;i++)       
  104.         {       
  105.                 P3=tabwe[i];
  106.                 P0=tabdu[date[i]];               
  107.                 delay(5);
  108.         }       
  109. }
  110. void setdisp(uchar tab_set[])  //数码管显示当前设置相应的数值并跳动
  111. {
  112.         uchar i;
  113.         for(i=0;i<6;i++)
  114.         {       
  115.                 switch(tiao)
  116.                 {
  117.                         case 0:if(i==0||i==1)
  118.                                         {
  119.                                                 if(second<8)
  120.                                                 {       
  121.                                                         P3=tabwe[i];
  122.                                                         P0=tabdu[tab_set[i]];
  123.                                                                        
  124.                                                 }
  125.                                         }
  126.                                         else
  127.                                         {
  128.                                                 P3=tabwe[i];
  129.                                                 P0=tabdu[tab_set[i]];
  130.                                                
  131.                                         }break;
  132.                         case 1:if(i==2||i==3)
  133.                                         {
  134.                                                 if(second<8)
  135.                                                 {
  136.                                                          P3=tabwe[i];
  137.                                                         P0=tabdu[tab_set[i]];                                       
  138.                                                 }
  139.                                         }
  140.                                         else
  141.                                         {       
  142.                                                 P3=tabwe[i];
  143.                                                 P0=tabdu[tab_set[i]];                                               
  144.                                         }break;
  145.                         case 2:if(i==4||i==5)
  146.                                         {
  147.                                                 if(second<8)
  148.                                                 {       
  149.                                                         P3=tabwe[i];
  150.                                                         P0=tabdu[tab_set[i]];
  151.                                                                        
  152.                                                 }
  153.                                         }
  154.                                         else
  155.                                         {       
  156.                                                 P3=tabwe[i];
  157.                                                 P0=tabdu[tab_set[i]];
  158.                                                
  159.                                         }break;
  160.                 }
  161.                 delay(5);
  162.         }
  163. }
  164. void settime()         //设置时间
  165. {
  166.         SET_TIME=1;
  167.         SET_DATE=0;
  168.         WATCH_TIME=0;
  169.         hour=time[0]*10+time[1];
  170.         min=time[2]*10+time[3];
  171.         sec=time[4]*10+time[5];
  172.         while(1)
  173.         {
  174.                 keyval=Getkey();
  175.                 switch(keyval)
  176.                 {
  177.                         case KEY_MU:tiao++;tiao=tiao%3;break;        //调时
  178.                         case KEY_UP:if(tiao==0){hour++;if(hour==24) hour=0;}
  179.                                                 if(tiao==1){min++;if(min==60) min=0;}
  180.                                                 if(tiao==2){sec++;if(sec==60) sec=0;};
  181.                                                 break;
  182.                         case KEY_DN:if(tiao==0){hour--;if(hour==255) hour=23;}
  183.                                                 if(tiao==1){min--;if(min==255) min=59;}
  184.                                                 if(tiao==2){sec--;if(sec==255) sec=59;};
  185.                                                 break;
  186.                         case KEY_OK:tab1_1302[2]=hour;tab1_1302[1]=min;tab1_1302[0]=sec;ds1302_init();SET_TIME=0;WATCH_TIME=1;tiao=1;return;break;
  187.                         case KEY_BK:SET_TIME=0;WATCH_TIME=1;tiao=1;return;
  188.                        
  189.                 }       
  190.         }
  191. }
  192. void setdate()         //设置日期
  193. {
  194.         uchar keyval;
  195.         SET_TIME=0;
  196.         SET_DATE=1;
  197.         WATCH_DATE=0;
  198.         year=date[0]*10+date[1];
  199.         month=date[2]*10+date[3];
  200.         day=date[4]*10+date[5];
  201.         while(1)
  202.         {
  203.                 keyval=Getkey();
  204.                 switch(keyval)
  205.                 {
  206.                         case KEY_MU:tiao++;tiao=tiao%3;break;
  207.                         case KEY_UP:if(tiao==0){year++;if(year==100) year=0;}
  208.                                                 if(tiao==1){month++;if(month==13) month=0;}
  209.                                                 if(tiao==2){day++;if(day==32) day=0;};
  210.                                                 break;
  211.                         case KEY_DN:if(tiao==0){year--;if(year==255) year=99;}
  212.                                                 if(tiao==1){month--;if(month==0) month=12;}
  213.                                                 if(tiao==2){day--;if(day==0) day=31;};
  214.                                                 break;
  215.                         case KEY_OK:tab1_1302[6]=year;tab1_1302[4]=month;tab1_1302[3]=day;
  216.                                                 ds1302_init();SET_DATE=0;WATCH_TIME=1;tiao=2;led=0;return;
  217.                                                 break;
  218.                         case KEY_BK:SET_DATE=0;WATCH_TIME=1;tiao=2;led=0;return;
  219.                        
  220.                 }       
  221.         }       
  222. }
  223. void setclok()        //设置闹钟
  224. {       
  225.         clkh=tab_c[0]*10+tab_c[1];
  226.         clkm=tab_c[2]*10+tab_c[3];
  227.         clks=tab_c[4]*10+tab_c[5];
  228.         SET_CLOK=1;
  229.         tiao=0;
  230.         while(1)
  231.         {
  232.                 keyval=Getkey();
  233.                 switch(keyval)
  234.                 {
  235.                         case KEY_MU:tiao++;tiao=tiao%2;break;
  236.                         case KEY_UP:if(tiao==0){clkh++;if(clkh>=24) clkh=0;}
  237.                                                 if(tiao==1){clkm++;if(clkm==60) clkm=0;};
  238.                                                 break;
  239.                         case KEY_DN:if(tiao==0){clkh--;if(clkh==255) clkh=23;}
  240.                                                 if(tiao==1){clkm--;if(clkm==255) clkm=59;};
  241.                                                 break;
  242.                         case KEY_OK:SET_CLOK=0;WATCH_TIME=1;CLK=1;tiao=1;return;break;
  243.                         case KEY_BK:clkh=24;clkm=0;clks=0;SET_CLOK=0;CLK=0;WATCH_TIME=1;tiao=1;return;
  244.                        
  245.                 }
  246.         }
  247. }
  248. void smg()       
  249. {
  250.         if(WATCH_TIME)
  251.                 dsptime();         //显示时间
  252.         else if(WATCH_DATE)       
  253.                 dspdate();        //显示日期
  254.         else if(SET_TIME)       
  255.         {       
  256.                 Getval(hour,min,sec);
  257.                 setdisp(tab_t);        //显示在调时间
  258.         }
  259.         else if(SET_DATE)
  260.         {
  261.                 Getdate(year,month,day);
  262.                 setdisp(tab_d);        //显示在调日期
  263.         }
  264.         else if(SET_CLOK)
  265.         {
  266.                 Getclok();
  267.                 setdisp(tab_c);        //显示在调闹钟
  268.         }  
  269. }
  270. void dealkey(uchar key)
  271. {
  272.         switch(key)
  273.         {
  274.                 case KEY_MU:if(WATCH_DATE)
  275.                                         {
  276.                                                 led=1;
  277.                                                 setdate();
  278.                                         }
  279.                                         else
  280.                                                 settime();
  281.                                         break;
  282.                 case KEY_CK:WATCH_TIME=0;WATCH_DATE=0;setclok();break;
  283.                 case KEY_TD:WATCH_TIME=~WATCH_TIME;WATCH_DATE=~WATCH_DATE;break;//时间与日期的切换
  284.         }
  285. }
  286. void feng()//闹钟
  287. {

  288.         if(clkh==tab_1302[2]&&clkm==tab_1302[1])
  289.                 tom=0;
  290.         if(KEY_CK==Getkey())
  291.         {
  292.                 tom=1;
  293.                 CLK=0;
  294.         }
  295. }
  296. void main()
  297. {
  298.         uchar num;
  299.         TMOD=0X01; //T0工作方式1
  300.         TH0=(65536-10000)/256;
  301.         TL0=(65536-10000)%256;         //10毫秒中断一次
  302.         EA=1;
  303. ……………………

  304. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于单片机的电子时钟仿真.7z (43.07 KB, 下载次数: 71)


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

使用道具 举报

沙发
ID:228634 发表于 2017-8-21 16:01 | 只看该作者
小白来学习一下,谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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