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

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

QQ登錄

只需一步,快速開始

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

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:343796 發(fā)表于 2018-10-24 09:43 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這是一個(gè)使用DS18B20作為溫度傳感器的簡(jiǎn)易數(shù)字溫度傳感器,將溫度傳感器的實(shí)時(shí)數(shù)據(jù)輸出到LCD1602液晶顯示。P0口上拉10K電阻接液晶屏,P2.0-P2.3分別是LCD1602的RS,RW,EN和DS18B20的DQ數(shù)據(jù)口。

電路原理圖如下:


單片機(jī)源程序如下:
  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() //延時(shí)4us
  10. {
  11. ;
  12. }
  13. void Delay(unsigned char j)  //一個(gè)循環(huán)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復(fù)位
  26. Delay4us();
  27. DQ = 0; //拉低總線
  28. Delay(35); //這里延時(shí)大概 525us
  29. DQ = 1; //拉高總線
  30. Delay(2);  //這里延時(shí)大概 30us
  31. dat = DQ; //讀取返回值(0:有18b20存在 1:是沒有)
  32. Delay(2);
  33. return dat; //返回?cái)?shù)值
  34. }
  35. void d18b20_x(unsigned char dat) //寫 8 位 數(shù) 據(jù)
  36. {
  37. unsigned char i;
  38. for(i=0;i<8;i++) //8位計(jì)數(shù)器
  39. {
  40.   DQ = 0; //拉低總線
  41.   DQ = dat & 0x01; //取最低位賦值給總線
  42.   Delay(3); //延時(shí)45us
  43.   DQ = 1; //拉過總線準(zhǔn)備寫下一個(gè)數(shù)據(jù)(或者總線復(fù)位)
  44.   dat >>= 1; //數(shù)據(jù)右移一位
  45. }
  46. }
  47. unsigned char d18b20_d() //讀 8 位 數(shù) 據(jù)
  48. {
  49. unsigned char i,dat=0;
  50. for(i=0;i<8;i++) //8位計(jì)數(shù)器
  51. {
  52.   DQ = 0; //拉低總線
  53.   dat >>= 1; //數(shù)據(jù)右移一位
  54.   DQ = 1; //拉過總線(準(zhǔn)備讀取數(shù)據(jù))
  55.   if(DQ) //判斷是否是 1 如果是就把數(shù)據(jù)賦值給變量的高位
  56.    dat |= 0x80;
  57.   Delay(4);
  58. }
  59. return dat; //返回讀取到數(shù)據(jù)數(shù)據(jù)
  60. }
  61. unsigned int wd() //讀取溫度函數(shù)
  62. {
  63. unsigned char i = 0; //低8位數(shù)據(jù)
  64. unsigned char j = 0; //高8位數(shù)據(jù)
  65. unsigned int k = 0; //無(wú)符號(hào)16整形用來存儲(chǔ)讀回來的 16位溫度數(shù)據(jù)(j和i組合后的數(shù)據(jù))
  66. d18b20_qs(); //初始化
  67. d18b20_x(0xCC); //跳過序列號(hào)的操作(因?yàn)?8b20在總線上可以掛很多個(gè),這個(gè)序列號(hào)和網(wǎng)卡MAC地址類似)
  68. d18b20_x(0x44); //開啟溫度轉(zhuǎn)換
  69. Delay(200);   //開啟溫度轉(zhuǎn)換需要時(shí)間這里延時(shí)一下

  70. d18b20_qs(); //初始化
  71. d18b20_x(0xCC); //跳過序列號(hào)的操作(因?yàn)?8b20在總線上可以掛很多個(gè),這個(gè)序列號(hào)和網(wǎng)卡MAC地址類似)
  72. d18b20_x(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  73. i = d18b20_d(); //讀取低8位
  74. j = d18b20_d(); //讀取高8位
  75. k = j;  
  76. k <<= 8;
  77. k = k + i;
  78. return k; //返回讀取到的16位數(shù)據(jù)
  79. }
  80. void zh(unsigned int i)  //1602顯示緩存寫入函數(shù)
  81. {
  82. unsigned char x,z;
  83. x = i & 0x0f; //取出小數(shù)
  84. i >>=4;
  85. switch(x) //小數(shù)位轉(zhuǎn)換
  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; //轉(zhuǎn)換成ascii碼
  105. zf_1602(5,1,z); //寫入1602緩存
  106. z = i & 0xff; //取出整數(shù)
  107. x = z/10; //取出十位
  108. x= x+48; //轉(zhuǎn)換成ascii碼
  109. zf_1602(2,1,x); //寫入1602緩存
  110. x = z%10; //取出個(gè)位
  111. x= x+48; //轉(zhuǎn)換成ascii碼
  112. zf_1602(3,1,x); //寫入1602緩存
  113. }
  114. void Delayus(unsigned char t) // us級(jí)別延時(shí)
  115. {  
  116. while(--t);
  117. }
  118. void Delayms(unsigned char t)// ms級(jí)別延時(shí)
  119. {
  120.    
  121. while(t--)
  122. {
  123.      //大致延時(shí)1mS
  124.      Delayus(245);
  125.   Delayus(245);
  126. }
  127. }
  128. bit m_1602() //判斷1602是否忙
  129. {
  130. P0 = 0xFF; //準(zhǔn)備讀取
  131. RS = 0;
  132. RW = 1;
  133. EN = 0;
  134. _nop_();
  135. EN = 1; //產(chǎn)生高電平
  136. return (bit)(P0 & 0x80);
  137. }
  138. void x_1602(bit i,unsigned char j) //參數(shù)一是寫(0、寫指令 1、寫數(shù)據(jù)),參數(shù)二是寫入的8位數(shù)據(jù)
  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; //產(chǎn)生下降沿
  154. }
  155. void qp_1602() //清屏函數(shù)
  156. {
  157. x_1602(0,0x01); //第一個(gè)參數(shù)是:寫入的類型(0、寫指令 1、寫數(shù)據(jù)),第一個(gè)參數(shù)是:寫入的數(shù)據(jù)
  158. Delayms(5);
  159. }
  160. //顯示字符
  161. void zf_1602(unsigned char x,unsigned char y,unsigned dat) //參數(shù)一是顯示的列,參數(shù)二是顯示的行,參數(shù)三是顯示的數(shù)據(jù)
  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); //寫入數(shù)據(jù)
  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); //顯示模式設(shè)置
  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); //顯示關(guān)閉.
  199. x_1602(0,0x01); //顯示清屏
  200. x_1602(0,0x06); //顯示光標(biāo)移動(dòng)設(shè)置
  201. Delayms(5);
  202. x_1602(0,0x0c);  //顯示開及光標(biāo)設(shè)置
  203. }
  204. void Lcd_User_Chr(void) // 1602 自定義字符(攝氏度的小點(diǎn))    自定義字符
  205. {
  206. x_1602(0,0x48); //"01 001 000"  第1行地址
  207. x_1602(1,0x03); //"XXX 00001" 第1行數(shù)據(jù)
  208. x_1602(0,0x49); //"01 001 001"  第2行地址
  209. x_1602(1,0x03); //"XXX 11011" 第2行數(shù)據(jù)
  210. x_1602(0,0x4a); //"01 001 010"  第3行地址
  211. x_1602(1,0x00); //"XXX 11101" 第3行數(shù)據(jù)
  212. x_1602(0,0x4b); //"01 001 011"  第4行地址
  213. x_1602(1,0x00); //"XXX 11001" 第4行數(shù)據(jù)
  214. x_1602(0,0x4c); //"01 001 100"  第5行地址
  215. x_1602(1,0x00); //"XXX 11101" 第5行數(shù)據(jù)
  216. x_1602(0,0x4d); //"01 001 101"  第6行地址
  217. x_1602(1,0x00); //"XXX 11011" 第6行數(shù)據(jù)
  218. x_1602(0,0x4e); //"01 001 110"  第7行地址
  219. x_1602(1,0x00); //"XXX 00001" 第7行數(shù)據(jù)
  220. x_1602(0,0x4f); //"01 001 111"  第8行地址
  221. x_1602(1,0x00); //"XXX 00000" 第8行數(shù)據(jù)
  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); //攝氏度的點(diǎn)
  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. }
