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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16989|回復: 23
收起左側

單片機+DS18B20+LCD1602溫度檢測,注釋超級詳細,適合新手。

  [復制鏈接]
ID:484960 發表于 2019-5-7 16:46 | 顯示全部樓層 |閱讀模式
單片機+DS18B20+LCD1602  溫度檢測,注釋超級詳細,適合新手。
需要的下載自取,解壓后即可。包括C文件以及hex文件   晶振使用的是11.0592MHZ

  •   硬件電路設計
(1)復位電路設計
通過Vcc(+5V)電源給電容C充電,然后加給RST引腳一個短暫的高電平信號,此信號隨著Vcc對電容C的充電過程而逐漸回落。RST引腳上的高電平大于復位要求的高電平時間。(電路中使用10千歐電阻,10微法電解電容),如圖2所示。
圖2 復位電路
(2)時鐘電路設計
本設計采用內部時鐘方式。AT89S52單片機內部有一個用于構成振蕩器的高增益反相放大器,它的輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2。這兩個引腳外部跨接石英晶體振蕩器和微調電容,構成一個穩定的自激振蕩器。(電路中使用2個30皮法的瓷片電容,12MHZ晶振)如圖3所示。

圖3時鐘電路
(3)溫度測量電路設計
溫度傳感器采用美國DALLAS半導體公司生產的DS18B20,與傳統的熱敏電阻等測溫元件相比,能夠直接讀出被測溫度,硬件電路簡單,單線接口,可通過數據線供電,電壓范圍在3.0V~5.5V。如圖4所示。

圖4溫度測量電路
(4)顯示電路設計
字符型液晶顯示模塊是一種專門用于顯示字母、數字、版本號等的點陣式液晶顯示模塊。它是由若干個5×7或5×11等點陣符位組成的,第一個點陣字符位都可以顯示一個字符。點陣字符位之間有一定點距的間隔,這樣就起到了字符間距和行距的作用。本設計采用字符型液晶顯示模塊LCD1602。如圖5如示。

圖5LCD1602連線電路
                      圖5液晶顯示模塊電路

(5)總體電路圖

圖6系統總體電路圖
  •   軟件程序設計(包括程序框圖和參考程序)
(1)DS18B20顯示溫度模塊需要調用4個子程序分別為
1.DS18B20初始化子程序,讓單片機知道DS18B20在總線上已準備好操作;
2.DS18B20寫字節子程序,對DS18B20發出命令;
3.DS18B20讀字節子程序,讀取DS18B20存儲器的數據;
4.延時子程序,對DS18B20操作時的時序控制;


設計結果分析及心得體會
(1)結果分析
本次設計達到題目要求,能夠利用DS18B20數字式溫度傳感器較準確測量周圍環境的溫度,并能通過字符型的顯示模塊LCD1602進行實時顯示,并且掌握了DS18B20的單總線協議,如圖16所示,使我們本次設計的實物圖。

                           圖16設計結果實物圖
(2)心得體會
本系統完成設計的要求、測溫較準確,作品性能好,具有一定的實際應用價值。該溫度檢測系統只是DS18B20在溫度測量領域的一個簡單實例,還有許多需要完善的地方。通過本次設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,才能提高自己的實際動手能力和獨立思考的能力。同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固。總的來說,這次設計還是比較成功的,在設計中遇到了很多問題,最后在老師的辛勤的指導下,終于游刃而解,有點小小的成就感,終于覺得平時所學的知識有了實用的價值,達到了理論與實際相結合的目的,不僅學到了不少知識,而且鍛煉了自己的能力。最后,對給過我幫助的所有同學和各位指導老師再次表示忠心的感謝。

