久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1973|回復: 1
收起左側

單片機數字鐘仿真和源碼

[復制鏈接]
ID:395334 發表于 2018-9-8 14:21 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
]J0]HEF)KA15T}$UM4AWSH9.png

0.png

單片機源程序如下:
  1. #include<reg51.h>
  2. //---------------------端口定義-----------------
  3. sbit K1 = P1^0;                 //指定P1.0為K1,在C51中Px.y寫為Px^y,因“.”在C語言中是一種運算符
  4. sbit K2 = P1^1;
  5. sbit K3 = P1^2;
  6. sbit K4 = P1^3;
  7. //---------------------變量定義-----------------
  8. unsigned char hou,min,sec,yea,mon,day;
  9. unsigned char disp_buf[6];        //定義顯示緩沖單元
  10. bit update_time;                        //時間更新標志,1:當前時間已更新 0:當前時間未更新
  11. unsigned char cnt=0;                //時間累加變量
  12. unsigned int fli=0;                        //閃爍時間累加變量
  13.                                           
  14. bit c = 0;                                        //時間  與日期切換標志變量,c=0顯示時間,c=1顯示日期
  15. bit leap;                                    //判斷是否為閏年標志變量
  16. bit f = 0;                                        //判斷閃爍與不閃爍切換標志變量
  17. bit s = 1;                                         //停留在某一狀態變量
  18. //---------------------函數聲明-----------------
  19. void sysinit(void);                        //調用初始化函數
  20. //void time_inc(void);                //調用時間加1函數
  21. void key_proc(void);                //調用按鍵模塊
  22. void disp_proc(void);           //調用顯示模塊
  23. void delayms(unsigned char x);//延時xms函數
  24. void main(void)
  25. {
  26.         sysinit();        //調用初始化函數
  27.         while(1)
  28.         {
  29.                 //time_inc();                //調用時間加1函數
  30.                 key_proc();                //調用按鍵模塊
  31.             //showcut();                 //調用切換函數
  32.                 disp_proc();           //調用顯示模塊
  33.         }
  34. }

  35. void sysinit(void)
  36. {
  37.     hou = 12;
  38.         min = 0;
  39.         sec = 0;
  40.         yea = 16;
  41.         mon = 10;
  42.         day = 1;
  43.            TMOD=0X11;                                        //設置定時器0和定時器1為工作方式1
  44.         TH0=(65536-50000)/256;           //裝初值
  45.         TL0=(65536-50000)%256;
  46.         TH1=(65536-50000)/256;           //裝初值
  47.         TL1=(65536-50000)%256;
  48.         EA=1;                                           //開總中斷
  49.         ET0=1;                                           //開定時器0中斷
  50.         TR0=1;                                           //啟動定時器0
  51.         ET1=1;                                           //開定時器1中斷
  52.         TR1=0;                                           //啟動定時器1
  53.        
  54. }


  55. void key_proc(void)
  56. {
  57. static key_ask=0;
  58.         if((K1 == 0)&&(c == 0))
  59.         {
  60.                 delayms(10); //去抖動
  61.                 if(key_ask == 0)
  62.                 {
  63.                     hou++;
  64.                         hou=hou%24;
  65.                         key_ask =1;
  66.                 }
  67.         }
  68.         else if((K2 == 0)&&(c == 0))
  69.         {
  70.                 delayms(10);
  71.                 if(key_ask == 0)
  72.                 {
  73.                 min++;
  74.                 min = min % 60;
  75.                 key_ask = 1;
  76.                 }       
  77.         }
  78.          else if((K1 == 0)&&(c == 1))
  79.          {
  80.                  delayms(10);
  81.                 if(key_ask == 0)
  82.                 {
  83.                         day++;
  84.                         if((leap ==1)&&(mon == 2)&&(day >29 ))
  85.                         day = 1;
  86.                         else if((leap == 0)&&(mon == 2)&&(day > 28))
  87.                         day=1;
  88.                         else if(((mon == 1)||(mon == 3)||(mon == 5)||(mon == 7)||(mon == 8)||(mon == 10)||(mon == 12))&&(day > 31))
  89.                         day = 1;
  90.                         else if(((mon == 2)||(mon == 4)||(mon == 6)||(mon == 9)||(mon == 11))&&(day > 30))
  91.                         day = 1;
  92.                         key_ask = 1;
  93.                 }

  94.          }
  95.          else if((K2 == 0)&&(c == 1))
  96.          {
  97.                  delayms(10);
  98.                 if(key_ask == 0)
  99.                 {
  100.                         mon++;
  101.                         if(mon > 12)
  102.                         mon = 1;
  103.                         key_ask = 1;
  104.                 }
  105.          }
  106.         else if(K3 == 0)
  107.         {
  108.                 delayms(10);
  109.                 if(key_ask == 0)
  110.                 {
  111.                 c=~c;
  112.                 key_ask = 1;
  113.                 }
  114.         }
  115.         if((K4 == 0)&&(f == 0))
  116.         {
  117.                 delayms(10);
  118.                 if(key_ask == 0)
  119.                 {
  120.                 TR1=1;
  121.                 f = 1;
  122.                 key_ask = 1;
  123.                 }       
  124.         }
  125.         else if((K4 == 0)&&(f == 1))
  126.         {
  127.                 delayms(10);
  128.                 if(key_ask == 0)
  129.                 {
  130.                 TR1 = 0;
  131.                 f = 0;
  132.                 key_ask = 1;
  133.                 s = 1;
  134.                 }
  135.                 }

  136.        
  137.         else if(key_ask == 1)
  138.         {
  139.                 if(K1 == 1 && K2 == 1 && K3 ==1)
  140.                 {
  141.                          key_ask = 0;
  142.                 }
  143.         }
  144.         }

  145. void gengxin(void)
  146. {
  147.        
  148. }



  149. void disp_proc(void)
  150. {
  151. unsigned char i,j;
  152. unsigned char code dis_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  153. unsigned char code bit_tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  154.         if((update_time == 1)&&(s == 1))                 //若時值(hou,min,sec)已更新則要更新顯緩disp_buf。使顯示與時值保持一致
  155.         {
  156.                 if((c == 0))
  157.                 {               
  158.                 update_time = 0;

  159.                    disp_buf[0] = hou / 10;        //更新時值
  160.                    disp_buf[1] = hou % 10;

  161.                    disp_buf[2] = min / 10;        //更新分值
  162.                    disp_buf[3] = min % 10;

  163.                    disp_buf[4] = sec / 10;        //更新秒值
  164.                    disp_buf[5] = sec % 10;
  165.                 }
  166.          if((c == 1))
  167.          {
  168.                  update_time = 0;

  169.                 disp_buf[0] = yea / 10;        //年
  170.                    disp_buf[1] = yea % 10;

  171.                    disp_buf[2] = mon / 10;        //月
  172.                    disp_buf[3] = mon % 10;

  173.                    disp_buf[4] =  day/ 10;        //日
  174.                    disp_buf[5] =  day% 10;               
  175.          }

  176.         }
  177.                
  178.         for(i = 0; i < 6; i++)
  179.         {
  180.                 P3 = 0xff;        //熄滅顯示器(避免數碼管出現亂碼,不熄
  181.                                         //滅就會下次字型碼輸出的時候,下個數碼
  182.                                         //管沒有亮得時候,在之前的數碼管上就瞬間亮了)

  183.         if((i==1)||(i==3))
  184.         {                         
  185.                 P2 = dis_tab[disp_buf[i]]+0x80;                 //輸現定形碼
  186.                  P3 = bit_tab[i];
  187.                for(j = 0; j < 100; j++);
  188.         }
  189.         else
  190.         {
  191.                  P2 = dis_tab[disp_buf[i]];                 //輸現定形碼
  192.                 P3 = bit_tab[i];
  193.                 for(j = 0; j < 100; j++);
  194.        
  195.        
  196.         }
  197.                        
  198.         }
  199. }
  200. void T0_time()interrupt 1
  201.         {
  202.                 TH0=(65536-50000)/256;
  203.                 TL0=(65536-50000)%256;
  204.                 ++cnt;
  205.                 if((yea%4 == 0)&&(yea%100 != 0)||(yea%400 == 0))
  206.                 leap = 1;                                        //判斷為閏年
  207.                 else
  208.                 leap = 0;                                        //不是閏年
  209.                 if(cnt >= 20)
  210.                 {
  211.                         update_time = 1;        //置時間更新標志
  212.                         cnt  = 0;

  213.                         ++sec;
  214.                         if(sec >= 60)
  215.                 {
  216.                         sec = 0;
  217.                         ++min;
  218.                         if(min >= 60)
  219.                         {
  220.                                 min = 0;
  221.                                 ++hou;
  222.                                 if(hou >= 24)
  223.                                 {
  224.                                         hou = 0;
  225.                                         day++;
  226.                                         if((leap ==1)&&(mon == 2)&&(day >29 ))
  227.                                                 {
  228.                                                         mon++;
  229.                                                         day = 0;
  230.                                                 }
  231.                                         else if((leap == 0)&&(mon == 2)&&(day > 28))
  232.                                                         {
  233.                                                                 mon++;
  234.                                                                 day = 0;
  235.                                                         }
  236.                                         else if((mon == 1)||(mon == 3)||(mon == 5)||(mon == 7)||(mon == 8)||(mon == 10)||(mon == 12)&&(day > 31))
  237.                                                         {
  238.                                                                 mon++;
  239.                                                                 day = 0;
  240.                                                         }
  241.                                         else if((mon == 2)||(mon == 4)||(mon == 6)||(mon == 9)||(mon == 11)&&(day > 30))
  242.                                                         {
  243.                                                                  mon++;
  244.                                                                 day = 0;
  245.                                                         }
  246.                                                         if(mon > 12)
  247.                                                         mon = 1;
  248.                                 }
  249.                         }
  250.                 }
  251.         }
  252. ……………………

  253. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
-數字鐘24.rar (78.96 KB, 下載次數: 29)


回復

使用道具 舉報

ID:1 發表于 2018-9-8 16:43 | 顯示全部樓層
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av免费网站在线观看 | 亚洲一区二区三区免费观看 | ww 255hh 在线观看 | 欧美日韩国产精品激情在线播放 | 国产黄色麻豆视频 | 久久久久久国产精品免费免费 | 欧美日韩精品 | 日日干夜夜操 | 日本91av视频 | 久久精品视频在线播放 | 特级毛片www| 男女羞羞视频在线观看 | 日韩精品中文字幕在线 | 久久99蜜桃综合影院免费观看 | 亚洲一区二区三区免费在线观看 | 国产亚洲欧美在线视频 | 日韩精品1区2区3区 爱爱综合网 | 中文字幕在线三区 | 精品国产综合 | 成人在线中文字幕 | 国产成人久久精品一区二区三区 | 天天视频一区二区三区 | 成人在线电影网站 | www.精品国产 | 成人免费视频观看视频 | 日本在线看片 | 91av视频在线观看 | 成人a在线 | 国产精品91视频 | av激情在线 | 成人免费视频 | 欧美大片黄 | 久久er精品| 日韩一区二区三区视频 | 九九视频在线观看 | 草草视频在线观看 | 性欧美精品一区二区三区在线播放 | 羞羞视频在线观看网站 | 国产人久久人人人人爽 | av免费成人 | 伊色综合久久之综合久久 |