復(fù)制代碼

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


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:426241 發(fā)表于 2018-11-26 22:16 來自手機(jī) | 只看該作者
請(qǐng)問這個(gè)是直接在液晶屏上顯示溫度嗎?
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

樓主,請(qǐng)問,如果改成數(shù)碼管顯示溫度,要怎么去改呢?
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

12#
ID:671488 發(fā)表于 2019-12-23 16:09 | 只看該作者
請(qǐng)問這個(gè)是直接在液晶屏上顯示溫度嗎?
回復(fù)

使用道具 舉報(bào)

13#
ID:671488 發(fā)表于 2019-12-25 11:10 | 只看該作者
我能評(píng)論一下嗎
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

15#
ID:1010749 發(fā)表于 2022-3-16 11:35 | 只看該作者
用C語(yǔ)言編碼會(huì)節(jié)約單片機(jī)內(nèi)存
回復(fù)

使用道具 舉報(bào)

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

KST51梳理應(yīng)該有
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品在线观看网站 | 欧美一二三区 | 日韩高清三区 | 97久久精品午夜一区二区 | 成人久久视频 | 91久久久久久久久久久久久 | 男女羞羞视频免费看 | 一级视频黄色 | 欧美日韩不卡合集视频 | 亚洲综合一区二区三区 | 日日摸天天添天天添破 | 综合网视频 | 日韩在线观看一区二区三区 | 久久99精品久久久久久国产越南 | 91成人在线 | 久久久久一区二区三区四区 | 国产精品一区二区久久久久 | 亚洲免费片 | 在线日韩av电影 | 性高湖久久久久久久久3小时 | 中文字幕韩在线第一页 | 嫩草最新网址 | 久久免费视频观看 | 男人天堂国产 | 国产色网 | 久久久久国产一区二区三区 | 久久久久国产一级毛片 | 国产精品日韩欧美一区二区三区 | 波多野结衣先锋影音 | 欧美久久久久久久 | 日日干夜夜草 | 男女污网站 | 激情毛片 | 中文字幕人成人 | 国产成人一区二区三区电影 | 久久精品视频99 | 亚洲精品乱码 | 国产精品久久久久久久免费大片 | 免费看爱爱视频 | 国产精品日韩高清伦字幕搜索 | 午夜免费影视 |