單片機源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit DQ=P0^1; //ds18b20 與單片機連接口
  5. sbit RS=P1^0; //1602 寫數據 / 寫命令選擇端口
  6. //RS=1 寫數據,即要顯示的內容
  7. //RS=0 寫命令,即一些 LCD設置命令
  8. sbit RW=P1^1; //1602 讀/ 寫選擇端, RW=0為寫模式
  9. sbit EN=P1^2; // 給 EN一個高脈沖,將數據送入液晶控制器,完成寫操作
  10. uchar code str1[]={"1503322615033211"};
  11. uchar code str2[]={"  T="};
  12. uchar data disdata[4];// 百、十、個、小數位
  13. uint tvalue; // 溫度值
  14. uchar tflag; // 溫度正負標志
  15. /**********************lcd1602 設置子函數 *********************/
  16. void delay1ms(uint ms) // 延時 1 毫秒子函數 ,形參為 ms(不夠精確的)
  17. {
  18. unsigned int i,j;
  19. for(i=0;i<ms;i++)
  20. for(j=0;j<120;j++);
  21. }
  22. void wr_com(uchar com) //lcd 寫控制指令子函數,形參為 com
  23. {
  24. delay1ms(1); // 調用延時子函數,并用實參 1 代替延時子函數中的形參 ms
  25. RS=0; //RS=0 進入寫命令狀態,即一些 LCD設置命令
  26. RW=0; //RW=0 為寫模式
  27. EN=0;  //EN=0 時不能完成寫操作
  28. P2=com; // 把要設置的指令碼 com送給 P2 口
  29. delay1ms(1);
  30. EN=1; // 給 EN一個高脈沖,將數據送入液晶控制器,完成寫操作
  31. delay1ms(1);
  32. EN=0; }//EN=0 時不能完成寫操作
  33. /******************檢測忙標志函數***************************/  
  34. void check_busy(void)
  35. {
  36.   uchar dt;
  37.   do
  38. {
  39.               dt=0xff;
  40.               EN=0;
  41.               RS=0;
  42.               RW=1;
  43.               EN=1;
  44.               dt=P2;
  45.               }while(dt&0x80);
  46.               EN=0;
  47. }
  48. */
  49. //*****************寫數據*******************************/
  50. void wr_dat(uchar dat) //lcd 寫顯示數據子函數,形參為 dat
  51. {
  52. /* check_busy();*/
  53. delay1ms(1);
  54. RS=1; //RS=1 進入寫數據狀態,即要顯示的內容
  55. RW=0; //RW=0 為寫模式
  56. EN=0; //EN=0 時不能完成寫操作
  57. P2=dat; // 把要顯示的數據 dat 送給 P2 口
  58. delay1ms(1);
  59. EN=1; // 給 EN一個高脈沖,將數據送入液晶控制器,完成寫操作
  60. delay1ms(1);
  61. EN=0; //EN=0 時不能完成寫操作
  62. }
  63. void lcd_init() //lcd 初始化設置子函數,不帶參數 ,0x38 是顯示模式設置 , 其余是顯示開 / 關及光標設置,無順序
  64. {
  65. delay1ms(15);
  66. wr_com(0x38); // 調用寫控制指令子函數,并用實參 "0011 1000" 代替形參 com
  67. //0x38 表示設置為 16*2 顯示,每個塊為 5*7 點陣, 8 位數據接口
  68. delay1ms(5);
  69. wr_com(0x08); // 調用寫控制指令子函數,并用實參 "0000 1000" 代替形參 com
  70. //0x08 表示設置為關顯示、不顯示光標、光標不閃爍
  71. delay1ms(5);
  72. wr_com(0x01); // 調用寫控制指令子函數,并用實參 "0000 0001" 代替形參 com
  73. //0x01 表示顯示數據清屏(數據指針清 0,所有顯示清 0)
  74. delay1ms(5);
  75. wr_com(0x06);// 調用寫控制指令子函數,并用實參 "0000 0110" 代替形參 com
  76. //0x06 表示當讀或寫一個字符后地址指針加 1,且光標加 1; 當寫一個字符時,整屏顯示不移動
  77. delay1ms(5);
  78. wr_com(0x0c);// 調用寫控制指令子函數,并用實參 "0000 1100" 代替形參 com
  79. //0x0c 打開顯示、不顯示光標、光標不閃爍
  80. delay1ms(5);
  81. }
  82. void display(uchar *p) //lcd 顯示字符串子函數
  83. {
  84. while(*p!='\0') // 測試是否等于 '\0' ,即判斷字符是否結尾
  85. {
  86. wr_dat(*p); // 顯示指針所指的字符串
  87. p++; // 指針加 1
  88. delay1ms(1);
  89. }
  90. }
  91. void init_play() // 初始化顯示子函數
  92. {
  93. lcd_init(); // 調用 lcd 初始化設置子函數,對 LCD進行初始化
  94. wr_com(0x80); // 調用寫控制指令子函數,并用實參 "1000 0000" 代替形參 com
  95. // 并將數據指針定位到第一行第一個字符處
  96. display(str1);// 從第一行第一個字符處顯示字符串 str1
  97. wr_com(0x80+0x40);// 調用寫控制指令子函數,并用實參 "1000 0000" 代替形參 com
  98. // 并將數據指針定位到第二行第一個字符處
  99. display(str2); // 從第二行第一個字符處顯示字符串 str2
  100. }

  101. /********************************************************/
  102. /********************ds18b20 程序 ***********************/
  103. void delay_18b20(uint i) // 延時 1 微秒
  104. {
  105. while(i--);
  106. }
  107. void ds18b20rst() //ds18b20 初始化子函數
  108. // 要求"數據線拉高 - 延時 - 數據線拉低 - 延時大于 480 微妙 -數據線拉高 - 延時等待 "
  109. {
  110. uchar x=0;
  111. DQ = 1; // 信號線 DQ復位
  112. delay_18b20(4); // 延時
  113. DQ = 0; //DQ 拉低
  114. delay_18b20(100); // 精確延時大于 480us
  115. DQ = 1; // 拉高
  116. delay_18b20(40);
  117. }
  118. void ds18b20wr(uchar wdata) /* 寫數據子函數 , 無返回值,含參數 */
  119. {
  120. uchar i=0;
  121. for (i=8; i>0; i--)// 要寫完一個字節,故需要重復 8 次以下操作
  122. {
  123. DQ = 0; // 數據線拉低
  124. DQ = wdata&0x01;//wdata 是一個形參,將其與 0000 0001 進行按位與
  125. // 按從低到高的順序發送數據(一次發送一位 )
  126. delay_18b20(10);
  127. DQ = 1; // 最后將數據線拉高
  128. wdata>>=1; // 將 wdata 右移 1 位
  129. }
  130. }
  131. uchar ds18b20rd() // 讀數據子函數 , 是有返回值 dat
  132. {
  133. uchar i=0;
  134. uchar dat = 0;
  135. for (i=8;i>0;i--)// 要讀完一個字節,故需要重復 8 次以下操作
  136. {
  137. DQ = 0; // 給脈沖信號
  138. dat>>=1;
  139. DQ = 1; // 給脈沖信號
  140. if(DQ)
  141. dat|=0x80;
  142. delay_18b20(10);
  143. }
  144. return(dat); // 返回 dat
  145. }
  146. read_temp() // 讀取溫度值并轉換的子函數,有返回值溫度值 tvalue
  147. {
  148. uchar a,b;
  149. ds18b20rst(); // 調用 ds18b20 初始化子函數
  150. ds18b20wr(0xcc);// 調用寫數據子函數,向 ds18b20 寫命令 0xcc
  151. //ccH 表示跳過 ROM讀序列號,適用于單機工作,直接向 18b20 發送溫度變換命令
  152. ds18b20wr(0x44);// 調用寫數據子函數,向 ds18b20 寫命令 0x44
  153. //44H 表示啟動 ds18b20 溫度轉換 , 結果自行存入 9 字節的 RAM中
  154. ds18b20rst(); // 調用 ds18b20 初始化子函數
  155. ds18b20wr(0xcc);// 同上
  156. ds18b20wr(0xbe);// 調用寫數據子函數,向 ds18b20 寫命令 0xbe
  157. //beH 表示讀取 RAM中 9 字節的溫度數據
  158. a=ds18b20rd(); // 調用讀數據子函數,并將所得數據給 a
  159. b=ds18b20rd(); //
  160. tvalue=b; // 把 b 的值給 tvalue
  161. tvalue<<=8; //tvalue 左移 8 位
  162. tvalue=tvalue|a;//tvalue 與 a 進行按位或
  163. if(tvalue<0x0fff)//
  164. tflag=0; // 前五位為 0 時,讀取的溫度為正,標志位為 0,此時只要
  165. // 將測得數值乘以 0.0625 即可得到實際溫度
  166. else // 前五位為 1 時,讀取的溫度為負,標志位為 1,此時需要
  167. { // 將測得數值取反后再加 1,再乘以 0.0625 即可得到實際溫度
  168. tflag=1; // 此時表示負溫度
  169. tvalue=~tvalue+1;
  170. }
  171. tvalue=tvalue*(0.625);// 溫度值擴大 10 倍,精確到 1 位小數
  172. return(tvalue); // 返回溫度值
  173. }
  174. /**********************************************************/
  175. /************************ 溫度值顯示 *********************/
  176. void ds18b20disp() // 溫度值顯示
  177. {
  178. uchar flagdat;
  179. disdata[0]=tvalue/1000+0x30; // 百位數
  180. disdata[1]=tvalue%1000/100+0x30;// 十位數
  181. disdata[2]=tvalue%100/10+0x30; // 個位數
  182. disdata[3]=tvalue%10+0x30; // 小數位
  183. if(tflag==0)
  184. flagdat=0x2b; // 正溫度顯示符號 :+
  185. else
  186. flagdat=0x2d; // 負溫度顯示負號 :-
  187. if(disdata[0]==0x30)
  188. {
  189. disdata[0]=0x20; // 如果百位為 0,不顯示
  190. if(disdata[1]==0x30)
  191. {
  192. disdata[1]=0x20; // 如果百位為 0,十位為 0 也不顯示
  193. }
  194. }
  195. wr_com(0x80+0x44); // 定位數據指針的位置:第二行第五個字符處
  196. wr_dat(flagdat); // 顯示符號位
  197. wr_com(0x80+0x45);  // 定位數據指針的位置:第二行第六個字符處
  198. wr_dat(disdata[0]);  // 顯示百位
  199. wr_com(0x80+0x46);  // 定位數據指針的位置:第二行第七個字符處
  200. wr_dat(disdata[1]);  // 顯示十位
  201. wr_com(0x80+0x47);  // 定位數據指針的位置:第二行第八個字符處
  202. wr_dat(disdata[2]);  // 顯示個位
  203. wr_com(0x80+0x48);  // 定位數據指針的位置:第二行第九個字符處
  204. wr_dat(0x2e); // 顯示小數點
  205. wr_com(0x80+0x49);  // 定位數據指針的位置:第二行第十個字符處
  206. wr_dat(disdata[3]);  // 顯示小數位
  207.               /**********************顯示攝氏度************************/
  208. wr_com(0x80+0x4A);  // 定位數據指針的位置:第二行第十一個字符處
  209. wr_dat(0XDF);
  210. wr_com(0x80+0x4B);  // 定位數據指針的位置:第二行第十二個字符處
  211. wr_dat(0X43);
  212. }

  213. /*******************************************************/
  214. /******************** 主程序 *****************************/
  215. void main()
  216. {
  217. init_play();  // 調用 lcd 初始化顯示子函數
  218. while(1)
  219. {
  220. read_temp(); // 調用 ds18b20 讀取溫度
  221. ds18b20disp(); // 調用溫度顯示子函數
  222. }
  223. }
