找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5809|回复: 1
收起左侧

制作容易能显示正负值的单片机DS18B20测温模块

[复制链接]
ID:73477 发表于 2015-2-10 21:09 | 显示全部楼层 |阅读模式
       这款制作容易能显示正负值的单片机DS18B20测温模块,只使用了6只元件:一片STC12C4052单片机、一个4位一体共阳数码管,一只DS18B20数字温度传感器、一个USB插口、一个10uf贴片复位电容、一个10k的贴片复位电阻。单片机驱动数码管的端口设置成推挽工作方式,这样使用整个显示电路比较简单,数码管段驱动端省去了限流电阻,数码管亮度显示通过程序控制通断时间实现。由于电路比较简单,这里直接给出PCB图,制作PCB板时,我使用的是雕刻机雕刻,雕刻好后再用雕刻机钻孔,之后手工去除多余的敷铜。设计温度测量范围是:-9.9~99.9℃,下面是制作过程,文后附有源程序,源程序适合于STC1T单片机。下图是制作好的实物工作照片。
















    为了方便单片机爱好都仿制,附上源程序:

  1. //使用单片机内部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 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值


  11. sbit temp=P1^7;

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

  13. sbit LED1=P1^4;  // 小数点后一位

  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;  //小数点


  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;//复位

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

  44. temp=0;

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

  46. temp=1;

  47. delay(14);//这个时间不能太长,否则就过了检测信号的时间了

  48. }

  49. void read_signal()//读取应答脉冲

  50. {

  51. while(temp);

  52. while(~temp)//检测到应答脉冲

  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以后输出数据有效(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之内拉高

  91. temp=1;

  92. delay(18);//整个写时序时间在60us以上(71us)

  93. }

  94. }

  95. }

  96. void temp_convert()

  97. {

  98. init_ds18b20();//初始化

  99. read_signal();//读取应答脉冲

  100. delay_long(4);

  101. writebyte_ds18b20(0xcc);//跳过验证序列号命令,若单线上有多个ds18b20,则不可用这个命令

  102. writebyte_ds18b20(0x44);//启动温度转换命令

  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();//读取应答脉冲

  122. delay_long(4);

  123. writebyte_ds18b20(0xcc);//跳过验证序列号命令

  124. writebyte_ds18b20(0xbbe);//读取内部ROM的数据

  125. temp_low=readbyte_ds18b20();//读数据时低位在前,高位在后

  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; //小数

  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; //小数点

  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;  // 小数点后一位

  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. }
复制代码





回复

使用道具 举报

ID:109757 发表于 2016-3-19 22:05 | 显示全部楼层
的是非得失vadv
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表