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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1687|回復: 0
打印 上一主題 下一主題
收起左側(cè)

51單片機通過18b20在數(shù)碼管顯示溫度和時間程序,按鍵設置鬧鐘

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:661526 發(fā)表于 2022-1-26 11:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "reg52.h"

  2. unsigned int hour = 2, min = 2, sec = 3;       //設置時間初值
  3. unsigned int ahour = 0, amin = 0, asec = 0;    //設置鬧鐘初值

  4. sbit k1 = P3^1;    //修改時間
  5. sbit k2 = P3^0;   //設置鬧鐘
  6. sbit k3 = P3^2;        //加1
  7. sbit k4 = P3^3;        //減1

  8. sbit DSPORT=P3^7;


  9. sbit beep=P1^5;

  10. sbit LSA=P2^2;
  11. sbit LSB=P2^3;
  12. sbit LSC=P2^4;

  13. unsigned int keyvalue = 0;
  14. unsigned int settype = 0;      //0是初始狀態(tài)正常顯示,1是修改秒,2是修改分,3是修改時
  15. unsigned int alarmvalue = 0;   //0是初始狀態(tài),1是修改秒,2是修改分,3是修改時

  16. unsigned char Show[8] = {0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
  17. unsigned char code TableCC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  18. int b = 0;

  19. float tp=0;
  20. int temp=0;                                                        
  21. int c1=0;c2=0;

  22. void delay(unsigned char i)
  23. {
  24.         while(i--);        
  25. }               


  26. void delay_us(unsigned char t)
  27. {
  28.     while(--t);
  29. }

  30. void delay_ms(unsigned int t)   //t最大為255
  31. {
  32.     while(t--)
  33.     {
  34.         delay_us(245);
  35.         delay_us(245);
  36.     }
  37. }




  38. unsigned char Ds18b20Init()        //Ds18b20Init初始化         
  39. {
  40.         unsigned int i;
  41.         DSPORT=0;                         //將總線拉低480us~960us
  42.         i=70;                                                                                            
  43.         while(i--);//延時642us
  44.         DSPORT=1;                        //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
  45.         i=0;
  46.         while(DSPORT)        //等待DS18B20拉低總線
  47.         {
  48.                 i++;
  49.                 if(i>5000)//等待>5MS
  50.                         return 0;//初始化失敗        
  51.         }
  52.         return 1;//初始化成功
  53. }



  54. void Ds18b20WriteByte(unsigned char dat)  //Ds18b20WriteByte  向18B20寫入一個字節(jié)
  55. {
  56.         unsigned int i,j;
  57.         for(j=0;j<8;j++)
  58.         {
  59.                 DSPORT=0;                        //每寫入一位數(shù)據(jù)之前先把總線拉低1us
  60.                 i++;
  61.                 DSPORT=dat&0x01; //然后寫入一個數(shù)據(jù),從最低位開始
  62.                 i=6;
  63.                 while(i--); //延時68us,持續(xù)時間最少60us
  64.                 DSPORT=1;        //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數(shù)值
  65.                 dat>>=1;
  66.         }
  67. }



  68. unsigned char Ds18b20ReadByte()        //向18B20讀取一個字節(jié)
  69. {
  70.         unsigned char byte,bi;
  71.         unsigned int i,j;        
  72.         for(j=8;j>0;j--)
  73.         {
  74.                 DSPORT=0;//先將總線拉低1us
  75.                 i++;
  76.                 DSPORT=1;//然后釋放總線
  77.                 i++;
  78.                 i++;//延時6us等待數(shù)據(jù)穩(wěn)定
  79.                 bi=DSPORT;         //讀取數(shù)據(jù),從最低位開始讀取
  80.                 /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
  81.                 byte=(byte>>1)|(bi<<7);                                                  
  82.                 i=4;                //讀取完之后等待48us再接著讀取下一個數(shù)
  83.                 while(i--);
  84.         }                                
  85.         return byte;
  86. }


  87. void  Ds18b20ChangTemp()  //讓18B20轉(zhuǎn)換溫度
  88. {
  89.         Ds18b20Init();
  90.         delay_ms(1);
  91.         Ds18b20WriteByte(0xcc);                //跳過ROM操作命令                 
  92.         Ds18b20WriteByte(0x44);            //溫度轉(zhuǎn)換命令

  93. }


  94. void  Ds18b20ReadTempCom()           //讓18B20 讀取溫度
  95. {        

  96.         Ds18b20Init();
  97.         delay_ms(1);
  98.         Ds18b20WriteByte(0xcc);         //跳過ROM操作命令
  99.         Ds18b20WriteByte(0xbe);         //發(fā)送讀取溫度命令
  100. }


  101. int Ds18b20ReadTemp()        //讀取溫度返回數(shù)值
  102. {
  103.         int temp=0;
  104.         unsigned char tmh,tml;
  105.         Ds18b20ChangTemp();                                 //先寫入轉(zhuǎn)換命令
  106.         Ds18b20ReadTempCom();                        //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  107.         tml=Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節(jié)
  108.         tmh=Ds18b20ReadByte();                //再讀高字節(jié)
  109.         temp=tmh;
  110.         temp<<=8;
  111.         temp|=tml;
  112.         return temp;
  113. }

  114. void wendu_shuji()
  115. {
  116.         temp=Ds18b20ReadTemp();
  117.         tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  118.         temp=tp*0.0625*100+0.5;
  119.         c1 = temp % 10000 / 1000;
  120.         c2 = temp % 1000 / 100;
  121.         Show[7]=TableCC[c1];
  122.         Show[6]=TableCC[c2];               
  123. }

  124. void Timer0_Init()                 //定時器初始化
  125. {
  126.     TMOD |= 0x01; //選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
  127.     TH0 =(65536 - 50000)/256;         //給定時器賦初值
  128.     TL0 =(65536 - 50000)%256;
  129.            TR0=1;//打開定時器        
  130.         ET0=1;//打開定時器0中斷允許
  131.         EA=1;//打開總中斷
  132. }



  133. void TimeTim()           //時鐘正常走
  134. {
  135.      if(settype == 0 && alarmvalue == 0)     //當不在鬧鐘狀態(tài)也不在修改時間狀態(tài)的時候時間正常走
  136.      {
  137.          if(b>=20)
  138.          {
  139.             b=0;
  140.             sec++;
  141.             if(sec == 60)
  142.             {
  143.                 sec = 0;
  144.                 min++;
  145.                 if(min == 60)
  146.                 {
  147.                     min = 0;
  148.                     hour++;
  149.                     if(hour == 24)
  150.                     {
  151.                         hour = 0;
  152.                     }
  153.                 }
  154.             }
  155.          }
  156.     }
  157. }

  158. void bsp_CheckAlarm(void)        //檢查時間是否到了鬧鐘時間
  159. {
  160.         unsigned char a=0;
  161.     if((hour == ahour) && (min == amin) && (sec == asec))
  162.     {
  163.                 while(1)
  164.                 {
  165.                 beep=~beep;
  166.                         delay_us(100);
  167.                         if(k1 == 0)//K1按鍵被按下
  168.                     {
  169.                                 delay(1000);
  170.                                 if(k1 == 0)
  171.                                 {         
  172.                                         beep=0;
  173.                                         a=1;
  174.                                 }  
  175.                                 while(!k1);//等待按鍵釋放               
  176.                     }   
  177.                          if(a == 1)
  178.                         {
  179.                                  break;
  180.                         }
  181.                 }        
  182.     }
  183. }                              
  184.         


  185. void bsp_KeyScan(void)           //掃描鍵盤那個鍵被按下
  186. {
  187.     if(k1 == 0)//K1按鍵被按下
  188.     {
  189.                 delay(1000);
  190.                 if(k1==0)
  191.                 {                        
  192.                 keyvalue = 1;
  193.                 }
  194.         while(!k1);//等待按鍵釋放

  195.     }

  196.     if(k2 == 0)
  197.     {
  198.                 delay(1000);
  199.                 if(k2==0)
  200.                 {
  201.                 keyvalue = 2;
  202.              }   
  203.                  while(!k2);        
  204.     }

  205.     if(k3 == 0)
  206.     {
  207.                 delay(1000);
  208.                 if(k3==0)
  209.                 {
  210.                 keyvalue = 3;
  211.                 }
  212.         while(!k3);
  213.     }

  214.     if(k4 == 0)
  215.     {
  216.                 delay(1000);
  217.                 if(k4==0)
  218.                 {
  219.                 keyvalue = 4;
  220.                 }
  221.         while(!k4);
  222.     }
  223. }


  224. void timeadd()    //時間加1
  225. {
  226.     if(settype == 1)
  227.     {
  228.         if(sec < 59)
  229.         {
  230.             sec++;
  231.         }

  232.         else
  233.         {
  234.             sec = 0;
  235.         }
  236.     }

  237.     else if(settype == 2)
  238.     {
  239.         if(min < 59)
  240.         {
  241.             min++;
  242.         }

  243.         else
  244.         {
  245.             min = 0;
  246.         }
  247.     }

  248.     else if(settype == 3)
  249.     {
  250.         if(hour < 23)
  251.         {
  252.             hour++;
  253.         }

  254.         else
  255.         {
  256.             hour = 0;
  257.         }
  258.     }


  259.     if(alarmvalue == 1)           //設置鬧鐘加1
  260.     {
  261.         if(asec < 59)
  262.         {
  263.             asec++;
  264.         }

  265.         else
  266.         {
  267.             asec = 0;
  268.         }
  269.     }

  270.     else if(alarmvalue == 2)
  271.     {
  272.         if(amin < 59)
  273.         {
  274.             amin++;
  275.         }

  276.         else
  277.         {
  278.             amin = 0;
  279.         }
  280.     }

  281.     else if(alarmvalue == 3)
  282.     {
  283.         if(ahour < 23)
  284.         {
  285.             ahour++;
  286.         }

  287.         else
  288.         {
  289.             ahour = 0;
  290.         }
  291.     }
  292. }




  293. void timedec()  //時間減一
  294. {

  295.     if(settype == 1)
  296.     {
  297.         if(sec > 0)
  298.         {
  299.             sec--;
  300.         }

  301.         else
  302.         {
  303.             sec = 59;
  304.         }
  305.     }

  306.     else if(settype == 2)
  307.     {
  308.         if(min > 0)
  309.         {
  310.             min--;
  311.         }

  312.         else
  313.         {
  314.             min = 59;
  315.         }
  316.     }

  317.     else if(settype == 3)
  318.     {
  319.         if(hour > 0)
  320.         {
  321.             hour--;
  322.         }

  323.         else
  324.         {
  325.             hour = 23;
  326.         }
  327.     }


  328.     if(alarmvalue == 1)                  //設置鬧鐘減1
  329.     {
  330.         if(asec > 0)
  331.         {
  332.             asec--;
  333.         }

  334.         else
  335.         {
  336.             asec = 59;
  337.         }
  338.     }

  339.     else if(alarmvalue == 2)
  340.     {
  341.         if(amin > 0)
  342.         {
  343.             amin--;
  344.         }

  345.         else
  346.         {
  347.             amin = 59;
  348.         }
  349.     }

  350.     else if(alarmvalue == 3)
  351.     {
  352.         if(ahour > 0)
  353.         {
  354.             ahour--;
  355.         }

  356.         else
  357.         {
  358.             ahour = 23;
  359.         }
  360.     }
  361. }

  362. void bsp_KeyProc(unsigned char keyv)
  363. {
  364.     if(keyv == 1)
  365.     {
  366.         settype++;
  367.         if(settype == 4)
  368.         {
  369.             settype = 0;
  370.         }
  371.         keyvalue = 0;    //鍵值要清0!!!
  372.     }

  373.     if(keyv == 2)
  374.     {
  375.         alarmvalue++;
  376.         if(alarmvalue == 4)
  377.         {
  378.             alarmvalue = 0;
  379.         }
  380.         keyvalue = 0;
  381.     }

  382.     if(keyv == 3)
  383.     {
  384.         timeadd();
  385.         keyvalue = 0;
  386.     }

  387.     if(keyv == 4)
  388.     {
  389.         timedec();
  390.         keyvalue = 0;
  391.     }
  392. }

  393. void SetValueShow(void)
  394. {
  395.     if(alarmvalue == 0) //當不在鬧鐘狀態(tài)時數(shù)碼管顯示正常的時間
  396.     {
  397.         Show[5] = TableCC[hour/10];
  398.         if(settype == 3)
  399.                Show[4] = TableCC[hour%10] | 0x80;
  400.         else
  401.                Show[4] = TableCC[hour%10];
  402.         Show[3] = TableCC[min/10];
  403.         if(settype == 2)
  404.              Show[2] = TableCC[min%10] | 0x80;
  405.         else
  406.                Show[2] = TableCC[min%10];
  407.         Show[1] = TableCC[sec/10];
  408.         if(settype == 1)
  409.         Show[0] = TableCC[sec%10] | 0x80;
  410.         else
  411.         Show[0] = TableCC[sec%10];
  412.     }

  413.     //在鬧鐘狀態(tài)數(shù)碼管顯示鬧鐘設置的時間
  414.     else
  415.     {
  416.         Show[5] = TableCC[ahour/10];
  417.         if(alarmvalue == 3)
  418.         Show[4] = TableCC[ahour%10] | 0x80;
  419.         else
  420.         Show[4] = TableCC[ahour%10];
  421.         Show[3] = TableCC[amin/10];
  422.         if(alarmvalue == 2)
  423.         Show[2] = TableCC[amin%10] | 0x80;
  424.         else
  425.         Show[2] = TableCC[amin%10];
  426.         Show[1] = TableCC[asec/10];
  427.         if(alarmvalue == 1)
  428.         Show[0] = TableCC[asec%10] | 0x80;
  429.         else
  430.         Show[0] = TableCC[asec%10];
  431.     }
  432. }   

  433. void DigDisplay()
  434. {
  435.         int i;
  436.         for(i=0;i<8;i++)
  437.         {
  438.                 switch(i)         //位選,選擇點亮的數(shù)碼管,
  439.                 {
  440.                         case(0):
  441.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  442.                         case(1):
  443.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  444.                         case(2):
  445.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  446.                         case(3):
  447.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  448.                         case(4):
  449.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  450.                         case(5):
  451.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  452.                         case(6):
  453.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  454.                         case(7):
  455.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位
  456.                                        
  457.                 }
  458.                 P0=Show[i];//發(fā)送段碼
  459.                 delay(100); //間隔一段時間掃描        
  460.                 P0=0x00;//消隱
  461.         }
  462. }




  463. void main()
  464. {
  465.         k1=1;
  466.         k2=1;   
  467.          k3=1;        
  468.         k4=1;
  469.     Timer0_Init();         //計時器的初始化
  470.     while(1)
  471.     {
  472.                 wendu_shuji();         //溫度
  473.         TimeTim();              //正常時間在走
  474.         bsp_KeyScan();          //鍵盤掃描看哪個功能鍵被按下
  475.         bsp_KeyProc(keyvalue);  //根據(jù)鍵值進行相應的功能處理
  476.         SetValueShow();         //數(shù)碼管上顯示的值
  477.         DigDisplay();            //顯示在數(shù)碼管上
  478.         bsp_CheckAlarm();       //鬧鐘檢查
  479.     }   
  480. }
  481. void Timer0(void) interrupt 1        //定時器的中斷服務程序
  482. {
  483.     TH0 = (65536 - 50000)/256;
  484.     TL0 = (65536 - 50000)%256;
  485.     b++;
  486. }
復制代碼


Keil代碼下載: 最終.rar (26.26 KB, 下載次數(shù): 16)

評分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲在线 | 一区二区三区中文字幕 | 91成人小视频 | 久久er99热精品一区二区 | 午夜在线小视频 | 蜜桃视频一区二区三区 | 精品国产不卡一区二区三区 | 九九在线视频 | 国产激情毛片 | 日韩欧美久久精品 | 中文字幕国产一区 | 成人免费观看男女羞羞视频 | 精品久久av | 国产精品久久久久一区二区 | 伊人春色在线 | 日韩欧美精品在线播放 | 成人欧美一区二区三区黑人孕妇 | 免费在线视频一区二区 | 欧美福利精品 | 日韩中文一区 | 一区在线免费视频 | 2022精品国偷自产免费观看 | 黄网站在线观看 | 91在线视频免费观看 | 国产高清免费在线 | 亚洲一区在线日韩在线深爱 | 久久av一区 | 精品一区二区三区中文字幕 | 国产aⅴ精品 | 日韩精品一区二 | 综合色在线 | 日本一区二区三区视频在线 | 亚洲国产一区二区三区, | 99久久免费精品国产免费高清 | 毛片一区二区 | 国产不卡在线播放 | 麻豆av片 | 久久91 | 91精品国产日韩91久久久久久 | 午夜精品| 少妇一级淫片aaaaaaaaa |