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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4495|回復: 1
打印 上一主題 下一主題
收起左側

單片機可調時鐘的C程序及proteus仿真圖

[復制鏈接]
跳轉到指定樓層
樓主
分享一個基于51單片機的可調時鐘小設計

模式鍵:按一次,進入倒計時設置模式(設置倒計時的時間,比如2min30s,5min40s等)
    按兩次,進入倒計時模式(開始倒計時)
    按三次,進入鐘表時間調節模式
    按四次,回到正常顯示模式(進入計時器/倒計時模式時不影響鐘表正常走時)

配置鍵:按一次調整分
    按兩次調整時
    按三次,回到調整分,依次循環
    (配置鍵選擇需要調整的單位,由加/減鍵進行加減調整)

加法鍵:數值加
減法鍵:數值減


紅色數碼管顯示0時,為正常顯示模式
紅色數碼管顯示1時,為倒計時設置模式
紅色數碼管顯示3時,為倒計時模式

在正常顯示模式下,除模式鍵外其他按鍵都不可用
在鐘表時間調節模式下,鐘表不走時,其他任何模式都不影響鐘表的正常走時

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



單片機源程序如下:
  1.         /*晶振12MHZ*/   
  2. #include<reg52.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar code wela[6] = {0x20,0x10,0x08,0x04,0x02,0x01};           //位選碼
  6. uchar code dula[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         //段選碼
  7. uchar buff[6] = {0,0,0,0,0,0};

  8. sbit P33 = P3^3;
  9. sbit P32 = P3^2;
  10. sbit P34 = P3^4;
  11. sbit P35 = P3^5;
  12. uchar hour,second,minute,hour_1,second_1,minute_1,hour_2,second_2,minute_2,t0,mode,reset,i;
  13.         //無下劃線的為時分秒輔助變量,下劃線1的為時鐘時分秒,下劃線2的為倒計時時分秒

  14. void init();       //初始化函數
  15. void mode_0(void);                //動態掃描函數       
  16. void mode_1(void);                //閃爍函數       
  17. void time_1(void);                //時鐘函數(正計時)
  18. void time_2(void);                //倒計時函數
  19. void oper_add(void);        //加法鍵函數
  20. void oper_minus(void);         //減法鍵函數
  21. void delay(uint z);                 //延時函數

  22. void main()
  23. {
  24.         init();
  25.         while(1)
  26.         {
  27.                 if(mode==1)
  28.                 {
  29.                         second = second_2;
  30.                         minute = minute_2;
  31.                         hour = hour_2;
  32.                         oper_add();                          //加法鍵函數
  33.                         oper_minus();                //減法鍵函數
  34.                         second_2 = second;
  35.                         minute_2 = minute;
  36.                         hour_2 = hour;
  37.                 }
  38.                 else if(mode==3)
  39.                 {
  40.                         second = second_1;
  41.                         minute = minute_1;
  42.                         hour = hour_1;
  43.                         oper_add();
  44.                         oper_minus();
  45.                         second_1 = second;
  46.                         minute_1 = minute;
  47.                         hour_1 = hour;
  48.                 }
  49.         }
  50. }

  51.         /*初始化函數*/
  52. void init()
  53. {
  54.         TMOD = 0x01;                           //設置T0為方式一
  55.         TH0 = 0x3c;
  56.         TL0 = 0xb0;
  57.         IE = 0x87;
  58.         IT0 = IT1 = 0;
  59.         IP = 0X02;                                        //設置T0為高優先級
  60.         TR0 = 1;
  61.         t0 = 0;
  62.         mode = 0;
  63.         P1 = 0xc0;

  64. }

  65.         /*模式鍵函數,外部中斷0*/
  66. void X0_mode() interrupt 0                                               
  67. {
  68.         delay(10);
  69.         if(P32 == 0)
  70.         {
  71.                 mode++;                                                //mode為模式標志位
  72.                 reset = 0;                                        //reset為時分秒調節標志位
  73.                 switch(mode)
  74.                 {
  75.                         case 0 :        P1 = 0xc0 ; break;
  76.                         case 1 : {  P1 = 0xf9 ; hour_2 = second_2 = minute_2 = 0;} break;
  77.                         case 2 :         P1 = 0xa4 ; break;
  78.                         case 3 :        P1 = 0xb0 ; break;
  79.                         case 4 : {        P1 = 0xc0 ; mode = 0;} break;
  80.                         default : break;
  81.                 }

  82.         }
  83.         while(P32 == 0);
  84.        
  85. }

  86.         /*配置鍵函數,外部中斷1*/
  87. void X1_reset() interrupt 2                                               
  88. {
  89.         delay(10);
  90.         if(P33 == 0)
  91.         {
  92.                 if((mode==1) || (mode==3))
  93.                         {
  94.                                 reset++;                         //時分秒調節標志位
  95.                                 if(reset == 3)
  96.                                         reset = 0;
  97.                         }
  98.         }
  99.         while(P33 == 0);
  100.        
  101. }

  102.         /*計時/動態掃描函數,內部中斷0*/
  103. void T0_disp() interrupt 1                                  
  104. {       
  105.         TH0 = 0xb1;
  106.         TL0 = 0xe0;                                                 //b1e0(20ms)
  107.         t0++;
  108.         if(t0==50)                                                 //秒計數部分(正倒計時共用)
  109.         {
  110.                 t0=0;
  111.                 if(mode != 3)
  112.                         time_1();                                 //除了調節鐘表時間調節模式外,其他模式下執行正計時函數
  113.                 if(mode==2)
  114.                         time_2();                                 //進入倒計時模式時,執行倒計時函數(正計時不受干擾)
  115.         }
  116.         if((mode==1) || (mode==2))                   //裝載部分,將時分秒裝載到數組buff,便于動態掃描。
  117.         {
  118.                 buff[0]=second_2%10;
  119.                 buff[1]=second_2/10;
  120.                 buff[2]=minute_2%10;
  121.                 buff[3]=minute_2/10;
  122.                 buff[4]=hour_2%10;
  123.                 buff[5]=hour_2/10;
  124.                        
  125.         }
  126.         else
  127.         {
  128.                 buff[0]=second_1%10;
  129.                 buff[1]=second_1/10;
  130.                 buff[2]=minute_1%10;
  131.                 buff[3]=minute_1/10;
  132.                 buff[4]=hour_1%10;
  133.                 buff[5]=hour_1/10;
  134.         }                       
  135.         switch(mode)                                                //顯示部分,包括動態掃描和閃爍函數
  136.         {
  137.                 case 0 : mode_0() ; break;
  138.                 case 1 : mode_1() ; break;
  139.                 case 2 : mode_0() ; break;
  140.                 case 3 : mode_1() ; break;
  141.                 default : break;
  142.         }       
  143.        
  144. }

  145.         /*動態掃描函數*/
  146. void mode_0(void)
  147. {
  148.         for(i=0;i<6;i++)
  149.         {
  150.                 P2=wela[i];
  151.                 P0=dula[buff[i]];
  152.                 delay(1);       
  153.         }
  154.         P2 = 0xe0;
  155.         P0 = 0xbf;
  156.         delay(1);               
  157. }

  158.         /*閃爍函數*/
  159. void mode_1(void)                                                                //實現0.5s亮滅閃爍
  160. {
  161.         P2 = 0xc0;
  162.         P0 = 0xbf;
  163.         delay(1);
  164.                
  165.         if((reset==0) && (t0>24))        P2 = 0;
  166.         else        P2 = wela[0];
  167.         P0 = dula[buff[0]];
  168.         delay(1);

  169.         if((reset==0) && (t0>24))        P2 = 0;
  170.         else        P2 = wela[1];       
  171.         P0 = dula[buff[1]];
  172.         delay(1);

  173.         if((reset==1) && (t0>24))        P2 = 0;
  174.         else        P2 = wela[2];
  175.         P0 = dula[buff[2]];
  176.         delay(1);

  177.         if((reset==1) && (t0>24))        P2 = 0;
  178.         else        P2 = wela[3];
  179.         P0 = dula[buff[3]];
  180.         delay(1);

  181.         if((reset==2) && (t0>24))        P2 = 0;
  182.         else        P2 = wela[4];
  183.         P0 = dula[buff[4]];
  184.         delay(1);

  185.         if((reset==2) && (t0>24))        P2 = 0;
  186.         else        P2 = wela[5];
  187.         P0 = dula[buff[5]];
  188.         delay(1);


  189. }

  190.         /*正計時函數*/
  191. void time_1(void)                                                                 
  192. {
  193.         second_1++;
  194.         if(second_1==60)
  195.         {
  196.                 second_1=0;
  197.                 minute_1++;
  198.                 if(minute_1==60)
  199.                 {
  200.                         minute_1=0;
  201.                         hour_1++;
  202.                         if(hour_1==24)
  203.                                 hour_1=0;
  204.                 }
  205.         }
  206. }

  207.         /*倒計時函數*/
  208. void time_2(void)                                                                 
  209. {
  210.         second_2--;
  211.         if(second_2==255)
  212.         {
  213.                 second_2=59;
  214.                 minute_2--;
  215.                 if(minute_2==255)
  216.                 {
  217.                         minute_2=59;
  218.                         hour_2--;
  219.                         if(hour_2==255)
  220.                                 hour_2=23;
  221.                 }
  222.         }
  223. }

  224.         /*加法鍵函數*/
  225. void oper_add(void)
  226. {
  227.         if(P35 == 0)
  228.         {
  229.                 delay(10);
  230.                 if(P35 == 0)
  231.                 {
  232.                         switch(reset)
  233.                         {
  234.                                 case 0 :
  235.                                         {
  236.                                                 second++;
  237.                                                 if(second > 59)
  238.                                                         second = 0;                                               
  239.                                         } break;
  240.                                 case 1 :
  241.                                         {
  242.                                                 minute++;
  243.                                                 if(minute > 59)
  244.                                                         minute = 0;                                               
  245.                                         } break;
  246.                                 case 2 :
  247.                                         {
  248.                                                 hour++;
  249.                                                 if(hour > 24)
  250.                                                         hour = 0;                                       
  251.                                         }
  252.                                 default : break;
  253.                         }

  254.                 }
  255.                 while(P35 == 0);
  256.         }       
  257. }

  258.         /*減法鍵函數*/
  259. void oper_minus(void)
  260. {
  261.         if(P34 == 0)
  262.         {
  263.                 delay(10);
  264.                 if(P34 == 0)
  265.                 {
  266.                         switch(reset)
  267. ……………………

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

所有資料51hei提供下載:
clock.zip (65.56 KB, 下載次數: 67)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:411940 發表于 2018-10-18 21:31 | 只看該作者
很厲害的程序,感謝樓主分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜欧美a级理论片915影院 | 国产福利视频在线观看 | www.色婷婷 | 久久一区二区三区四区 | 精品啪啪| 欧美v免费 | 精品一二三区视频 | 狠狠草视频 | 亚洲高清视频在线观看 | 国产精品一区二区三区久久久 | 自拍 亚洲 欧美 老师 丝袜 | 亚洲综合婷婷 | 日操操 | 99这里只有精品视频 | 亚洲视频在线观看 | 欧美中文字幕一区二区 | 成人高清在线 | 免费视频一区二区三区在线观看 | 久久久久久国产精品mv | 自拍偷拍精品 | 91日韩 | 国产aaaaav久久久一区二区 | 99福利视频 | av黄色在线| 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 色综合久久伊人 | 免费观看av网站 | 亚洲精品视频播放 | 国产高清在线 | 国产一区在线免费观看视频 | 在线一区 | 成人精品视频免费 | 亚洲一区二区三区在线观看免费 | 在线国产小视频 | 亚洲精品乱码 | 91精品国产综合久久久久久漫画 | 在线欧美小视频 | 黑人成人网 | 中文在线www | 日韩在线精品 | 亚洲毛片一区二区 |