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

QQ登錄

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

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

51單片機(jī)多路DS18B20測(cè)溫顯示并讀取序列號(hào)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:79544 發(fā)表于 2016-8-26 10:52 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. /*********************************************

  2. 功 能:讀取序列號(hào)并匹配序列號(hào),并讀溫度值
  3. 多功能試驗(yàn)板顯示多路溫度采集
  4. 正常顯示2個(gè)DS18B20溫度
  5. 正常讀取DS18B20序列號(hào)

  6. 單片機(jī):STC12C5A60S2
  7. 晶 振:11.0592M
  8. 作 者:蘇義江改編自網(wǎng)絡(luò)
  9. 時(shí) 間:2016-8-25
  10. ************************************************/
  11. #include <reg52.h>
  12. #include <intrins.h>
  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. sbit RS=P2^7;
  16. sbit RW=P2^6;
  17. sbit EN=P2^5;
  18. sbit DQ=P3^4; //傳感器引腳
  19. sbit key=P3^7;
  20. sbit d1=P1^3;//指示燈
  21. sbit d2=P1^4;
  22. bit st=1;

  23. uchar code table0[]={"DuoLuWenDuXS:U "};
  24. uchar code table2[]={"SD: "}; //濕度
  25. uchar code table1[]={"0123456789ABCDEF"};
  26. //現(xiàn)有的2個(gè)DS18B20傳感器的序列號(hào)ROM1,ROM2
  27. uchar DSrom[4][8]={//4個(gè)器件每個(gè)64位序列號(hào)
  28. {0x28,0xff,0x2a,0x0A,0x22,0x04,0x00,0xf6},//ROM1
  29. {0x28,0xFF,0x0b,0x0d,0x20,0x04,0x00,0x0a},//ROM2

  30. {0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54},//ROM3
  31. {0x28,0xff,0x91,0x14,0x22,0x04,0x00,0xe4}//ROM4
  32. };
  33. int f[4]; //溫度數(shù)組
  34. int tvalue; //溫度值變量
  35. float ftvalue; //溫度值變量
  36. uchar fCode[8];//序列號(hào)數(shù)組
  37. uint warnl=300; //設(shè)定溫度值高
  38. uint warnh=992;//設(shè)定溫度值低
  39. void ds1820wr(uchar dat);//寫數(shù)據(jù)
  40. void ds1820rst();//ds1820復(fù)位
  41. uchar ds1820rd();//讀數(shù)據(jù)
  42. void DispCode();//讀取序列號(hào)

  43. uchar tflag;//溫度正負(fù)標(biāo)志

  44. //////////lcd1602程序////////////
  45. void delay1ms(uint ms)//延時(shí)1毫秒(不夠精確的)
  46. {
  47. uint i,j;
  48. for(i=0;i<ms;i++)
  49. for(j=0;j<620;j++);
  50. }
  51. void wr_com(uchar com)//寫指令//
  52. {
  53. delay1ms(1);
  54. RS=0;
  55. RW=0;
  56. EN=0;
  57. P0=com;
  58. delay1ms(1);
  59. EN=1;
  60. delay1ms(1);
  61. EN=0;
  62. }
  63. void wr_dat(uchar dat)//寫數(shù)據(jù)//
  64. {
  65. delay1ms(1);;
  66. RS=1;
  67. RW=0;
  68. EN=0;
  69. P0=dat;
  70. delay1ms(1);
  71. EN=1;
  72. delay1ms(1);
  73. EN=0;
  74. }
  75. void lcd_init()//1602初始化設(shè)置//
  76. {
  77. delay1ms(15);
  78. wr_com(0x38);
  79. delay1ms(5);
  80. wr_com(0x08);delay1ms(5);
  81. wr_com(0x01);delay1ms(5);
  82. wr_com(0x06);delay1ms(5);
  83. wr_com(0x0c);delay1ms(5);

  84. }
  85. void display(uchar *p)//顯示字符串
  86. {
  87. while(*p!='\0')
  88. {
  89. wr_dat(*p);
  90. p++;
  91. delay1ms(1);
  92. }
  93. }
  94. void displayinit()//初始化顯示
  95. {
  96. lcd_init();
  97. wr_com(0x80);
  98. display(table0);

  99. wr_com(0xC6);
  100. wr_dat(0xdf);
  101. wr_com(0xC7);
  102. wr_dat('C');
  103. wr_com(0xCf);
  104. wr_dat(0x25);
  105. wr_com(0XC9);
  106. display(table2);
  107. }
  108. void tmstart()//初始化ds18b20
  109. {
  110. DQ=1;
  111. d1=1;
  112. d2=1;
  113. ds1820rst();
  114. delay1ms(1);
  115. ds1820wr(0xcc);
  116. ds1820wr(0x44);
  117. }
  118. void read_dealtemp()//讀取并處理溫度
  119. {
  120. uchar i,j,t;
  121. uchar a,b;
  122. for(j=0;j<5;j++) //掛載4個(gè)設(shè)備
  123. {
  124. ds1820rst(); //復(fù)位
  125. delay1ms(1);
  126. ds1820wr(0x55); //匹配EOM指令
  127. for(i=0;i<8;i++)
  128. {
  129. ds1820wr(DSrom[j][i]);//發(fā)送64位序列號(hào)
  130. }
  131. ds1820wr(0xbe);//溫度轉(zhuǎn)換

  132. a=ds1820rd(); //讀高位
  133. b=ds1820rd(); //讀低位
  134. tvalue=b;
  135. tvalue<<=8;
  136. tvalue=tvalue|a;
  137. if(tvalue<0) //判斷正負(fù)溫度
  138. {
  139. d1=1;
  140. tvalue=~tvalue+1;
  141. wr_com(0xc0); //第二行第一列
  142. wr_dat(0x2d); //負(fù)溫度符號(hào)"-"
  143. if(tvalue<warnl) //溫度高于設(shè)定值warnl=300;
  144. {
  145. d2=0; //報(bào)警
  146. DQ=0;
  147. }
  148. else
  149. {
  150. d2=1;
  151. DQ=1;
  152. }
  153. }
  154. else
  155. {
  156. d2=1;
  157. wr_com(0xc0);
  158. wr_dat(' ');
  159. if(tvalue>warnh) //溫度高于設(shè)定值warnh=992;
  160. {
  161. d1=0; //報(bào)警
  162. DQ=0;
  163. }
  164. else
  165. {
  166. d1=1;
  167. DQ=1;
  168. }
  169. }
  170. if(j==0)
  171. {
  172. wr_com(0x8f);
  173. wr_dat('1');
  174. }
  175. if(j==1)
  176. {
  177. wr_com(0x8f);
  178. wr_dat('2');
  179. }
  180. if(j==2)
  181. {
  182. wr_com(0x8f);
  183. wr_dat('3');
  184. }
  185. if(j==3)
  186. {
  187. wr_com(0x8f);
  188. wr_dat('4');
  189. }
  190. if(j==4)
  191. {
  192. wr_com(0x8f);
  193. wr_dat('5');
  194. }
  195. ftvalue=tvalue*0.0625;
  196. tvalue=ftvalue*10+0.5;
  197. ftvalue=ftvalue+0.05; //溫度補(bǔ)償
  198. f[j]=tvalue;//溫度擴(kuò)大十倍,精確到一位小數(shù)
  199. tvalue=f[j];
  200. t=tvalue/1000;
  201. wr_com(0x80+0x41);
  202. wr_dat(table1[t]);//顯示百位
  203. t=tvalue%1000/100;
  204. wr_dat(table1[t]);//顯示十位
  205. t=tvalue%100/10;
  206. wr_dat(table1[t]);//顯示個(gè)位
  207. wr_dat(0x2e); //顯示小數(shù)點(diǎn)兒
  208. t=tvalue%10/1;
  209. wr_dat(table1[t]);//顯示小數(shù)位
  210. delay1ms(5000);
  211. }
  212. }
  213. void keyscan()//按鍵
  214. {
  215. if(key==0)
  216. {
  217. delay1ms(30);
  218. if(key==0)
  219. {
  220. st=~st;
  221. }
  222. while(!key);
  223. }
  224. }
  225. void main()
  226. {
  227. d1=1;
  228. d2=1;
  229. DQ=1;
  230. displayinit();//初始化顯示
  231. while(1)
  232. {
  233. keyscan();//按住按鍵等4個(gè)器件循環(huán)完畢顯示序列號(hào)
  234. if(st==1)
  235. {
  236. wr_com(0x01);
  237. displayinit();//初始化顯示
  238. tmstart();//初始化
  239. read_dealtemp();//讀取溫度
  240. }
  241. else
  242. {
  243. wr_com(0x01);
  244. keyscan();//按住按鍵等4個(gè)器件循環(huán)完畢顯示序列號(hào)
  245. DispCode();//讀取序列號(hào)
  246. delay1ms(1000);
  247. }
  248. }
  249. }
  250. ////////DS18B20函數(shù)///////////////
  251. void delay_b20(uint n)//STC12C5A單片機(jī)定時(shí)1us
  252. {
  253. while(n--)
  254. {
  255. _nop_();

  256. }

  257. }

  258. void ds1820rst()/*ds1820復(fù)位*/
  259. {
  260. uchar x=0;
  261. DQ = 1; //DQ復(fù)位
  262. delay_b20(1); //延時(shí)
  263. DQ = 0; //DQ拉低
  264. delay_b20(500); //精確延時(shí)大于480us
  265. DQ = 1; //拉高
  266. delay_b20(80);
  267. }

  268. uchar ds1820rd()/*讀數(shù)據(jù)*/
  269. {
  270. uchar i=0;
  271. uchar dat = 0;
  272. for (i=0;i<8;i++)
  273. {
  274. DQ = 1; //給脈沖信號(hào)
  275. delay_b20(1);
  276. DQ = 0; //給脈沖信號(hào)
  277. delay_b20(1);
  278. dat>>=1;
  279. DQ = 1; //給脈沖信號(hào)
  280. if(DQ)
  281. dat|=0x80;
  282. delay_b20(60);
  283. }
  284. return(dat);
  285. }

  286. void ds1820wr(uchar dat)/*寫數(shù)據(jù)*/
  287. {
  288. uchar i=0;
  289. for (i=0; i<8; i++)
  290. {
  291. DQ = 1;
  292. delay_b20(1);
  293. DQ = 0;
  294. DQ = dat&0x01;
  295. delay_b20(60);
  296. DQ = 1;
  297. delay_b20(60);
  298. dat>>=1;
  299. }
  300. delay_b20(1);
  301. }
  302. ///////////讀取序列號(hào)//////////
  303. void DispCode()//讀取序列號(hào)
  304. {
  305. uchar i,temp;
  306. ds1820rst();
  307. ds1820wr(0x33);
  308. for (i=0;i<8;i++)
  309. {
  310. fCode[i]=ds1820rd();
  311. }
  312. wr_com(0x80+0x40);
  313. for (i=0;i<8;i++)
  314. {
  315. temp = fCode[i]>>4; //顯示高四位
  316. if (temp<10)
  317. wr_dat(temp + 0x30); // 顯示數(shù)字
  318. else
  319. wr_dat(temp + 0x37); //否則大于數(shù)字9顯示字母
  320. temp = fCode[i]&0x0f;//顯示低四位
  321. if (temp<10)
  322. wr_dat(temp+ 0x30);
  323. else
  324. wr_dat(temp + 0x37);
  325. }
  326. }

