找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6912|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)DS18B20溫度傳感器程序代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:97104 發(fā)表于 2015-11-25 16:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)DS18B20溫度傳感器
  1. ////////////////////////////////////////////////////////////////////////////
  2. //                給力者單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng),開(kāi)發(fā)學(xué)習(xí)都給力!              //
  3. ////////////////////////////////////////////////////////////////////////////
  4. //                     學(xué)習(xí)51單片機(jī),其實(shí)可以很簡(jiǎn)單                       //
  5. ////////////////////////////////////////////////////////////////////////////
  6. //                寧波芯動(dòng)電子有限公司 //
  7. ////////////////////////////////////////////////////////////////////////////

  8. #include <AT89X52.h>       //調(diào)用51單片機(jī)的頭文件
  9. #include <Intrins.h>  
  10. //---------------------------------------
  11. //1602液晶相關(guān)I/O設(shè)置
  12. sbit E=P2^3;               //1602液晶的E腳接在P2.3口上
  13. sbit RW=P2^4;              //1602液晶的RW腳接在P2.4口上
  14. sbit RS=P2^5;              //1602液晶的RS腳接在P2.5口上
  15. //---------------------------------------
  16. sbit ds18b20=P3^7;        
  17. //---------------------------------------
  18. //1602液晶寄存器設(shè)置
  19. unsigned char DISbuf;     //設(shè)置8位的unsigend char型寄存器用來(lái)暫存1602要顯示的內(nèi)容
  20. //---------------------------------------

  21.          
  22. unsigned char temp1;
  23. unsigned char temp2;
  24. unsigned char temp1buf1;
  25. unsigned char temp1buf2;
  26. bit tc;
  27. bit no;
  28. unsigned char code tablexiao[16]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};

  29. //---------------------------------------
  30. //名稱(chēng):延時(shí)函數(shù)
  31. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  32. //公司:寧波芯動(dòng)電子有限公司

  33. //日期:20120916
  34. //---------------------------------------
  35. void Delay(unsigned int nTimeDelay)
  36. {
  37.     unsigned int i;
  38.     while (nTimeDelay--)
  39.         for (i=0;i<125;i++)
  40.         {}
  41. }

  42. //---------------------------------------
  43. //名稱(chēng):復(fù)位DS18B20函數(shù)
  44. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  45. //公司:寧波芯動(dòng)電子有限公司

  46. //日期:20120916
  47. //---------------------------------------
  48. void Reset()
  49. {
  50.     unsigned int i;
  51.    
  52.     ds18b20=0;     //拉低DQ總線開(kāi)始復(fù)位        
  53.     i=206;
  54.     while(i>0)
  55.         i--;       //保持DQ低大約900uS            
  56.     ds18b20=1;     //釋放DQ位   
  57.     i=8;
  58.     while(i>0)
  59.         i--;
  60. }

  61. //---------------------------------------
  62. //名稱(chēng):等待芯片應(yīng)答信號(hào)函數(shù)
  63. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  64. //公司:寧波芯動(dòng)電子有限公司

  65. //日期:20120916
  66. //---------------------------------------
  67. bit WaitPresence()
  68. {
  69.     unsigned char i;
  70.     bit k;
  71.     i=16;
  72.     while(i>0)
  73.         i--;
  74.    
  75.         if(ds18b20==0)
  76.           k=1;
  77.         else
  78.           k=0;

  79.     i=72;
  80.     while(i>0)
  81.         i--;
  82.         return k;
  83.    
  84. }

  85. //---------------------------------------
  86. //名稱(chēng):讀一位數(shù)據(jù)函數(shù)
  87. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  88. //公司:寧波芯動(dòng)電子有限公司

  89. //日期:20120916
  90. //---------------------------------------
  91. bit ReadBit()
  92. {
  93.     unsigned int i;
  94.     bit dat;   
  95.     ds18b20=0;

  96.     i++;
  97.    
  98.     ds18b20=1;
  99.     i+=2;
  100.    
  101.     dat=ds18b20;           
  102.     i=16;
  103.     while(i>0)
  104.         i--;

  105.     return dat;
  106. }

  107. //---------------------------------------
  108. //名稱(chēng):讀一字節(jié)函數(shù)
  109. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  110. //公司:寧波芯動(dòng)電子有限公司

  111. //日期:20120916
  112. //---------------------------------------
  113. unsigned char ReadByte()
  114. {
  115.     unsigned char i,j,dat;

  116.     dat=0;

  117.     for(i=1;i<=8;i++)
  118.     {
  119.         j=ReadBit();
  120.         dat=(j<<7) | (dat>>1);
  121.     }

  122.     return dat;
  123. }

  124. //---------------------------------------
  125. //名稱(chēng):寫(xiě)一字節(jié)函數(shù)
  126. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  127. //公司:寧波芯動(dòng)電子有限公司

  128. //日期:20120916
  129. //---------------------------------------
  130. void WriteByte(unsigned char dat)
  131. {
  132.     unsigned int i;
  133.     unsigned char j;
  134.     bit testb;

  135.     for(j=1;j<=8;j++)
  136.     {
  137.         testb=dat & 0x01;
  138.         dat=dat>>1;

  139.         if(testb)
  140.         {
  141.             ds18b20=0;               
  142.             i+=2;
  143.             
  144.             ds18b20=1;                 
  145.             i=8;
  146.             while(i>0)
  147.                 i--;
  148.         }
  149.         else
  150.         {            
  151.             ds18b20=0;                 
  152.             i=8;
  153.             while(i>0)
  154.                 i--;

  155.             
  156.             ds18b20=1;                 
  157.             i+=2;
  158.         }
  159.     }
  160. }

  161. //---------------------------------------
  162. //名稱(chēng):DS18B20溫度轉(zhuǎn)換函數(shù)
  163. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  164. //公司:寧波芯動(dòng)電子有限公司

  165. //日期:20120916
  166. //---------------------------------------
  167. bit Convert()
  168. {   
  169.     Reset();
  170.     if(WaitPresence()==1)
  171.         {
  172.       Delay(1);
  173.       WriteByte(0xcc);//skip rom
  174.       WriteByte(0x44);//convert         
  175.           return 1;
  176.         }
  177.         else
  178.         {         
  179.           return 0;
  180.         }
  181. }

  182. //---------------------------------------
  183. //名稱(chēng):轉(zhuǎn)換結(jié)束處理函數(shù)
  184. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  185. //公司:寧波芯動(dòng)電子有限公司

  186. //日期:20120916
  187. //---------------------------------------
  188. bit ReadFlash()
  189. {   
  190.     unsigned char nLsb,nMsb;        
  191.     Reset();        
  192.     if(WaitPresence()==1)
  193.         {
  194.       Delay(1);
  195.       WriteByte(0xcc);//skip rom
  196.       WriteByte(0xbe);//convert
  197.       nLsb=ReadByte();//LSB
  198.       nMsb=ReadByte();//MSB         
  199.           if(no==1) return 1;         
  200.           temp2=nLsb&0x0f;
  201.       temp1=(nLsb>>4)|(nMsb<<4);         
  202.           return 1;
  203.         }
  204.         else
  205.         {
  206.           return 0;
  207.         }
  208. }
  209. //---------------------------------------
  210. //名稱(chēng):1602液晶忙檢測(cè)函數(shù)
  211. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  212. //公司:寧波芯動(dòng)電子有限公司

  213. //日期:20120916
  214. //---------------------------------------
  215. void LCD1602_busy(void)
  216. {
  217.      P0_7=1;              //將P0.7置1,為讀狀態(tài)做準(zhǔn)備
  218.      RS=0;                //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  219.      RW=1;                //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  220.      E=1;                 //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  221.      while(P0_7==1);      //由P0.7讀入1,表示1602液晶忙,需要等待
  222.      E=0;                 //讀完以后,恢復(fù)E的電平
  223. }

  224. //---------------------------------------
  225. //名稱(chēng):1600寫(xiě)命令函數(shù)
  226. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  227. //公司:寧波芯動(dòng)電子有限公司

  228. //日期:20120916
  229. //---------------------------------------
  230. void LCD1602_Write_com(unsigned char combuf)
  231. {
  232.      RS=0;                //選擇指令寄存器
  233.      RW=0;                //選擇寫(xiě)狀態(tài)
  234.      P0=combuf;           //將命令字通過(guò)P0口送至DB
  235.      E=1;                 //E高電平將命令字寫(xiě)入1602液晶
  236.      E=0;                 //寫(xiě)完以后,恢復(fù)E的電平
  237. }

  238. //---------------------------------------
  239. //名稱(chēng):1602寫(xiě)命令函數(shù)(帶忙檢測(cè))
  240. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  241. //公司:寧波芯動(dòng)電子有限公司

  242. //日期:20120916
  243. //---------------------------------------
  244. void LCD1602_Write_com_busy(unsigned char combuf)
  245. {
  246.      LCD1602_busy();            //調(diào)用忙檢測(cè)函數(shù)
  247.      LCD1602_Write_com(combuf); //調(diào)用忙檢測(cè)函數(shù)
  248. }

  249. //---------------------------------------
  250. //名稱(chēng):1602寫(xiě)數(shù)據(jù)函數(shù)(帶忙檢測(cè))
  251. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  252. //公司:寧波芯動(dòng)電子有限公司

  253. //日期:20120916
  254. //---------------------------------------
  255. void LCD1602_Write_data_busy(unsigned char databuf)
  256. {
  257.      LCD1602_busy();      //調(diào)用忙檢測(cè)函數(shù)
  258.      RS=1;                //選擇數(shù)據(jù)寄存器
  259.      RW=0;                //選擇寫(xiě)狀態(tài)
  260.      P0=databuf;          //將命令字通過(guò)P0口送至DB
  261.      E=1;                 //E高電平將命令字寫(xiě)入1602液晶
  262.      E=0;                 //寫(xiě)完以后,恢復(fù)E的電平
  263. }

  264. //---------------------------------------
  265. //名稱(chēng):1602液晶顯示地址寫(xiě)函數(shù)
  266. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  267. //公司:寧波芯動(dòng)電子有限公司

  268. //日期:20120916
  269. //---------------------------------------
  270. void LCD1602_Write_address(unsigned char x,unsigned char y)
  271. {
  272.      x&=0x0f;             //列地址限制在0-15間
  273.      y&=0x01;             //行地址限制在0-1間
  274.      if(y==0)             //如果是第一行
  275.          LCD1602_Write_com_busy(x|0x80);        //將列地址寫(xiě)入
  276.      else                 //如果是第二行
  277.          LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫(xiě)入
  278. }

  279. //---------------------------------------
  280. //名稱(chēng):1602液晶初始化函數(shù)
  281. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  282. //公司:寧波芯動(dòng)電子有限公司

  283. //日期:20120916
  284. //---------------------------------------
  285. void LCD1602_init(void)
  286. {
  287.      Delay(150);               //調(diào)用延時(shí)函數(shù)
  288.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  289.      Delay(50);                //調(diào)用延時(shí)函數(shù)
  290.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  291.      Delay(50);                //調(diào)用延時(shí)函數(shù)
  292.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  293.      LCD1602_Write_com_busy(0x38);  //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  294.      LCD1602_Write_com_busy(0x08);  //顯示功能關(guān),無(wú)光標(biāo)
  295.      LCD1602_Write_com_busy(0x01);  //清屏
  296.      LCD1602_Write_com_busy(0x06);  //寫(xiě)入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)
  297.      LCD1602_Write_com_busy(0x0C);  //顯示功能開(kāi),無(wú)光標(biāo)
  298. }

  299. //---------------------------------------
  300. //名稱(chēng):1602液晶指定地址顯示函數(shù)
  301. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  302. //公司:寧波芯動(dòng)電子有限公司

  303. //日期:20120916
  304. //---------------------------------------
  305. void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  306. {
  307.      LCD1602_Write_address(x,y);    //先將地址信息寫(xiě)入
  308.      LCD1602_Write_data_busy(buf);  //再寫(xiě)入要顯示的數(shù)據(jù)
  309. }

  310. //---------------------------------------
  311. //名稱(chēng): 主函數(shù)
  312. //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
  313. //公司:寧波芯動(dòng)電子有限公司

  314. //日期:20120916
  315. //---------------------------------------
  316. void main(void)            //主函數(shù),單片機(jī)開(kāi)機(jī)后就是從這個(gè)函數(shù)開(kāi)始運(yùn)行
  317. {
  318.         unsigned char buf;
  319.    LCD1602_init();        //調(diào)用1602液晶初始化函數(shù)
  320.    while(1)               //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個(gè)死循環(huán)
  321.    {
  322.             tc=Convert();                                        //啟動(dòng)轉(zhuǎn)換
  323.       if(tc==1)                                                 //轉(zhuǎn)換結(jié)束
  324.                 {            
  325.                     ReadFlash();                       //讀取溫度                           
  326.          if(temp1>80) temp1=0;                        
  327.                          if(temp2>15) temp2=0;         
  328.                         buf=temp1/10;                        
  329.                         buf+=0x30;                        
  330.                         LCD1602_Disp(0,0,buf);  //溫度整數(shù)部分十位
  331.                         buf=temp1%10;
  332.                         buf+=0x30;                        
  333.                    LCD1602_Disp(1,0,buf);  //溫度整數(shù)部分個(gè)位
  334.                         LCD1602_Disp(2,0,0x2e);  //.
  335.                         buf=tablexiao[temp2&0x0f];
  336.                         buf+=0x30;
  337.                         LCD1602_Disp(3,0,buf);  //溫度小數(shù)部分
  338.                         LCD1602_Disp(4,0,0xdf);   //.
  339.                         LCD1602_Disp(5,0,0x43);   //C                                                                  
  340.             }   
  341.     }
  342. }

復(fù)制代碼


DS18B20溫度傳感器.rar

22.59 KB, 下載次數(shù): 13, 下載積分: 黑幣 -5

DS18B20溫度傳感器

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:191450 發(fā)表于 2017-5-1 16:21 | 只看該作者
please give me schematic diagram
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表