找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27482|回复: 19
打印 上一主题 下一主题
收起左侧

单片机温度报警器 电路图+程序

  [复制链接]
跳转到指定楼层
楼主


  1. #include <REG52.H>
  2. #include<intrins.h> //包含_nop_()函数定义的头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS=P2^0;
  6. sbit RW=P2^1;
  7. sbit EN=P2^2;
  8. sbit DQ=P3^3;
  9. sbit LED1=P2^3;
  10. sbit LED2=P2^6;
  11. sbit fmq=P1^6;
  12. union{
  13. uchar c[2];
  14. uint x;
  15. }temp;
  16. uint cc,cc2;
  17. float cc1;
  18. bit flag1;
  19. uchar buffer1[]={"dangerous!!"} ;
  20. uchar buffer2[]={"welcome!!!!"};
  21. uchar buffer3[]={"tem"};
  22. uchar num[6]={"+00.0"};
  23. /*void delay1us(uint z)
  24. {
  25. uchar x,y;
  26. for(x=z;x>0;x--)
  27. for(y=110;y>0;y--)
  28. {;} //500us
  29. }*/
  30. void delay500us()
  31. {
  32. unsigned char j;
  33. for(j=0;j<57;j++)
  34. {;} //500us
  35. }
  36. void beep()
  37. {
  38. fmq=0;
  39. delay500us(); /* 频率为1kHz,500us的低电平,导通(三极管)*/
  40. fmq=1; /* 频率为1kHz,500us的高电平,未通(三极管)*/
  41. delay500us();
  42. }
  43. //查忙函数
  44. void wait()
  45. {
  46. P0=0xff;
  47. RS=0;
  48. RW=1;
  49. EN=1;
  50. EN=0;
  51. while(P0&0x80)
  52. {
  53. EN=0;
  54. EN=1;
  55. }
  56. }
  57. void wc51com(uchar com)
  58. {
  59. wait();
  60. EN=0;
  61. RS=0;
  62. RW=0;
  63. EN=1;
  64. P0=com;
  65. EN=0;
  66. }
  67. void wc51r(uchar dat)
  68. {
  69. wait();
  70. EN=0;
  71. RS=1;
  72. RW=0;
  73. EN=1;
  74. P0=dat;
  75. EN=0;
  76. }
  77. void init()
  78. {
  79. wc51com(0x01);
  80. wc51com(0x38);
  81. wc51com(0x0c);
  82. wc51com(0x06);
  83. }
  84. /*****************************
  85. **********************************************/
  86. void delay(int useconds)
  87. {
  88. for(; useconds>0;useconds--);
  89. }
  90. uchar ow_reset(void)
  91. {
  92. uchar presence;
  93. DQ=0;//CPU把总线拉低的操作;
  94. delay(50);//拉低480微秒到960微秒
  95. DQ=1;//CPU释放总线
  96. delay(3);//延时15——60微秒;待总线回到高电平唤醒13B20
  97. presence=DQ;//DS13B20把总线发送低电平表示复位成功;13B20完好可以工作
  98. delay(25);//延时60到240
  99. return(presence) ;
  100. }
  101. uchar read_byte(void)
  102. {
  103. uchar i;
  104. uchar value=0;
  105. for(i=8; i>0;i--)
  106. {
  107. value>>=1;
  108. DQ=0;
  109. DQ=1;
  110. delay(1);
  111. if(DQ) value|=0x80;
  112. delay(6);
  113. }
  114. return(value);
  115. }
  116. void write_byte(uchar val)
  117. {
  118. uchar i;
  119. for(i=8;i>0;i--)
  120. {
  121. DQ=0;
  122. DQ=val&0x01;
  123. delay(5);
  124. DQ=1;
  125. val=val/2;
  126. }
  127. delay(5);
  128. }
  129. void read_Temperature(void)
  130. {
  131. ow_reset();//初始化; 复位
  132. write_byte(0xCC);//温度变化指令(最开始为0)
  133. write_byte(0xBE);//读9个字节类容的温度
  134. temp.c[1]=read_byte(); //读出来显示低位
  135. temp.c[0]=read_byte(); //读出来显示高位
  136. _nop_(); _nop_();_nop_();
  137. ow_reset(); //初始化
  138. write_byte(0xCC); //温度变化指令
  139. write_byte(0x44);//读存入到9个字节中
  140. return;
  141. }
  142. void main()
  143. {
  144. uchar k=0;
  145. uint t=0;
  146. delay(10); fmq=1;
  147. EA=0;
  148. flag1=0;
  149. init();
  150. wc51com(0x80+0x00);
  151. wc51r('m');
  152. wc51r('e');
  153. while(1)
  154. {
  155. delay(10000);
  156. read_Temperature();
  157. cc=temp.c[0]*256.0+temp.c[1];
  158. if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
  159. cc1=cc*0.0625; //得到实际的值;
  160. cc2=cc1*100;//1710
  161. if(((cc2/1000)*10+(cc2/100-(cc2/1000)*10)>=37)&((cc2/1000)*10+(cc2/100-(cc2/1000)*10)<=40))
  162. {
  163. LED2=1;
  164. LED1=0;
  165. wc51com(0x80+0x04);
  166. for(k=0;k<11;k++)
  167. {wc51r(buffer2[k]);}
  168. }
  169. else
  170. {
  171. LED2=0;
  172. LED1=1;
  173. wc51com(0x80+0x04);
  174. for(k=0;k<11;k++)
  175. {
  176. wc51r(buffer1[k]);
  177. }
  178. wc51com(0x80+0x40) ;
  179. for(k=0;k<3;k++)
  180. {
  181. wc51r(buffer3[k]);
  182. }
  183. for(t=0;t<1000;t++) //响
  184. {
  185. {
  186. beep(); //一次循环是1kHz,1MS;1000表示蜂鸣器响起来
  187. }
  188. fmq=1; //不响;
  189. delay500us();
  190. delay500us();
  191. }
  192. }
  193. num[1]=cc2/1000+0x30;//1710/100=1;
  194. if(num[1]==0x30)
  195. num[1]=0x20;
  196. num[2]=cc2/100-(cc2/1000)*10+0x30;//1710/100=17-(1*10)=7;
  197. num[4]=cc2/10-(cc2/100)*10+0x30;//1710/10=171-(17*10)=1
  198. if(flag1==1)
  199. {
  200. num[0]='-';
  201. }
  202. else
  203. num[0]='+';
  204. wc51com(0x80+0x44);
  205. for(k=0;k<5;k++)
  206. {wc51r(num[k]);}
  207. }
  208. }#include <REG52.H>
  209. #include<intrins.h> //包含_nop_()函数定义的头文件
  210. #define uchar unsigned char
  211. #define uint unsigned int
  212. sbit RS=P2^0;
  213. sbit RW=P2^1;
  214. sbit EN=P2^2;
  215. sbit DQ=P3^3;
  216. sbit LED1=P2^3;
  217. sbit LED2=P2^6;
  218. sbit fmq=P1^6;
  219. union{
  220. uchar c[2];
  221. uint x;
  222. }temp;
  223. uint cc,cc2;
  224. float cc1;
  225. bit flag1;
  226. uchar buffer1[]={"dangerous!!"} ;
  227. uchar buffer2[]={"welcome!!!!"};
  228. uchar buffer3[]={"tem"};
  229. uchar num[6]={"+00.0"};
  230. /*void delay1us(uint z)
  231. {
  232. uchar x,y;
  233. for(x=z;x>0;x--)
  234. for(y=110;y>0;y--)
  235. {;} //500us
  236. }*/
  237. void delay500us()
  238. {
  239. unsigned char j;
  240. for(j=0;j<57;j++)
  241. {;} //500us
  242. }
  243. void beep()
  244. {
  245. fmq=0;
  246. delay500us(); /* 频率为1kHz,500us的低电平,导通(三极管)*/
  247. fmq=1; /* 频率为1kHz,500us的高电平,未通(三极管)*/
  248. delay500us();
  249. }
  250. //查忙函数
  251. void wait()
  252. {
  253. P0=0xff;
  254. RS=0;
  255. RW=1;
  256. EN=1;
  257. EN=0;
  258. while(P0&0x80)
  259. {
  260. EN=0;
  261. EN=1;
  262. }
  263. }
  264. void wc51com(uchar com)
  265. {
  266. wait();
  267. EN=0;
  268. RS=0;
  269. RW=0;
  270. EN=1;
  271. P0=com;
  272. EN=0;
  273. }
  274. void wc51r(uchar dat)
  275. {
  276. wait();
  277. EN=0;
  278. RS=1;
  279. RW=0;
  280. EN=1;
  281. P0=dat;
  282. EN=0;
  283. }
  284. void init()
  285. {
  286. wc51com(0x01);
  287. wc51com(0x38);
  288. wc51com(0x0c);
  289. wc51com(0x06);
  290. }
  291. /*****************************
  292. **********************************************/
  293. void delay(int useconds)
  294. {
  295. for(; useconds>0;useconds--);
  296. }
  297. uchar ow_reset(void)
  298. {
  299. uchar presence;
  300. DQ=0;//CPU把总线拉低的操作;
  301. delay(50);//拉低480微秒到960微秒
  302. DQ=1;//CPU释放总线
  303. delay(3);//延时15——60微秒;待总线回到高电平唤醒13B20
  304. presence=DQ;//DS13B20把总线发送低电平表示复位成功;13B20完好可以工作
  305. delay(25);//延时60到240
  306. return(presence) ;
  307. }
  308. uchar read_byte(void)
  309. {
  310. uchar i;
  311. uchar value=0;
  312. for(i=8; i>0;i--)
  313. {
  314. value>>=1;
  315. DQ=0;
  316. DQ=1;
  317. delay(1);
  318. if(DQ) value|=0x80;
  319. delay(6);
  320. }
  321. return(value);
  322. }
  323. void write_byte(uchar val)
  324. {
  325. uchar i;
  326. for(i=8;i>0;i--)
  327. {
  328. DQ=0;
  329. DQ=val&0x01;
  330. delay(5);
  331. DQ=1;
  332. val=val/2;
  333. }
  334. delay(5);
  335. }
  336. void read_Temperature(void)
  337. {
  338. ow_reset();//初始化; 复位
  339. write_byte(0xCC);//温度变化指令(最开始为0)
  340. write_byte(0xBE);//读9个字节类容的温度
  341. temp.c[1]=read_byte(); //读出来显示低位
  342. temp.c[0]=read_byte(); //读出来显示高位
  343. _nop_(); _nop_();_nop_();
  344. ow_reset(); //初始化
  345. write_byte(0xCC); //温度变化指令
  346. write_byte(0x44);//读存入到9个字节中
  347. return;
  348. }
  349. void main()
  350. {
  351. uchar k=0;
  352. uint t=0;
  353. delay(10); fmq=1;
  354. EA=0;
  355. flag1=0;
  356. init();
  357. wc51com(0x80+0x00);
  358. wc51r('m');
  359. wc51r('e');
  360. while(1)
  361. {
  362. delay(10000);
  363. read_Temperature();
  364. cc=temp.c[0]*256.0+temp.c[1];
  365. if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
  366. cc1=cc*0.0625; //得到实际的值;
  367. cc2=cc1*100;//1710
  368. if(((cc2/1000)*10+(cc2/100-(cc2/1000)*10)>=37)&((cc2/1000)*10+(cc2/100-(cc2/1000)*10)<=40))
  369. {
  370. LED2=1;
  371. LED1=0;
  372. wc51com(0x80+0x04);
  373. for(k=0;k<11;k++)
  374. {wc51r(buffer2[k]);}
  375. }
  376. else
  377. {
  378. LED2=0;
  379. LED1=1;
  380. wc51com(0x80+0x04);
  381. for(k=0;k<11;k++)
  382. {
  383. wc51r(buffer1[k]);
  384. }
  385. wc51com(0x80+0x40) ;
  386. for(k=0;k<3;k++)
  387. {
  388. wc51r(buffer3[k]);
  389. }
  390. for(t=0;t<1000;t++) //响
  391. {
  392. {
  393. beep(); //一次循环是1kHz,1MS;1000表示蜂鸣器响起来
  394. }
  395. fmq=1; //不响;
  396. delay500us();
  397. delay500us();
  398. }
  399. }
  400. num[1]=cc2/1000+0x30;//1710/100=1;
  401. if(num[1]==0x30)
  402. num[1]=0x20;
  403. num[2]=cc2/100-(cc2/1000)*10+0x30;//1710/100=17-(1*10)=7;
  404. num[4]=cc2/10-(cc2/100)*10+0x30;//1710/10=171-(17*10)=1
  405. if(flag1==1)
  406. {
  407. num[0]='-';
  408. }
  409. else
  410. num[0]='+';
  411. wc51com(0x80+0x44);
  412. for(k=0;k<5;k++)
  413. {wc51r(num[k]);}
  414. }
  415. }
