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

標題: 基于stc89c52單片機的數字溫度傳感器電路與代碼(注釋詳細) [打印本頁]

作者: 最帥的人    時間: 2018-10-24 09:43
標題: 基于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)



作者: 夢里見回復    時間: 2018-11-26 22:16
請問這個是直接在液晶屏上顯示溫度嗎?
作者: 最帥的人    時間: 2018-11-27 23:57
回復樓上,是的
作者: qzc..    時間: 2018-11-30 16:11
你好,圖能發完整嗎

作者: rbbjj    時間: 2018-12-1 08:10
要是整個工程就更好了
作者: 阿文丶    時間: 2019-4-1 17:48
完整的仿真圖
作者: 風一樣的壞蛋    時間: 2019-7-22 14:58
樓主,要想在數碼管上顯示溫度該怎么去修改呢·?

作者: 風一樣的壞蛋    時間: 2019-7-22 15:06
最帥的人 發表于 2018-11-27 23:57
回復樓上,是的

樓主,請問,如果改成數碼管顯示溫度,要怎么去改呢?
作者: ls147258    時間: 2019-12-1 22:48
如果能講講原理就好了,對于小白來說,直接看程序,頭大啊。
作者: 小石頭吶    時間: 2019-12-1 23:03
謝謝樓主
作者: Evil轉世    時間: 2019-12-23 09:18
感謝分享
作者: QQQZRR    時間: 2019-12-23 16:09
請問這個是直接在液晶屏上顯示溫度嗎?
作者: QQQZRR    時間: 2019-12-25 11:10
我能評論一下嗎
作者: 2060jdjjs    時間: 2021-12-23 16:49
左邊的圖有嗎
作者: 蛋騙雞中的菜雞    時間: 2022-3-16 11:35
用C語言編碼會節約單片機內存
作者: 1276327078    時間: 2022-3-17 08:23
ls147258 發表于 2019-12-1 22:48
如果能講講原理就好了,對于小白來說,直接看程序,頭大啊。

KST51梳理應該有




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: www国产成人免费观看视频,深夜成人网 | 亚洲国产偷 | 国产精品免费一区二区 | 99精品网 | 日韩成人精品一区 | 成人性生交大片 | 久久手机在线视频 | 精品欧美一区二区精品久久久 | 在线观看精品 | 一区二区三区视频在线观看 | 婷婷桃色网 | 国产高清视频一区二区 | 伊人伊人 | 欧美精品久久久久 | 操一草| 91一区二区| av电影手机在线看 | 成人综合久久 | 欧美日韩精品一区 | 伊人伊人网| 精品一区二区三区在线视频 | 91啪亚洲精品| 九九九久久国产免费 | 成人久久久| 先锋资源站 | 91麻豆精品国产91久久久久久 | 国产精品久久久久久久久久久免费看 | 日韩中文字幕在线观看 | 一级a爱片久久毛片 | 亚洲精品乱码久久久久久黑人 | 亚洲精品天堂 | 国产精品久久9 | 日韩精品在线播放 | 99视频网| 欧美xxxx网站 | 亚洲一区欧美 | 国产成人高清视频 | 国产精品一区二区三区免费观看 | 亚洲欧美在线观看视频 | 一区在线观看 | 中文字幕成人在线 |