復(fù)制代碼

STC12C5A60S2多路測(cè)溫1602顯示并顯示DS18B20序列號(hào)

S0X483GL@VJDG}U_A@B0LBK.jpg (553.03 KB, 下載次數(shù): 171)

S0X483GL@VJDG}U_A@B0LBK.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:154205 發(fā)表于 2016-12-12 19:45 | 只看該作者
仿真中的那個(gè)ROM Serial Number要怎么和序列號(hào)對(duì)應(yīng)起來(lái)啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:79544 發(fā)表于 2016-12-24 12:52 | 只看該作者
我從來(lái)不要仿真,不清楚啊
回復(fù)

使用道具 舉報(bào)

地板
ID:58837 發(fā)表于 2016-12-25 05:36 | 只看該作者
強(qiáng)大,研究下如何設(shè)置多聯(lián)合體溫度警戒值的。
回復(fù)

使用道具 舉報(bào)

5#
ID:157262 發(fā)表于 2016-12-25 15:59 | 只看該作者
謝謝樓主的貢獻(xiàn)
回復(fù)

使用道具 舉報(bào)

6#
ID:157948 發(fā)表于 2016-12-27 09:46 | 只看該作者
謝謝樓主,請(qǐng)問(wèn)一下怎么能夠?qū)崿F(xiàn)兩個(gè)傳感器讀取數(shù)值求平均值,然后通過(guò)平均值與設(shè)定溫度比較控制繼電器的工作呢?
回復(fù)

使用道具 舉報(bào)

7#
ID:158130 發(fā)表于 2016-12-27 19:04 | 只看該作者
小白有點(diǎn)看不懂。。  蒙蒙的。。
回復(fù)

使用道具 舉報(bào)

8#
ID:321254 發(fā)表于 2018-5-3 15:01 | 只看該作者
需要用到哪些器件?
回復(fù)

使用道具 舉報(bào)

9#
ID:655075 發(fā)表于 2019-12-5 20:57 | 只看該作者
這個(gè)代碼能用嗎,這么仿真不了啊
回復(fù)

使用道具 舉報(bào)

10#
ID:335560 發(fā)表于 2019-12-6 10:47 | 只看該作者
可以用嗎
回復(fù)

使用道具 舉報(bào)

11#
ID:941569 發(fā)表于 2021-6-21 14:40 | 只看該作者
您好, 您發(fā)布的這個(gè)51單片機(jī)多路DS18B20測(cè)溫顯示并讀取序列號(hào),因?yàn)楣ぷ餍枰蚁敫骻一個(gè),可以嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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