复制代码


评分

参与人数 1黑币 +5 收起 理由
348652560 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:44267 发表于 2015-9-25 09:44 | 只看该作者
怎么有两个头件定义啊
回复

使用道具 举报

板凳
ID:44267 发表于 2015-9-25 10:36 | 只看该作者
正好做一个太强了,赚点币
回复

使用道具 举报

地板
ID:91047 发表于 2015-9-25 18:52 | 只看该作者
大神请问一下= =
cc=temp.c[0]*256.0+temp.c[1];
if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
cc1=cc*0.0625; //得到实际的值;
cc2=cc1*100;//1710
这一段是怎么算的= =代表了什么意思
回复

使用道具 举报

5#
ID:99710 发表于 2015-12-20 19:50 | 只看该作者
大神可以发张原理图看看吗?放大太模糊了
回复

使用道具 举报

6#
ID:112184 发表于 2016-6-14 22:04 | 只看该作者
大神请问一下= =
cc=temp.c[0]*256.0+temp.c[1];
if(temp.c[0]>0xf8){flag1=1;cc=~cc+1;}else flag1=0;
cc1=cc*0.0625; //得到实际的值;
回复

使用道具 举报

7#
ID:147836 发表于 2016-11-14 18:05 | 只看该作者
这个图能发个清晰点点吗
回复

