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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

自己做的0-99的4位按鍵顯示單片機程序 可控制加減與清零 2017藍橋杯驅動

[復制鏈接]
跳轉到指定樓層
樓主
ID:173356 發(fā)表于 2017-3-19 19:14 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我自己做的一個0-99的4位按鍵顯示,可分別控制其加減,與清零。同時利用定時器,讓其自動跑。同時附帶IIc,關機自動存儲,已跑的數(shù)據(jù)。內(nèi)含數(shù)碼管顯示代碼,定時器代碼,IIc代碼。
同時附帶2017藍橋杯驅動.zip。

部分源碼預覽:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. bit write = 0;        //一秒存儲一次
  5. sbit A138 = P2^5;          //數(shù)碼管動態(tài)顯示
  6. sbit B138 = P2^6;
  7. sbit C138 = P2^7;
  8. sbit key1 = P3^0;          //4位按鍵
  9. sbit key2 = P3^1;
  10. sbit key3 = P3^2;
  11. sbit key4 = P3^3;
  12. sbit I2C_SCL = P2^0;  //II2c
  13. sbit I2C_SDA = P2^1;

  14. uchar duan[18] =                                                                          //共陽極數(shù)碼管
  15. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  16. 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
  17. uchar wei[8] =                                                                                  //位選
  18. {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

  19. void display1(uchar w,uchar d);
  20. void display(uchar num);
  21. void delay(uint a);

  22. void timerconfigration();         //定時器初始化

  23. void keyscan();                                 //按鍵掃描

  24. void I2C_Delay10us();
  25. void I2C_Start();
  26. void I2C_Stop();
  27. uchar I2C_SendByte(uchar dat, uchar ack);
  28. uchar I2C_ReadByte();

  29. void At24c02Write(unsigned char ,unsigned char );
  30. unsigned char At24c02Read(unsigned char );

  31. uchar count,sec;

  32. void main()
  33. {
  34.         sec = At24c02Read(2);                   //讀存儲內(nèi)容
  35.         if(sec>99)
  36.                 sec = 0;
  37.         timerconfigration();        
  38.         while(1)
  39.         {
  40.                 keyscan();
  41.                 display(sec);
  42.                 if(write==1)
  43.                 {
  44.                         write = 0;
  45.                         At24c02Write(2,sec);   //存儲
  46.                 }
  47.         }               
  48. }

  49. void delay(uint a)                                   //a ms 去抖10MS足以
  50. {
  51.         uchar b;
  52.         for (;a>0;a--)
  53.                 for (b=110;b>0;b--);        
  54. }

  55. void display1(uchar w,uchar d)
  56. {
  57.         A138 = 0;
  58.         B138 = 1;
  59.         C138 = 1;

  60.         P0 = wei[w];

  61.         A138 = 1;

  62.         P0 = duan[d];
  63.         delay(5);
  64.         P0 = 0xff;
  65. }

  66. void display(uchar num)
  67. {
  68.         display1(0,num/10);
  69.         display1(1,num%10);
  70. }

  71. void keyscan()
  72. {
  73.         if(key1==0)
  74.         {
  75.                 delay(10);
  76.                 if(key1==0)
  77.                 {
  78.                         sec++;
  79.                         if(sec==99)
  80.                                 sec = 0;
  81.                         write = 1;
  82.                         while(!key1);                                 
  83.                 }
  84.         }
  85.         if(key2==0)
  86.         {
  87.                 delay(10);
  88.                 if(key2==0)
  89.                 {
  90.                         if(sec==0)
  91.                                 sec = 99;
  92.                         else
  93.                                 sec--;
  94.                         write = 1;
  95.                         while(!key2);
  96.                 }
  97.         }
  98.         if(key3==0)
  99.         {
  100.                 delay(10);
  101.                 if(key3==0)
  102.                 {
  103.                         sec = 0;
  104.                         write = 1;
  105.                         while(!key3);
  106.                 }
  107.         }
  108.         if(key4==0)
  109.         {
  110.                 delay(10);
  111.                 if(key4==0)
  112.                 {
  113.                         while(!key4);
  114.                         TR0 = ~TR0;
  115.                 }
  116.         }
  117. }

  118. void timerconfigration()                                 //定時器
  119. {
  120.         TMOD = 0x01;
  121.         TH0 = (65535-46296)/256;
  122.         TL0 = (65535-46296)%256;
  123.         EA  = 1;
  124.         ET0 = 1;
  125. //        TR0 = 1;
  126. }

  127. void T0_time() interrupt 1
  128. {
  129.         TH0 = (65535-46296)/256;
  130.         TL0 = (65535-46296)%256;
  131.         count++;
  132.         if(count==20)
  133.         {
  134.                 count = 0;
  135.                 sec++;
  136.                 write = 1;
  137.                 if(sec==99)
  138.                         sec = 0;
  139.         }
  140. }

  141. void I2C_Delay10us()
  142. {
  143.         uchar a, b;
  144.         for(b=1; b>0; b--)
  145.         {
  146.                 for(a=2; a>0; a--);
  147.         }
  148. }
  149. /*******************************************************************************
  150. * 函 數(shù) 名         : I2C_Start()
  151. * 函數(shù)功能                   : 起始信號:在I2C_SCL時鐘信號在高電平期間I2C_SDA信號產(chǎn)生一個下降沿
  152. * 輸    入         : 無
  153. * 輸    出         : 無
  154. * 備    注         : 起始之后I2C_SDA和I2C_SCL都為0
  155. *******************************************************************************/

  156. void I2C_Start()
  157. {
  158.         I2C_SDA = 1;
  159.         I2C_Delay10us();
  160.         I2C_SCL = 1;
  161.         I2C_Delay10us();//建立時間是I2C_SDA保持時間>4.7us
  162.         I2C_SDA = 0;
  163.         I2C_Delay10us();//保持時間是>4us
  164.         I2C_SCL = 0;                        
  165.         I2C_Delay10us();               
  166. }
  167. /*******************************************************************************
  168. * 函 數(shù) 名           : I2C_Stop()
  169. * 函數(shù)功能                 : 終止信號:在I2C_SCL時鐘信號高電平期間I2C_SDA信號產(chǎn)生一個上升沿
  170. * 輸    入           : 無
  171. * 輸    出                  : 無
  172. * 備    注           : 結束之后保持I2C_SDA和I2C_SCL都為1;表示總線空閑
  173. *******************************************************************************/

  174. void I2C_Stop()
  175. {
  176.         I2C_SDA = 0;
  177.         I2C_Delay10us();
  178.         I2C_SCL = 1;
  179.         I2C_Delay10us();//建立時間大于4.7us
  180.         I2C_SDA = 1;
  181.         I2C_Delay10us();               
  182. }
  183. /*******************************************************************************
  184. * 函 數(shù) 名           : I2cSendByte(uchar num)
  185. * 函數(shù)功能                  : 通過I2C發(fā)送一個字節(jié)。在I2C_SCL時鐘信號高電平期間,
  186. *                    * 保持發(fā)送信號I2C_SDA保持穩(wěn)定
  187. * 輸    入           : num ,ack
  188. * 輸    出                  : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
  189. * 備    注           : 發(fā)送完一個字節(jié)I2C_SCL=0, 需要應答則應答設置為1,否則為0
  190. *******************************************************************************/

  191. uchar I2C_SendByte(uchar dat, uchar ack)
  192. {
  193.         uchar a = 0,b = 0;//最大255,一個機器周期為1us,最大延時255us。
  194.                         
  195.         for(a=0; a<8; a++)//要發(fā)送8位,從最高位開始
  196.         {
  197.                 I2C_SDA = dat >> 7;         //起始信號之后I2C_SCL=0,所以可以直接改變I2C_SDA信號
  198.                 dat = dat << 1;
  199.                 I2C_Delay10us();
  200.                 I2C_SCL = 1;
  201.                 I2C_Delay10us();//建立時間>4.7us
  202.                 I2C_SCL = 0;
  203.                 I2C_Delay10us();//時間大于4us               
  204.         }

  205.         I2C_SDA = 1;
  206.         I2C_Delay10us();
  207.         I2C_SCL = 1;
  208.         while(I2C_SDA && (ack == 1))//等待應答,也就是等待從設備把I2C_SDA拉低
  209.         {
  210.                 b++;
  211.                 if(b > 200)         //如果超過200us沒有應答發(fā)送失敗,或者為非應答,表示接收結束
  212.                 {
  213.                         I2C_SCL = 0;
  214.                         I2C_Delay10us();
  215.                         return 0;
  216.                 }
  217.         }

  218.         I2C_SCL = 0;
  219.         I2C_Delay10us();
  220.          return 1;               
  221. }
  222. /*******************************************************************************
  223. * 函 數(shù) 名           : I2cReadByte()
  224. * 函數(shù)功能                     : 使用I2c讀取一個字節(jié)
  225. * 輸    入           : 無
  226. * 輸    出                  : dat
  227. * 備    注           : 接收完一個字節(jié)I2C_SCL=0
  228. *******************************************************************************/

  229. uchar I2C_ReadByte()
  230. {
  231.         uchar a = 0,dat = 0;
  232.         I2C_SDA = 1;                        //起始和發(fā)送一個字節(jié)之后I2C_SCL都是0
  233.         I2C_Delay10us();
  234.         for(a=0; a<8; a++)//接收8個字節(jié)
  235.         {
  236.                 I2C_SCL = 1;
  237.                 I2C_Delay10us();
  238.                 dat <<= 1;
  239.                 dat |= I2C_SDA;
  240.                 I2C_Delay10us();
  241.                 I2C_SCL = 0;
  242.                 I2C_Delay10us();
  243.         }
  244.         return dat;               
  245. }

  246. /*******************************************************************************
  247. * 函 數(shù) 名         : void At24c02Write(unsigned char addr,unsigned char dat)
  248. * 函數(shù)功能                   : 往24c02的一個地址寫入一個數(shù)據(jù)
  249. * 輸    入         : 無
  250. * 輸    出         : 無


  251. …………余下代碼請下載附件…………
復制代碼

下載:
4鍵控制數(shù)碼管 存儲.zip (36.12 KB, 下載次數(shù): 16)
2017藍橋杯驅動.zip (113.22 KB, 下載次數(shù): 13)

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

使用道具 舉報

沙發(fā)
ID:370943 發(fā)表于 2019-3-1 21:26 | 只看該作者
學習借鑒下,原來可以這樣寫的
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久精品高清 | 成人国产精品免费观看视频 | 黄色毛片一级 | 日韩电影a| 欧美一区二区黄 | 成人国产精品 | 久久久精品一区二区三区四季av | 色资源在线观看 | 羞视频在线观看 | 日本国产一区二区 | 亚洲精品无 | 一级黄色录像片子 | 亚洲成人在线免费 | 第一av| 美女黄视频网站 | 国产精品久久久久久久久婷婷 | 亚洲 欧美 精品 | 99精品免费在线观看 | 亚洲成人精品久久久 | 青青99| 激情视频中文字幕 | 欧美一区二区三区在线 | 日韩福利在线 | 国产精品一区二区视频 | 国产视频福利一区 | 网站黄色在线免费观看 | 成人免费福利视频 | 久久精品一区二区 | 天天插天天操 | 国产999精品久久久久久 | 午夜国产| 欧美在线天堂 | 精品在线一区二区三区 | 天天操网 | 99热精品在线 | 美女人人操 | 久久久人成影片免费观看 | 久久久久国产精品一区二区 | 国产一区二区三区四区五区3d | 欧美13videosex性极品 | 亚洲巨乳自拍在线视频 |