復制代碼
全部資料51hei下載地址:
基于51溫度檢測程序.zip (17.52 MB, 下載次數: 677)

評分

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

查看全部評分

回復

使用道具 舉報

ID:532593 發表于 2019-5-10 15:51 | 顯示全部樓層
你這程序有錯
回復

使用道具 舉報

ID:532593 發表于 2019-5-10 16:07 | 顯示全部樓層
大家看看就好,在keil中只是可以翻譯,不能編譯,親測的
回復

使用道具 舉報

ID:484960 發表于 2020-3-21 16:03 | 顯示全部樓層

沒有呀!我設計就是這個程序呀!當時都可以演示的尼
回復

使用道具 舉報

ID:484960 發表于 2020-3-21 16:04 | 顯示全部樓層
大白菜111 發表于 2019-5-10 16:07
大家看看就好,在keil中只是可以翻譯,不能編譯,親測的

你生成HEX文件后燒錄在單片機里面搭配其他外圍硬件就可以實現功能的呀!!!
回復

使用道具 舉報

ID:701939 發表于 2020-3-23 17:09 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:611568 發表于 2020-3-23 21:25 | 顯示全部樓層
學習一下,就是下載速度太慢了。
回復

使用道具 舉報

ID:720980 發表于 2020-4-2 17:20 | 顯示全部樓層
請問一下樓主 為什么我的proteus中仿真就一直顯示的溫度為-1、-0這種?
回復

