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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

89c51單片機+ds18b20實現溫度檢測及設定

[復制鏈接]
跳轉到指定樓層
樓主
89c51+ds18b20實現溫度檢測及設定
文檔中有原理圖及程序。親測可行
  • 顯示電路
數碼管采用共陽數碼管
   

共陽數碼管結構圖                  數碼管上對應的各段

例如:1的字形碼為 0xf9;0為0xc0;
  • 按鍵電路

            
矩陣式鍵盤的優缺點:在按鍵多時,占用的I/O少,但程序編寫復雜。

獨立式鍵盤的優缺點:占用的I/O多,但程序編寫簡單。
本次設計為獨立鍵盤(所選單片機I/O足夠用)
  • 溫度檢測電路
  • 數字式溫度傳感器DS18B20
                    






程序(此程序只能做到左側兩個數碼管顯示設定溫度,右側兩個數碼管顯示測量的溫度,并沒有實現溫度的控制調節功能)


單片機源程序如下:
  1. #include      //52系列頭文件
  2. #include   //特殊寄存器頭文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #include

  6. //--定義要使用的IO口--//

  7. #define GPIO_DIG   P0              //段選
  8. #define GPIO_PLACE P2              //位選
  9. sbit DSPORT=P3^7;
  10. unsigned char code DIG_PLACE[8] = {
  11. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選控制   查表的方法控制
  12. unsigned char code DIG_CODE[17] = {
  13. 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8 ,
  14.   0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  15. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
  16. unsigned char DisplayData[5];//用來存放要顯示的8位數的值
  17. void Delay10ms(unsigned int c);   //延時10ms
  18. void Key_Scan();
  19. void DigDisplay();
  20. uchar Ds18b20Init();                           //初始化程序
  21. sbit key1=P3^4;                                                                                                                              //設定溫度加
  22. sbit key2=P3^5;                                                                                                                              //設定溫度減
  23. void Ds18b20WriteByte(uchar dat);                                                        //寫一個字節
  24. uchar Ds18b20ReadByte();                                                                                    //讀一個字節
  25. void  Ds18b20ChangTemp();                                                                                    //轉換溫度
  26. void  Ds18b20ReadTempCom();                                                                                    //發送讀取溫度命令
  27. int Ds18b20ReadTemp();                                                                                                  //讀取溫度命令
  28. int   sdtemp1=30;
  29. int  wendu;                                                                                                                                              //定義臨時變量
  30. /********************主程序*****************************************8 */
  31. void main(void)
  32. {            
  33.               while (1)
  34.               {            
  35.                                           Key_Scan();
  36.                                           DigDisplay();
  37.                                           DisplayData[0]=DIG_CODE[sdtemp1/10];
  38.                       DisplayData[1]=DIG_CODE[sdtemp1%10];
  39.                                           wendu=Ds18b20ReadTemp();
  40.                                           wendu=wendu>>4;
  41.                                           DisplayData[2] = DIG_CODE[wendu%100/10];
  42.             DisplayData[3] = DIG_CODE[wendu % 10];


  43.             
  44.               }
  45. }                              

  46. /***************按鍵掃描程序*******************************************/
  47. void  Key_Scan()
  48. {
  49.     //--檢測按鍵1--//
  50.               if (key1== 0)                            //檢測按鍵K1是否按下
  51.               {
  52.                             Delay10ms(1);              //消除抖動
  53.                             if (key1== 0)              //再次檢測按鍵是否按下               
  54.                             {  //DigDisplay();
  55.                                sdtemp1=sdtemp1+1;
  56.                                           if(sdtemp1>99)              sdtemp1=30;
  57.                             //              DigDisplay();
  58.                                           while (!key1 )              //檢測按鍵是否松開
  59.                                           {//Delay10ms(20);
  60.                                           DigDisplay();
  61.                                          
  62.                                           }
  63.                                                                                     
  64.                             }
  65.               }

  66.                 if (key2== 0)                            //檢測按鍵K1是否按下
  67.               {              DigDisplay();
  68.                             Delay10ms(1);              //消除抖動

  69.                             if (key2== 0)              //再次檢測按鍵是否按下               
  70.                             {  DigDisplay();
  71.                                sdtemp1=sdtemp1-1;
  72.                                           if(sdtemp1<15)              sdtemp1=15;

  73.                                           while (!key2 )              //檢測按鍵是否松開
  74.                                                         { //Delay10ms(2);
  75.                                           DigDisplay();
  76.                                          
  77.                                           }   
  78.                             }
  79.               }
  80. }
  81. /***************************************************
  82. 函數名                            :Delay
  83. 函數功能              :延時
  84. 輸入                            :無
  85. 輸出                            :無
  86. ***************************************************/
  87. void Delay10ms(unsigned int c)   //誤差 0us
  88. {
  89.     unsigned char a, b;

  90.               //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
  91.     for (;c>0;c--)
  92.               {
  93.                             for (b=38;b>0;b--)
  94.                             {
  95.                                           for (a=130;a>0;a--);
  96.                             }

  97.               }      
  98. }
  99. /*******************************************************************************
  100. * 函 數 名         : DigDisplay
  101. * 函數功能                               : 使用數碼管顯示
  102. * 輸    入         : 無
  103. * 輸    出         : 無
  104. *******************************************************************************/

  105. void DigDisplay()
  106. {
  107.               unsigned char i;
  108.               unsigned int j;

  109.             
  110.               for(i=0; i<4; i++)
  111.               {
  112.                             GPIO_PLACE = DIG_PLACE[i];              //發送位選
  113.                             GPIO_DIG = DisplayData[i];     //發送段碼

  114.                   j = 80;                                                                                    //掃描間隔時間設定
  115.                             while(j--);            
  116.                             GPIO_DIG = 0xFF;//消隱
  117.               }

  118. }
  119. /*******************************************************************************
  120. * 函 數 名         : Ds18b20Init
  121. * 函數功能                               : 初始化
  122. * 輸    入         : 無
  123. * 輸    出         : 初始化成功返回1,失敗返回0
  124. *******************************************************************************/

  125. uchar Ds18b20Init()
  126. {
  127.               uchar i;
  128.               DSPORT = 0;                                          //將總線拉低480us~960us
  129.               i = 70;            
  130.               while(i--);//延時642us
  131.               DSPORT = 1;                                          //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
  132.               i = 0;
  133.               while(DSPORT)              //等待DS18B20拉低總線
  134.               {
  135. DigDisplay();
  136.               //              Delay1ms(1);
  137.                             i++;
  138.                             if(i>5)//等待>5MS
  139.                             {
  140.                                           return 0;//初始化失敗
  141.                             }
  142.             
  143.               }
  144.               return 1;//初始化成功
  145. }
  146. /*******************************************************************************
  147. * 函 數 名         : Ds18b20WriteByte
  148. * 函數功能                               : 向18B20寫入一個字節
  149. * 輸    入         : com
  150. * 輸    出         : 無
  151. *******************************************************************************/

  152. void Ds18b20WriteByte(uchar dat)
  153. {
  154.               uint i, j;

  155.               for(j=0; j<8; j++)
  156.               {
  157.                             DSPORT = 0;                                   //每寫入一位數據之前先把總線拉低1us
  158.                             i++;
  159.                             DSPORT = dat & 0x01;  //然后寫入一個數據,從最低位開始
  160.                             i=6;
  161.                             while(i--); //延時68us,持續時間最少60us
  162.                             DSPORT = 1;              //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
  163.                             dat >>= 1;
  164.               }
  165. }
  166. /*******************************************************************************
  167. * 函 數 名         : Ds18b20ReadByte
  168. * 函數功能                               : 讀取一個字節
  169. * 輸    入         : com
  170. * 輸    出         : 無
  171. *******************************************************************************/


  172. uchar Ds18b20ReadByte()
  173. {
  174.               uchar byte, bi;
  175.               uint i, j;            
  176.               for(j=8; j>0; j--)
  177.               {
  178.                             DSPORT = 0;//先將總線拉低1us
  179.                             i++;
  180.                             DSPORT = 1;//然后釋放總線
  181.                             i++;
  182.                             i++;//延時6us等待數據穩定
  183.                             bi = DSPORT;              //讀取數據,從最低位開始讀取
  184.                             /*將byte右移移一位,然后與上左移7位后的bi,注意移動之后移掉那位補0。*/
  185.                             byte = (byte >> 1) | (bi << 7);                                                                                    
  186.                             i = 4;                            //讀取完之后等待48us再接著讀取下一個數
  187.                             while(i--);
  188.               }                                                      
  189.               return byte;
  190. }
  191. /*******************************************************************************
  192. * 函 數 名         : Ds18b20ChangTemp
  193. * 函數功能                               : 讓18b20開始轉換溫度
  194. * 輸    入         : com
  195. * 輸    出         : 無
  196. *******************************************************************************/

  197. void  Ds18b20ChangTemp()
  198. {
  199.               Ds18b20Init();
  200. DigDisplay();//              Delay1ms(1);
  201.               Ds18b20WriteByte(0xcc);                            //跳過ROM操作命令                           
  202.               Ds18b20WriteByte(0x44);                  //溫度轉換命令
  203. //              Delay1ms(100);              //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了

  204. }
  205. /*******************************************************************************
  206. * 函 數 名         : Ds18b20ReadTempCom
  207. * 函數功能                               : 發送讀取溫度命令
  208. * 輸    入         : com
  209. * 輸    出         : 無
  210. *******************************************************************************/

  211. void  Ds18b20ReadTempCom()
  212. {            
  213. ……………………

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

所有資料51hei提供下載:
所有文檔.doc (115.5 KB, 下載次數: 33)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品二三区 | h在线播放 | 国产一区二区三区四区三区四 | 亚洲午夜精品一区二区三区 | 欧美激情在线精品一区二区三区 | 久久国产日本 | 国产精品女人久久久 | 国产美女自拍视频 | 天天干狠狠操 | 久久久久久国产精品久久 | 青青草原精品99久久精品66 | 久久精品手机视频 | 日本精品在线播放 | 亚洲精品小视频在线观看 | 99久久免费精品国产免费高清 | 国产亚洲精品精品国产亚洲综合 | 精品国产免费一区二区三区演员表 | 中文一区二区 | www.99re| 国产欧美日韩精品在线观看 | 日日碰狠狠躁久久躁婷婷 | 成人中文字幕在线观看 | 久草中文在线 | 国产成人99久久亚洲综合精品 | 色婷婷综合久久久中文字幕 | av片在线免费看 | 1000部精品久久久久久久久 | 欧美亚洲高清 | 免费观看黄网站 | 亚洲视频欧美视频 | 亚洲欧美久久 | 久久伊 | 欧美不卡网站 | 中文字幕不卡在线88 | 国产日韩一区 | 欧产日产国产精品视频 | 亚洲成人一区二区三区 | 一级片成人 | 99热国产免费 | 香蕉大人久久国产成人av | 亚洲国产精品一区二区三区 |