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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于stc89c52單片機的數字溫度傳感器電路與代碼(注釋詳細)

  [復制鏈接]
跳轉到指定樓層
樓主
這是一個使用DS18B20作為溫度傳感器的簡易數字溫度傳感器,將溫度傳感器的實時數據輸出到LCD1602液晶顯示。P0口上拉10K電阻接液晶屏,P2.0-P2.3分別是LCD1602的RS,RW,EN和DS18B20的DQ數據口。

電路原理圖如下:


單片機源程序如下:
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. sbit RS = P2^0;   //定義端口
  4. sbit RW = P2^1;
  5. sbit EN = P2^2;
  6. sbit DQ = P2^3; //定義總線的I/O管腳
  7. void SendByte(unsigned char dat);
  8. void zf_1602(unsigned char x,unsigned char y,unsigned dat);
  9. void Delay4us() //延時4us
  10. {
  11. ;
  12. }
  13. void Delay(unsigned char j)  //一個循環15us
  14. {
  15. unsigned char i;
  16. while(j--)
  17. {
  18.   i = 5;
  19.   while (--i);
  20. }
  21. }
  22. bit d18b20_qs() //18b20 起始
  23. {
  24. bit dat;
  25. DQ = 1; //DQ復位
  26. Delay4us();
  27. DQ = 0; //拉低總線
  28. Delay(35); //這里延時大概 525us
  29. DQ = 1; //拉高總線
  30. Delay(2);  //這里延時大概 30us
  31. dat = DQ; //讀取返回值(0:有18b20存在 1:是沒有)
  32. Delay(2);
  33. return dat; //返回數值
  34. }
  35. void d18b20_x(unsigned char dat) //寫 8 位 數 據
  36. {
  37. unsigned char i;
  38. for(i=0;i<8;i++) //8位計數器
  39. {
  40.   DQ = 0; //拉低總線
  41.   DQ = dat & 0x01; //取最低位賦值給總線
  42.   Delay(3); //延時45us
  43.   DQ = 1; //拉過總線準備寫下一個數據(或者總線復位)
  44.   dat >>= 1; //數據右移一位
  45. }
  46. }
  47. unsigned char d18b20_d() //讀 8 位 數 據
  48. {
  49. unsigned char i,dat=0;
  50. for(i=0;i<8;i++) //8位計數器
  51. {
  52.   DQ = 0; //拉低總線
  53.   dat >>= 1; //數據右移一位
  54.   DQ = 1; //拉過總線(準備讀取數據)
  55.   if(DQ) //判斷是否是 1 如果是就把數據賦值給變量的高位
  56.    dat |= 0x80;
  57.   Delay(4);
  58. }
  59. return dat; //返回讀取到數據數據
  60. }
  61. unsigned int wd() //讀取溫度函數
  62. {
  63. unsigned char i = 0; //低8位數據
  64. unsigned char j = 0; //高8位數據
  65. unsigned int k = 0; //無符號16整形用來存儲讀回來的 16位溫度數據(j和i組合后的數據)
  66. d18b20_qs(); //初始化
  67. d18b20_x(0xCC); //跳過序列號的操作(因為18b20在總線上可以掛很多個,這個序列號和網卡MAC地址類似)
  68. d18b20_x(0x44); //開啟溫度轉換
  69. Delay(200);   //開啟溫度轉換需要時間這里延時一下

  70. d18b20_qs(); //初始化
  71. d18b20_x(0xCC); //跳過序列號的操作(因為18b20在總線上可以掛很多個,這個序列號和網卡MAC地址類似)
  72. d18b20_x(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  73. i = d18b20_d(); //讀取低8位
  74. j = d18b20_d(); //讀取高8位
  75. k = j;  
  76. k <<= 8;
  77. k = k + i;
  78. return k; //返回讀取到的16位數據
  79. }
  80. void zh(unsigned int i)  //1602顯示緩存寫入函數
  81. {
  82. unsigned char x,z;
  83. x = i & 0x0f; //取出小數
  84. i >>=4;
  85. switch(x) //小數位轉換
  86. {
  87.   case 0: z=0;break;
  88.   case 1: z=1;break;
  89.   case 2: z=1;break;
  90.   case 3: z=2;break;
  91.   case 4: z=3;break;
  92.   case 5: z=3;break;
  93.   case 6: z=4;break;
  94.   case 7: z=4;break;
  95.   case 8: z=5;break;
  96.   case 9: z=6;break;
  97.   case 10: z=6;break;
  98.   case 11: z=7;break;
  99.   case 12: z=8;break;
  100.   case 13: z=8;break;
  101.   case 14: z=9;break;
  102.   case 15: z=9;break;
  103. }
  104. z = z +48; //轉換成ascii碼
  105. zf_1602(5,1,z); //寫入1602緩存
  106. z = i & 0xff; //取出整數
  107. x = z/10; //取出十位
  108. x= x+48; //轉換成ascii碼
  109. zf_1602(2,1,x); //寫入1602緩存
  110. x = z%10; //取出個位
  111. x= x+48; //轉換成ascii碼
  112. zf_1602(3,1,x); //寫入1602緩存
  113. }
  114. void Delayus(unsigned char t) // us級別延時
  115. {  
  116. while(--t);
  117. }
  118. void Delayms(unsigned char t)// ms級別延時
  119. {
  120.    
  121. while(t--)
  122. {
  123.      //大致延時1mS
  124.      Delayus(245);
  125.   Delayus(245);
  126. }
  127. }
  128. bit m_1602() //判斷1602是否忙
  129. {
  130. P0 = 0xFF; //準備讀取
  131. RS = 0;
  132. RW = 1;
  133. EN = 0;
  134. _nop_();
  135. EN = 1; //產生高電平
  136. return (bit)(P0 & 0x80);
  137. }
  138. void x_1602(bit i,unsigned char j) //參數一是寫(0、寫指令 1、寫數據),參數二是寫入的8位數據
  139. {
  140. while(m_1602())
  141. {
  142.   _nop_();
  143.   _nop_();
  144.   _nop_();
  145.   _nop_();
  146.   _nop_();
  147. }
  148. RS = i;
  149. RW = 0;
  150. EN = 1;
  151. P0 = j;
  152. _nop_();
  153. EN = 0; //產生下降沿
  154. }
  155. void qp_1602() //清屏函數
  156. {
  157. x_1602(0,0x01); //第一個參數是:寫入的類型(0、寫指令 1、寫數據),第一個參數是:寫入的數據
  158. Delayms(5);
  159. }
  160. //顯示字符
  161. void zf_1602(unsigned char x,unsigned char y,unsigned dat) //參數一是顯示的列,參數二是顯示的行,參數三是顯示的數據
  162. {
  163. if(y==0)
  164. {
  165.   x_1602(0,(0x80+x)); //第一行
  166. }
  167. else
  168. {
  169.   x_1602(0,(0xc0+x)); //第二行
  170. }
  171. x_1602(1,dat); //寫入數據
  172. }
  173. void zfc_1602(unsigned char x,unsigned char y,unsigned char *dat)
  174. {
  175. if(y==0)
  176. {
  177.   x_1602(0,(0x80+x)); //第一行
  178. }
  179. else
  180. {
  181.   x_1602(0,(0xc0+x)); //第二行
  182. }
  183. while(*dat) //&:取地址 *:取值
  184. {
  185.   x_1602(1,*dat);
  186.   dat ++;
  187. }
  188. }
  189. void csh_1602()  //初始化1602
  190. {
  191. x_1602(0,0x38); //顯示模式設置
  192. Delayms(5);
  193. x_1602(0,0x38);
  194. Delayms(5);
  195. x_1602(0,0x38);
  196. Delayms(5);
  197. x_1602(0,0x38);
  198. x_1602(0,0x08); //顯示關閉.
  199. x_1602(0,0x01); //顯示清屏
  200. x_1602(0,0x06); //顯示光標移動設置
  201. Delayms(5);
  202. x_1602(0,0x0c);  //顯示開及光標設置
  203. }
  204. void Lcd_User_Chr(void) // 1602 自定義字符(攝氏度的小點)    自定義字符
  205. {
  206. x_1602(0,0x48); //"01 001 000"  第1行地址
  207. x_1602(1,0x03); //"XXX 00001" 第1行數據
  208. x_1602(0,0x49); //"01 001 001"  第2行地址
  209. x_1602(1,0x03); //"XXX 11011" 第2行數據
  210. x_1602(0,0x4a); //"01 001 010"  第3行地址
  211. x_1602(1,0x00); //"XXX 11101" 第3行數據
  212. x_1602(0,0x4b); //"01 001 011"  第4行地址
  213. x_1602(1,0x00); //"XXX 11001" 第4行數據
  214. x_1602(0,0x4c); //"01 001 100"  第5行地址
  215. x_1602(1,0x00); //"XXX 11101" 第5行數據
  216. x_1602(0,0x4d); //"01 001 101"  第6行地址
  217. x_1602(1,0x00); //"XXX 11011" 第6行數據
  218. x_1602(0,0x4e); //"01 001 110"  第7行地址
  219. x_1602(1,0x00); //"XXX 00001" 第7行數據
  220. x_1602(0,0x4f); //"01 001 111"  第8行地址
  221. x_1602(1,0x00); //"XXX 00000" 第8行數據
  222. }
  223. void main()
  224. {
  225. unsigned char i;
  226. csh_1602();
  227. qp_1602();
  228. Lcd_User_Chr();
  229. zf_1602(4,1,'.');
  230. zf_1602(6,1,0x01); //攝氏度的點
  231. zf_1602(7,1,'C'); //大寫的C
  232. zfc_1602(1,0,"www.zg4o1577.cn");
  233. while(1)
  234. {
  235.   zh(wd());
  236.   for(i=0;i<10;i++)
  237.    Delayms(200);
  238. }
  239. }
復制代碼

所有資料51hei提供下載:
溫度顯示2.zip (2.06 KB, 下載次數: 148)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:426241 發表于 2018-11-26 22:16 來自手機 | 只看該作者
請問這個是直接在液晶屏上顯示溫度嗎?
回復

使用道具 舉報

板凳
ID:343796 發表于 2018-11-27 23:57 | 只看該作者
回復樓上,是的
回復

使用道具 舉報

地板
ID:433919 發表于 2018-11-30 16:11 | 只看該作者
你好,圖能發完整嗎
回復

使用道具 舉報

5#
ID:29048 發表于 2018-12-1 08:10 | 只看該作者
要是整個工程就更好了
回復

使用道具 舉報

6#
ID:481272 發表于 2019-4-1 17:48 | 只看該作者
完整的仿真圖
回復

使用道具 舉報

7#
ID:388130 發表于 2019-7-22 14:58 | 只看該作者
樓主,要想在數碼管上顯示溫度該怎么去修改呢·?
回復

使用道具 舉報

8#
ID:388130 發表于 2019-7-22 15:06 | 只看該作者

樓主,請問,如果改成數碼管顯示溫度,要怎么去改呢?
回復

使用道具 舉報

9#
ID:343168 發表于 2019-12-1 22:48 | 只看該作者
如果能講講原理就好了,對于小白來說,直接看程序,頭大啊。
回復

使用道具 舉報

10#
ID:424506 發表于 2019-12-1 23:03 | 只看該作者
謝謝樓主
回復

使用道具 舉報

11#
ID:670929 發表于 2019-12-23 09:18 | 只看該作者
感謝分享
回復

使用道具 舉報

12#
ID:671488 發表于 2019-12-23 16:09 | 只看該作者
請問這個是直接在液晶屏上顯示溫度嗎?
回復

使用道具 舉報

13#
ID:671488 發表于 2019-12-25 11:10 | 只看該作者
我能評論一下嗎
回復

使用道具 舉報

14#
ID:996194 發表于 2021-12-23 16:49 | 只看該作者
左邊的圖有嗎
回復

使用道具 舉報

15#
ID:1010749 發表于 2022-3-16 11:35 | 只看該作者
用C語言編碼會節約單片機內存
回復

使用道具 舉報

16#
ID:1002955 發表于 2022-3-17 08:23 | 只看該作者
ls147258 發表于 2019-12-1 22:48
如果能講講原理就好了,對于小白來說,直接看程序,頭大啊。

KST51梳理應該有
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日夜精品视频 | 久久精品在线免费视频 | 天天射夜夜操 | 日本免费一区二区三区视频 | 五月天国产 | 亚洲 中文 欧美 日韩 在线观看 | 久久久久国产一区二区三区 | 国产精品亚洲精品 | 91在线观看免费 | 日韩国产在线 | 国产日韩欧美一区二区 | 99亚洲精品| 欧美日韩中文字幕 | 密室大逃脱第六季大神版在线观看 | 中文字幕精品一区二区三区精品 | 欧美午夜一区二区三区免费大片 | 欧美精品综合在线 | 国产成人在线看 | 久久精品国产一区二区电影 | 欧美精品99 | 亚洲欧美精品久久 | 久久综合香蕉 | 精品九九 | 免费一区 | 成人av鲁丝片一区二区小说 | 欧美黄在线观看 | 亚洲三区在线观看 | 国产精品自拍啪啪 | 一区二区av | 免费在线色 | 涩在线| heyzo在线| 久草资源网站 | 亚洲综合视频 | 日韩一区二区三区精品 | 日本一区二区三区免费观看 | 免费成人高清在线视频 | 成人高清在线视频 | 午夜视频免费在线观看 | av天天干| 国产精品久久国产精品 |