使用道具 舉報

ID:703051 發表于 2020-4-3 12:23 | 顯示全部樓層
問一下樓主,硬件里面的電源那塊你是怎么弄的,直接用USB轉DC線就行了嘛?
回復

使用道具 舉報

ID:224782 發表于 2020-4-16 11:14 | 顯示全部樓層
大白菜111 發表于 2019-5-10 16:07
大家看看就好,在keil中只是可以翻譯,不能編譯,親測的

正常編譯,正常工作,只能說你有毒,或者不會用。。。。。。
回復

使用道具 舉報

ID:730449 發表于 2020-4-17 19:28 來自手機 | 顯示全部樓層
大白菜111 發表于 2019-5-10 16:07
大家看看就好,在keil中只是可以翻譯,不能編譯,親測的

注意是AT89C52單片機!建工程別選錯!

回復

使用道具 舉報

ID:362692 發表于 2020-5-14 16:47 來自手機 | 顯示全部樓層
大白菜111 發表于 2019-5-10 16:07
大家看看就好,在keil中只是可以翻譯,不能編譯,親測的

啥都不會,亂叫
回復

使用道具 舉報

ID:744393 發表于 2020-5-23 12:09 | 顯示全部樓層
黑子的難拿 發表于 2020-4-2 17:20
請問一下樓主 為什么我的proteus中仿真就一直顯示的溫度為-1、-0這種?

