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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機簡易時鐘(帶流水燈,斷電保存)

[復制鏈接]
跳轉到指定樓層
樓主
一個簡單的四位數碼管的時鐘,可以調節、暫停、清零時間,斷電保存并且在設定的時間內有流水燈亮起。(附有程序和接線圖)
如果有哪里做得不好的還請大家多指教。


單片機源程序如下:
  1. /*********************************************************************
  2. 簡易時鐘: 1. 四位數碼管顯示(分秒計時)。
  3.            2. 每到30~40秒時有流水燈亮起。
  4.            3. 可斷電保存
  5.            4. 按鍵1——暫停
  6.              按鍵2——清零
  7.              按鍵3——加10秒
  8.              按鍵4——減10秒
  9.              按鍵5——加10分
  10.              按鍵6——減10分  
  11. *********************************************************************/
  12. #include<reg51.h>
  13. #include"i2c.h"               
  14. #include <intrins.h>
  15. #define uint unsigned int
  16. #define uchar unsigned char
  17. unsigned char m=0;
  18. uchar z=0;
  19. sbit key1=P1^0;                           //定義各按鍵對應的IO口
  20. sbit key2=P1^1        ;
  21. sbit key3=P1^2;
  22. sbit key4=P1^3;
  23. sbit key5=P1^4;
  24. sbit key6=P1^5;
  25. typedef unsigned char u8;
  26. typedef unsigned int u16;
  27. u8 i;
  28. uchar display2[]={  0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd };           //用于流水燈
  29. uint counter=0;
  30. u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
  31.                       0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71,};// 段選
  32. u8 smgduan1[16]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,};  //百位的段選

  33. u8 smgwei[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; //位選
  34. u8 a[4];//保存時鐘的數據
  35. u8 sec,min;
  36. void delay(u16 i)                           //延遲函數
  37. {
  38. while(i--);
  39. }
  40. /*******************************************************************************
  41. * 函 數 名         : void At24c02Write(unsigned char addr,unsigned char dat)
  42. * 函數功能                   : 往24c02的一個地址寫入一個數據
  43. *******************************************************************************/

  44. void At24c02Write(unsigned char addr,unsigned char dat)        //把dat的值存放到addr地址上
  45. {
  46.         I2C_Start();
  47.         I2C_SendByte(0xa0, 1);//發送寫器件地址
  48.         I2C_SendByte(addr, 1);//發送要寫入內存地址
  49.         I2C_SendByte(dat, 0);        //發送數據
  50.         I2C_Stop();
  51.        
  52. }
  53. /*******************************************************************************
  54. * 函 數 名         : unsigned char At24c02Read(unsigned char addr)
  55. * 函數功能                   : 讀取24c02的一個地址的一個數據
  56. *******************************************************************************/

  57. unsigned char At24c02Read(unsigned char addr)
  58. {
  59.         unsigned char sec;
  60.         I2C_Start();
  61.         I2C_SendByte(0xa0, 1); //發送寫器件地址
  62.         I2C_SendByte(addr, 1); //發送要讀取的地址
  63.         I2C_Start();
  64.         I2C_SendByte(0xa1, 1); //發送讀器件地址
  65.         sec=I2C_ReadByte(); //讀取數據
  66.         I2C_Stop();
  67.         return sec;       
  68. }

  69. /***********************************
  70.            顯示函數
  71. ************************************/
  72. void display()                       
  73. {
  74. a[0]=smgduan[sec%10];
  75. a[1]=smgduan[sec/10];

  76. a[2]=smgduan1[min%10];
  77. a[3]=smgduan[min/10];
  78. for(i=0;i<4;i++)       
  79. {
  80. P0=a[i];
  81. P2=smgwei[4-i];
  82. delay(300);          //不同的延時時間對數碼管顯示亮度會產生很大的影響,時間越短影響越大
  83. }
  84. }

  85. initial()                                         //定時器0初始化
  86. { TMOD=0x01;        //選擇定時器工作模式
  87. TH0=55536/256;                                   //設置定時初值
  88.   TL0=55536%256;
  89.    EA=1;
  90.     ET0=1;                                                 
  91.          TR0=1; }

  92. void time1init()
  93. {                                                                        //定時器1初始化
  94. TMOD=0x01;
  95. TL1 = 0xCB;               
  96.         TH1 = 0xF3;       
  97. EA=1;             //總中斷
  98. ET1=1;             //中斷允許開關
  99. TR1=1;             //定時器開關
  100. }

  101. /***********************
  102.     按鍵掃描函數
  103. ************************/
  104. void keyscan()                          
  105. {
  106. delay(200);
  107. if(key2==0)                         //清零
  108. {
  109. delay(200);
  110. min=0;
  111. sec=0;
  112. while (!key2);}
  113. if(key1==0)                           //暫停
  114. {
  115. delay(200);
  116. while (!key1);
  117. TR1=~TR1;                                 //停止或啟動定時器1
  118. }
  119. if(key3==0)        //增加10s,若此時秒大于50則在增加后進min進一,sec照量改變
  120. {
  121. delay(200);
  122. if(sec<=49)
  123. sec +=10;
  124. else                                               
  125. {min+=1;
  126. sec-=50;}
  127. while(!key3);
  128. }
  129.   if(key5==0)                                //增加10m
  130.   {
  131.   delay(200);
  132.   min+=10;
  133.   while(!key5);}
  134.   if(min>=60)                                 //min滿60后全部歸零
  135.   {delay(200);
  136.   min=0;
  137.   sec=0;
  138.   while(!key5);}
  139.   delay(200);
  140.   if(key6==0)                //減少10m,若此時時間少于10m,則時間歸零                        
  141.   {
  142.   delay(200);
  143.   if(min>=10)
  144.   {
  145.   min-=10;
  146.   while(!key6);}
  147.   else
  148.   {delay(200);
  149.   min=0        ;                                     
  150.   sec=0;
  151.   while(!key6);}
  152.   }         
  153. if(key4==0)                  //減少10秒
  154. {
  155. delay(200);
  156. if(sec>=10)
  157. {delay(200);
  158. sec-=10;
  159. while(!key4);
  160.   }
  161.   else if(min>=1&&sec<=10)
  162.   {delay(200);
  163.   min-=1;
  164.   sec+=50;
  165.   while(!key4);
  166.   }
  167.   else if(min==0&&sec<=10) //時間少于10s的在按下key4后歸零
  168.   {delay(200);
  169.   min=0;
  170.   sec=0;
  171.   while(!key4);
  172.   }
  173.   }
  174.   }
  175. /**********************
  176.      主函數
  177. ***********************/               
  178. void main()
  179. {
  180.    if(m==0)                                 //斷電后讀數
  181.   { sec=At24c02Read(1);
  182.   min=At24c02Read(2);
  183.           }
  184.           time1init();                                          //調用各種子函數
  185.            while(1)
  186. {  At24c02Write(1,sec);       
  187. keyscan();
  188. display();
  189. initial();
  190. }
  191. }       

  192.    
  193. void T0_int () interrupt 1                           //定時器0控制流水燈
  194. { TR0=0;
  195. ET0=0;
  196. TH0=55536/256;                 //設置初值
  197. TL0=55536%256;
  198. if(sec>=30&&sec<=40)                                 //在30s~40s時流水燈亮起
  199. {
  200. if(z<14)
  201. { counter++;
  202. if(counter==30)                                                  //定時控制LED燈的改變
  203. {  z++;  
  204. counter=0;
  205. }  
  206. P3=display2[z]; }
  207.   if(z==14)
  208.   {  P3=0xff;
  209.    z=0; }
  210. ……………………

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

所有資料51hei提供下載:
時鐘.zip (526.98 KB, 下載次數: 28)


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99这里只有精品 | 午夜色播 | 欧美一级www片免费观看 | 一区二区三区日韩 | 久久草在线视频 | 男人的天堂亚洲 | 成人免费在线观看视频 | 国产a级黄色录像 | 亚洲欧洲av在线 | 欧美黄页 | 浴室洗澡偷拍一区二区 | 日本不卡一区二区三区在线观看 | 国产一区二区久久 | 国产欧美性成人精品午夜 | 天天色天天色 | 亚洲国产成人av好男人在线观看 | 欧美精品在线观看 | 色资源站| 亚洲国产精品一区二区www | 一区二区三区在线播放 | 一区二区三区在线电影 | www.xxxx欧美| 国内精品久久久久 | 99国产精品99久久久久久 | 免费黄色在线观看 | 中文在线一区二区 | 国产精品视频二区三区 | 中文字幕一区二区三区日韩精品 | 久久国产麻豆 | 亚洲欧美成人影院 | 日韩av在线一区二区 | 在线观看免费av片 | 欧美性受xxxx白人性爽 | 亚洲综合成人网 | 欧美色成人 | 欧美二区三区 | 欧美黄色大片在线观看 | 尤物在线视频 | 精品国产一区二区国模嫣然 | 亚洲一区二区中文字幕在线观看 | 国产精品成人一区二区三区夜夜夜 |