使用道具 举报

8#
ID:147840 发表于 2016-11-14 18:19 | 只看该作者

这个图能发个清晰点点吗谢谢分享
回复

使用道具 举报

9#
ID:165792 发表于 2017-2-26 13:50 | 只看该作者
没有文件下载?
回复

使用道具 举报

10#
ID:165792 发表于 2017-3-25 07:52 来自手机 | 只看该作者
学习了,不错不错
回复

使用道具 举报

11#
ID:210935 发表于 2017-6-13 21:59 | 只看该作者
有图吗
回复

使用道具 举报

12#
ID:211258 发表于 2017-6-15 17:40 | 只看该作者
非常好
回复

使用道具 举报

13#
ID:212394 发表于 2017-6-19 17:38 | 只看该作者
大神,这个温度范围是多少啊,
回复

使用道具 举报

14#
ID:223694 发表于 2017-10-16 10:52 | 只看该作者
楼主,能不能发一张清楚一点的图,这个图太模糊了,谢谢啦
回复

使用道具 举报

15#
ID:95509 发表于 2017-10-17 11:16 | 只看该作者
学习了!
回复

使用道具 举报

16#
ID:293770 发表于 2018-3-18 22:02 | 只看该作者
可以的
回复

使用道具 举报

17#
ID:294610 发表于 2018-3-20 17:27 | 只看该作者
很厉害
回复

使用道具 举报

18#
ID:321916 发表于 2018-5-4 11:07 | 只看该作者
大神,能把电路图的文件发来么
回复

使用道具 举报

19#
ID:507412 发表于 2019-4-8 21:48 | 只看该作者
非常给力!!!
回复

使用道具 举报

20#
ID:777413 发表于 2020-6-15 11:41 | 只看该作者
可以发下仿真链接吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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