找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字时钟Proteus仿真设计,可调时

[复制链接]
跳转到指定楼层
楼主
这是单片机数字钟课程设计,用了一个星期的时间,附件里面包含数字钟的单片机源代码,proteus仿真工程文件都是自己原创的,请大家多多指教。
会切换显示年月日,星期闹钟显示

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. unsigned char code dis_tab[16]=
  4.             {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳极0-916进制编码
  5. unsigned char data dis_data1,dis_data2,bit_data1,bit_data2,a1,a2,a11,a22,b1,b2,b11,b22,nian=16,yue=2,ri=27,miao=5,fen=0,shi=0,xq=0;
  6.   unsigned char int_cnt=0;
  7.   unsigned char num;
  8. unsigned char a;
  9.             unsigned char b;sbit K0=P0^0;
  10.                 sbit K1=P0^1;
  11.            sbit K2=P0^2;
  12.          sbit K3=P0^3;
  13.          
  14. void mDelay(unsigned int Delay)         //延时函数
  15. { unsigned int i;
  16. for(;Delay>0;Delay--)
  17. { for(i=0;i<114;i++) {;}}}       
  18. void T0_int() interrupt 1
  19. {          

  20.   TH0=(65536-50000)/256;  
  21.     TL0=(65536-50000)%256;
  22.          int_cnt++;       
  23.         if(int_cnt==16)
  24.         {num++;int_cnt=0;
  25.         }
  26.         if(num==60)
  27.         {num=0;int_cnt=0;
  28.         a++;         }
  29.          if(a==60)
  30.         {a=0;b++; b<=24;
  31.           if(b==24)
  32. b=0; if(b==0)
  33. {ri++;}
  34.   }       
  35.   if(ri==7)
  36.   {xq++;}
  37.                    
  38.         if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
  39.    {ri<=31;       
  40.    if(ri==32){ri=1; yue++;}         
  41.    }
  42.     if (yue==4||yue==6||yue==9||yue==11)
  43.    {ri<=31;
  44.    if(ri==31){ri=1;yue++;
  45.    } }
  46.    if(yue==2&&((nian+2000)%4==0&&(nian+2000)%100!=0)||(nian+2000)%400==0)
  47.         {ri<=30;if(ri==30){ri=1;yue++;}}
  48. else if        (yue==2)
  49. {ri<=29;if(ri==29){ri=1;yue++;}}       
  50.        
  51.    if(yue==13)
  52.    {yue=1;if(yue==1)
  53.    {nian++;}}
  54.              if(K1==1) //K0按键是否按下
  55. { mDelay(5); //延时消抖
  56. if(K1==1)
  57. {P2=0x00;
  58. mDelay(10);
  59. a++;
  60. mDelay(2);}}
  61. if(K0==1&&K1==1)
  62. {mDelay(5);
  63.   if(K0==1&&K1==1)
  64.   {         P2=0x00;
  65. mDelay(10);
  66. ri++;
  67. a--;
  68. mDelay(2);
  69.   }}
  70.   if(K0==1&&K2==1) //K0按键是否按下
  71. { mDelay(5); //延时消抖
  72. if(K0==1&&K2==1)
  73. {P2=0x00;
  74. mDelay(10);
  75.    yue++;

  76. mDelay(2);}}
  77.     if(K0==1&&K3==1) //K0按键是否按下
  78. { mDelay(5); //延时消抖
  79. if(K0==1&&K3==1)
  80. {P2=0x00;
  81. mDelay(10);
  82.    nian++;
  83.         b--;
  84. mDelay(2);}}
  85. if(K3==1)
  86.   {mDelay(5);
  87.   {if(K3==1);
  88.   b++;

  89.         }
  90.   }
  91.          if(K2==1)
  92.   {mDelay(5);
  93.   if(K2==1)
  94.   {         mDelay(5);
  95.   
  96.   bit_data1=0x01;
  97. bit_data2=0x02;
  98.   P2 = 0x00;
  99.   dis_data2=miao/10;
  100.     dis_data1=miao%10;
  101. P1= dis_tab[dis_data1];                    //将显示的个位的段码送段码口
  102. P2 = bit_data1;                        //将位选码送位选码口
  103. mDelay(5);       
  104.         P2 = 0x00;           //熄灭数码管
  105. P1 = dis_tab[dis_data2];                         //将显示的十位的段码送段码口
  106. P2 =bit_data2;
  107. mDelay(10);
  108. a1=0x04;
  109. a2=0x08;   
  110. P2 = 0x00;
  111. a22=fen/10;
  112.   a11=fen%10;
  113. P1= dis_tab[a11];                    //将显示的个位的段码送段码口
  114. P2 = a1;
  115. mDelay(5 );       
  116.         P2 = 0x00;           //熄灭数码管
  117. P1 = dis_tab[a22];                         //将显示的十位的段码送段码口
  118. P2 =a2;
  119. mDelay(10);
  120.   b1=0x10;
  121. b2=0x20;
  122.   P2 = 0x00;
  123.          
  124.   b22=shi/10;
  125. b11=shi%10;
  126. P1= dis_tab[b11];                    //将显示的个位的段码送段码口
  127. P2 =b1;                        //将位选码送位选码口
  128. mDelay(5 );       
  129.         P2 = 0x00;           //熄灭数码管
  130. P1 = dis_tab[b22];                         //将显示的十位的段码送段码口
  131. P2 =b2;
  132. mDelay(10);        }
  133. while(K2==0){break;}
  134. }
  135. if(K2==1&&K3==1)
  136. { mDelay(5);
  137. if(K2==1&&K3==1)
  138. {
  139. mDelay(10);

  140. fen++;
  141. b--;
  142. }}         
  143. if(K2==1&&K1==1)
  144. {mDelay(5);
  145. if(K2==1&&K1==1)
  146. {  
  147.   mDelay(10);
  148. a--;
  149. mDelay(5) ;
  150. shi++;

  151. }
  152. }

  153.          
  154.         if(num==miao&&a==fen&&b==shi)
  155.   {
  156.   
  157. P3=0x00;
  158.    mDelay(27);

  159.   
  160.   }
  161.    if(K0==1&&K1==1&&K2==1)
  162.    {   shi--;
  163.    yue--;
  164.   
  165.   
  166.    
  167.    
  168.     bit_data1=0x01;
  169. bit_data2=0x02;
  170.   P2 = 0x00;
  171.   dis_data2=xq/10;
  172.     dis_data1=xq%10;
  173. P1= dis_tab[dis_data1];                    //将显示的个位的段码送段码口
  174. P2 = bit_data1;                        //将位选码送位选码口
  175. mDelay(5);       
  176.         P2 = 0x00;           //熄灭数码管
  177. P1 = dis_tab[dis_data2];                         //将显示的十位的段码送段码口
  178. P2 =bit_data2;
  179. mDelay(10);
  180.    
  181.    }
  182.   
  183.   
  184.    
  185. }




  186. void display()
  187. {        


  188.   
  189.   







  190.        


  191.   if(K0==0){
  192.   bit_data1=0x01;
  193. bit_data2=0x02;
  194.   P2 = 0x00;
  195.   dis_data2=num/10;
  196.     dis_data1=num%10;
  197. P1= dis_tab[dis_data1];                    //将显示的个位的段码送段码口
  198. P2 = bit_data1;                        //将位选码送位选码口
  199. mDelay(5);       
  200.         P2 = 0x00;           //熄灭数码管
  201. P1 = dis_tab[dis_data2];                         //将显示的十位的段码送段码口
  202. P2 =bit_data2;
  203. mDelay(10);
  204. a1=0x04;
  205. a2=0x08;   
  206. P2 = 0x00;
  207. a22=a/10;
  208.   a11=a%10;
  209. P1= dis_tab[a11];                    //将显示的个位的段码送段码口
  210. P2 = a1;
  211. mDelay(5 );       
  212.         P2 = 0x00;           //熄灭数码管
  213. P1 = dis_tab[a22];                         //将显示的十位的段码送段码口
  214. P2 =a2;
  215. mDelay(10);
  216.   b1=0x10;
  217. b2=0x20;
  218.   P2 = 0x00;
  219.          
  220.   b22=b/10;
  221. b11=b%10;
  222. P1= dis_tab[b11];                    //将显示的个位的段码送段码口
  223. P2 =b1;                        //将位选码送位选码口
  224. mDelay(5 );       
  225.         P2 = 0x00;           //熄灭数码管
  226. P1 = dis_tab[b22];                         //将显示的十位的段码送段码口
  227. P2 =b2;
  228. mDelay(10);
  229.         }

  230. else
  231. {
  232.   bit_data1=0x01;
  233. bit_data2=0x02;
  234. P2=0x00;
  235.   dis_data2=ri/10;
  236.     dis_data1=ri%10;
  237. P1= dis_tab[dis_data1];                    //将显示的个位的段码送段码口
  238. P2 = bit_data1;                        //将位选码送位选码口
  239. mDelay(5 );       
  240.         P2 = 0x00;           //熄灭数码管
  241. P1 = dis_tab[dis_data2];                         //将显示的十位的段码送段码口
  242. P2 =bit_data2;
  243. mDelay(10);                  

  244. a1=0x04;
  245. a2=0x08;   
  246. P2 = 0x00;
  247.    
  248. a22=yue/10;
  249.   a11=yue%10;

  250. P1= dis_tab[a11];                    //将显示的个位的段码送段码口
  251. P2 = a1;
  252. mDelay(5 );       
  253.         P2 = 0x00;           //熄灭数码管
  254. P1 = dis_tab[a22];                         //将显示的十位的段码送段码口
  255. P2 =a2;
  256.    
  257. mDelay(10);
  258.   b1=0x10;
  259. b2=0x20;
  260.   P2 = 0x00;
  261.   b22=nian/10;
  262. b11=nian%10;
  263. P1= dis_tab[b11];                    //将显示的个位的段码送段码口
  264. P2 =b1;                        //将位选码送位选码口
  265. mDelay(5 );       
  266.         P2 = 0x00;           //熄灭数码管
  267. P1 = dis_tab[b22];                         //将显示的十位的段码送段码口
  268. P2 =b2;
  269. mDelay(10);
  270. while(!K0){break;}  //等待K0按键释放
  271. }
  272.   









  273. }          


  274.           


  275. void main()
  276. {       
  277.     TMOD=0X01;      /*中断初始化*/
  278.     TH0=(65536-50000)/256;  
  279.     TL0=(65536-50000)%256;
  280.     EA=1;               //中断总开关
  281.     ET0=1;              //请求中断
  282.     TR0=1;              //允许中断
  283.          int_cnt=0;
  284.          
  285.     while(1)
  286.     {                 //关闭其他位                       
  287.         display();       //调用函数
  288.              


  289. }
  290. }
复制代码

所有资料51hei提供下载:
数字钟.zip (91.31 KB, 下载次数: 44)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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