時序問題,改一下單片機的頻率,改為12M的
回復

使用道具 舉報

ID:737508 發表于 2020-5-25 10:20 | 顯示全部樓層
xddfandy 發表于 2020-3-21 16:03
沒有呀!我課程設計就是這個程序呀!當時都可以演示的尼

兄弟你做成了嗎
回復

使用道具 舉報

ID:861694 發表于 2020-12-16 20:29 | 顯示全部樓層
如果出錯,可能還與軟件有關
回復

使用道具 舉報

ID:495586 發表于 2020-12-20 08:38 | 顯示全部樓層
只有程序,沒有其他的內容了/
回復

使用道具 舉報

ID:484960 發表于 2021-1-9 14:57 | 顯示全部樓層
黑弓的拉迪 發表于 2020-4-3 12:23
問一下樓主,硬件里面的電源那塊你是怎么弄的,直接用USB轉DC線就行了嘛?

這個是直接轉DC的,后面我自己做了一個220V交流轉5V直流的電源,用作DIY小玩意了,但是已經找不見了,后面找見給你發過去,或者你在網上直接找,很多的原理圖。
回復

使用道具 舉報

ID:484960 發表于 2021-1-9 14:58 | 顯示全部樓層

我做成了,給師傅演示了
回復

使用道具 舉報

ID:484960 發表于 2021-1-9 14:58 | 顯示全部樓層
cheng7791 發表于 2020-12-20 08:38
只有程序,沒有其他的內容了/

里面的文字描述的可以作為設計思路的,提交文本直接給師傅看
回復

使用道具 舉報

ID:18702 發表于 2022-2-4 22:19 | 顯示全部樓層
編譯的沒有問題,做的不錯
回復

使用道具 舉報

ID:18702 發表于 2022-2-5 12:11 | 顯示全部樓層
追加回復來了,通過調試研究,注釋的和實際編寫的I/O 口有時候對不上,但文檔里的是對的,請樓主自行查驗,我根據自己的電路更改了一下程序,下載到單片機上了,可用,very good!
IMG_20220205_115513.jpg
回復

使用道具 舉報

ID:1088965 發表于 2023-9-21 22:54 | 顯示全部樓層
試運行結果為0,仔細看,原來是tvalue這個全局變量。
回復

使用道具 舉報

ID:1120154 發表于 2024-5-15 19:16 | 顯示全部樓層
uchar code str1[]={"1503322615033211"}; uchar code str2[]={"  T="};
回復

使用道具 舉報

ID:1120154 發表于 2024-5-15 19:18 | 顯示全部樓層
uchar code str1[]={"1503322615033211"}; 問問大佬 這句是干嘛用的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品一区 | 99久久精品国产毛片 | 日韩三级视频 | 日韩欧美一区二区三区四区 | 亚洲香蕉在线视频 | 美国黄色毛片 | 国产一区二区在线视频 | 国产精品无码永久免费888 | 免费一二区 | 日本久久网站 | 欧美日韩在线一区二区 | 日韩爱爱网 | 亚洲精久 | 狠狠做深爱婷婷综合一区 | 亚洲精品99999 | 先锋av资源在线 | 99视频网站 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 国产999在线观看 | 亚洲成人国产精品 | 国产农村妇女毛片精品久久麻豆 | 国产一区久久 | 亚洲精品9999| 成人在线精品视频 | 久久91精品国产 | 中文字幕一区二区三区在线观看 | 国产视频1区 | 最新国产精品精品视频 | 91中文字幕在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 粉色午夜视频 | 亚洲一区二区在线播放 | 国产精品久久久久久久午夜片 | 国产一级视频在线观看 | 欧美精品在线一区 | 亚洲欧美日韩电影 | 国产免费看 | 欧美一区二区三区大片 | 久久毛片 | 国产精品精品视频 | 色婷婷av777 av免费网站在线 |