找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6783|回復(fù): 1
收起左側(cè)

制作容易能顯示正負值的單片機DS18B20測溫模塊

[復(fù)制鏈接]
ID:73477 發(fā)表于 2015-2-10 21:09 | 顯示全部樓層 |閱讀模式
       這款制作容易能顯示正負值的單片機DS18B20測溫模塊,只使用了6只元件:一片STC12C4052單片機、一個4位一體共陽數(shù)碼管,一只DS18B20數(shù)字溫度傳感器、一個USB插口、一個10uf貼片復(fù)位電容、一個10k的貼片復(fù)位電阻。單片機驅(qū)動數(shù)碼管的端口設(shè)置成推挽工作方式,這樣使用整個顯示電路比較簡單,數(shù)碼管段驅(qū)動端省去了限流電阻,數(shù)碼管亮度顯示通過程序控制通斷時間實現(xiàn)。由于電路比較簡單,這里直接給出PCB圖,制作PCB板時,我使用的是雕刻機雕刻,雕刻好后再用雕刻機鉆孔,之后手工去除多余的敷銅。設(shè)計溫度測量范圍是:-9.9~99.9℃,下面是制作過程,文后附有源程序,源程序適合于STC1T單片機。下圖是制作好的實物工作照片。
















    為了方便單片機愛好都仿制,附上源程序:

  1. //使用單片機內(nèi)部RC振蕩器

  2. #include<reg52.h>

  3. #include<intrins.h>

  4. #define uchar unsigned char

  5. #define uint unsigned int


  6. sfr P1M0   = 0x91;

  7. sfr P1M1   = 0x92;

  8. sfr P3M0   = 0xB1;

  9. sfr P3M1   = 0xB2;

  10. #define ENABLE_ISP 0x84 //系統(tǒng)工作時鐘<6MHz 時,對IAP_CONTR 寄存器設(shè)置此值


  11. sbit temp=P1^7;

  12. sbit LED0=P3^0;  //C

  13. sbit LED1=P1^4;  // 小數(shù)點后一位

  14. sbit LED2=P1^3;  //個位

  15. sbit LED3=P1^0;  // 十位

  16. sbit A=P1^1;

  17. sbit B_B=P1^5;

  18. sbit C=P3^2;

  19. sbit D=P3^4;

  20. sbit E=P3^5;

  21. sbit F=P1^2;

  22. sbit G=P3^1;

  23. sbit H=P3^3;  //小數(shù)點


  24. uchar temp_low,zf,mz;

  25. int temp_high;

  26. int final_temp;

  27. void dm(mz);


  28. void delay(uint x) //(x+1)*6微

  29. {


  30. while(x--);

  31. }


  32. void delay_long(uint x)

  33. {

  34. uint i;

  35. while(x--)

  36. {

  37. for(i=0;i<125;i++);

  38. }

  39. }


  40. void init_ds18b20()//初始化

  41. {

  42. temp=1;//復(fù)位

  43. delay(6);//稍作延時

  44. temp=0;

  45. delay(145);//延時大于480us(520us)

  46. temp=1;

  47. delay(14);//這個時間不能太長,否則就過了檢測信號的時間了

  48. }

  49. void read_signal()//讀取應(yīng)答脈沖

  50. {

  51. while(temp);

  52. while(~temp)//檢測到應(yīng)答脈沖

  53. {

  54. delay(7);

  55. break;

  56. }

  57. }

  58. bit readbit_ds18b20()

  59. {

  60. bit b;

  61. temp=1;

  62. delay(6);//稍作延時

  63. temp=0;

  64. delay(2);//保持低最少1us(4us)

  65. temp=1;

  66. delay(4);//延時15us以后輸出數(shù)據(jù)有效(23us)

  67. b=temp;

  68. delay(20);//讀時間間隙不少于60us(71us)

  69. return(b);

  70. }

  71. void writebyte_ds18b20(uchar b)//寫0寫1一起完成

  72. {

  73. int i,j;

  74. uchar btemp;

  75. temp=1;

  76. for(i=0;i<8;i++)

  77. {

  78. j=0;

  79. btemp=b&0x01;

  80. b>>=1;

  81. if(btemp==0)

  82. {

  83. temp=0;

  84. delay(18);//保持拉低在60us以上(71us)

  85. temp=1;

  86. }

  87. else

  88. {

  89. temp=0;

  90. j++;//15us之內(nèi)拉高

  91. temp=1;

  92. delay(18);//整個寫時序時間在60us以上(71us)

  93. }

  94. }

  95. }

  96. void temp_convert()

  97. {

  98. init_ds18b20();//初始化

  99. read_signal();//讀取應(yīng)答脈沖

  100. delay_long(4);

  101. writebyte_ds18b20(0xcc);//跳過驗證序列號命令,若單線上有多個ds18b20,則不可用這個命令

  102. writebyte_ds18b20(0x44);//啟動溫度轉(zhuǎn)換命令

  103. }

  104. char readbyte_ds18b20()

  105. {

  106. uint i;

  107. uchar a,b;

  108. b=0;

  109. for(i=0;i<8;i++)

  110. {

  111. a=readbit_ds18b20();

  112. b=(a<<i)|b;

  113. }

  114. return(b);

  115. }

  116. uint read_ds18b20()

  117. {

  118. int y;

  119. float yy;

  120. init_ds18b20();//初始化

  121. read_signal();//讀取應(yīng)答脈沖

  122. delay_long(4);

  123. writebyte_ds18b20(0xcc);//跳過驗證序列號命令

  124. writebyte_ds18b20(0xbbe);//讀取內(nèi)部ROM的數(shù)據(jù)

  125. temp_low=readbyte_ds18b20();//讀數(shù)據(jù)時低位在前,高位在后

  126. temp_high=readbyte_ds18b20();

  127. y=temp_high;

  128. y<<=8;

  129. y=y|temp_low;//整合為一個int型

  130. yy=y*0.0625;//12位精度為0.0625

  131. y=yy*10+0.5;

  132. return(y);

  133. }

  134. void display(uint x)

  135. {

  136. uchar sw,gw,xs;

  137. sw=x/100;

  138. gw=x%100/10; //個位

  139. xs=x%10; //小數(shù)

  140. if(zf==1)

  141. {

  142. sw=11;

  143. }

  144. else

  145. {

  146. if(sw==0)

  147. {

  148.    sw=12;

  149. }

  150. }

  151. dm(sw);

  152. LED3=1;

  153. delay(30);

  154. LED3=0;

  155. delay(10);

  156. dm(gw);

  157. LED2=1;

  158. delay(30);

  159. LED2=0;

  160. delay(10);

  161. dm(13);

  162. LED2=1;

  163. delay(10);

  164. LED2=0;

  165. delay(10);

  166. dm(xs);

  167. LED1=1;

  168. delay(30);

  169. LED1=0;

  170. delay(10);

  171. dm(10);

  172. LED0=1;

  173. delay(30);

  174. LED0=0;

  175. delay(10);

  176. }


  177. void dm(mz)

  178. {

  179. switch(mz)

  180. {

  181. case 0:A=0;B_B=0;C=0;D=0;E=0;F=0;G=1;H=1;break;

  182. case 1:A=1;B_B=0;C=0;D=1;E=1;F=1;G=1;H=1;break;

  183. case 2:A=0;B_B=0;C=1;D=0;E=0;F=1;G=0;H=1;break;

  184. case 3:A=0;B_B=0;C=0;D=0;E=1;F=1;G=0;H=1;break;

  185. case 4:A=1;B_B=0;C=0;D=1;E=1;F=0;G=0;H=1;break;

  186. case 5:A=0;B_B=1;C=0;D=0;E=1;F=0;G=0;H=1;break;

  187. case 6:A=0;B_B=1;C=0;D=0;E=0;F=0;G=0;H=1;break;

  188. case 7:A=0;B_B=0;C=0;D=1;E=1;F=1;G=1;H=1;break;

  189. case 8:A=0;B_B=0;C=0;D=0;E=0;F=0;G=0;H=1;break;

  190. case 9:A=0;B_B=0;C=0;D=0;E=1;F=0;G=0;H=1;break;

  191. case 10:A=0;B_B=1;C=1;D=0;E=0;F=0;G=1;H=1;break; //C

  192. case 11:A=1;B_B=1;C=1;D=1;E=1;F=1;G=0;H=1;break; //-

  193. case 12:A=1;B_B=1;C=1;D=1;E=1;F=1;G=1;H=1;break; //不顯示

  194. case 13:A=1;B_B=1;C=1;D=1;E=1;F=1;G=1;H=0;break; //小數(shù)點

  195. }

  196. }


  197. void main(void)

  198. {

  199.     P1M0 = 0x00;               

  200.     P1M1 = 0x19;   

  201.     P3M0=0x00;

  202.     P3M1=0x01;

  203.   LED0=0;  //C

  204. LED1=0;  // 小數(shù)點后一位

  205. LED2=0;  //個位

  206. LED3=0;  // 十位

  207. read_ds18b20();

  208. temp_convert();

  209. delay_long(5);

  210. delay_long(2000);//delay(5)就是延時555us

  211. while(1)

  212. {

  213. temp_convert();

  214. delay_long(5);

  215. final_temp=read_ds18b20();

  216. if(final_temp<0)

  217. {

  218.   final_temp=-(final_temp-1);

  219.   zf=1;

  220. }

  221. else zf=0;

  222. display(final_temp);

  223. }
  224. }
復(fù)制代碼





回復(fù)

使用道具 舉報

ID:109757 發(fā)表于 2016-3-19 22:05 | 顯示全部樓層
的是非得失vadv
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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