单片机温度报警器Proteus仿真代码

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

电路原理图如下:

单片机源程序如下:

  1. #include <AT89X52.h>

  2. #define uint unsigned int

  3. #define uchar unsigned char           //宏定义

  4. #define SET  P3_1                            //定义调整键

  5. #define DEC  P3_2                            //定义减少键

  6. #define ADD  P3_3                            //定义增加键

  7. #define BEEP P3_6                            //定义蜂鸣器

  8. #define ALAM P1_2                                //定义灯光报警

  9. #define DQ   P3_7                             //定义DS18B20总线I/O

  10. bit shanshuo_st;                            //闪烁间隔标志

  11. bit beep_st;                                     //蜂鸣器间隔标志

  12. sbit DIAN = P0^5;                        //小数点

  13. uchar x=0;                                      //计数器

  14. signed char m;                                     //温度值全局变量

  15. uchar n;                                              //温度值全局变量

  16. uchar set_st=0;                             //状态标志

  17. signed char shangxian=38;                  //上限报警温度,默认值为38

  18. signed char xiaxian=5;                   //下限报警温度,默认值为38

  19. //uchar code  LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};

  20. uchar code  LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B};

  21. //============================================================================================

  22. //====================================DS18B20=================================================

  23. //============================================================================================

  24. /*****延时子程序*****/

  25. void Delay_DS18B20(int num)

  26. {

  27. while(num--) ;

  28. }

  29. /*****初始化DS18B20*****/

  30. void Init_DS18B20(void)

  31. {

  32. unsigned char x=0;

  33. DQ = 1;         //DQ复位

  34. Delay_DS18B20(8);    //稍做延时

  35. DQ = 0;         //单片机将DQ拉低

  36. Delay_DS18B20(80);   //精确延时,大于480us

  37. DQ = 1;         //拉高总线

  38. Delay_DS18B20(14);

  39. x = DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败

  40. Delay_DS18B20(20);

  41. }

  42. /*****读一个字节*****/

  43. unsigned char ReadOneChar(void)

  44. {

  45. unsigned char i=0;

  46. unsigned char dat = 0;

  47. for (i=8;i>0;i--)

  48. {

  49. DQ = 0;     // 给脉冲信号

  50. dat>>=1;

  51. DQ = 1;     // 给脉冲信号

  52. if(DQ)

  53. dat|=0x80;

  54. Delay_DS18B20(4);

  55. }

  56. return(dat);

  57. }

  58. /*****写一个字节*****/

  59. void WriteOneChar(unsigned char dat)

  60. {

  61. unsigned char i=0;

  62. for (i=8; i>0; i--)

  63. {

  64. DQ = 0;

  65. DQ = dat&0x01;

  66. Delay_DS18B20(5);

  67. DQ = 1;

  68. dat>>=1;

  69. }

  70. }

  71. /*****读取温度*****/

  72. unsigned int ReadTemperature(void)

  73. {

  74. unsigned char a=0;

  75. unsigned char b=0;

  76. unsigned int t=0;

  77. float tt=0;

  78. Init_DS18B20();

  79. WriteOneChar(0xCC);  //跳过读序号列号的操作

  80. WriteOneChar(0x44);  //启动温度转换

  81. Init_DS18B20();

  82. WriteOneChar(0xCC);  //跳过读序号列号的操作

  83. WriteOneChar(0xBE);  //读取温度寄存器

  84. a=ReadOneChar();     //读低8位

  85. b=ReadOneChar();    //读高8位

  86. t=b;                                   //高8位转移到t

  87. t<<=8;                           //t数据左移8位

  88. t=t|a;                           //将t和a按位或,得到一个16位的数

  89. tt=t*0.0625;                   //将t乘以0.0625得到实际温度值(温度传感器设置12位精度,最小分辨率是0.0625)

  90. t= tt*10+0.5;     //放大10倍(将小数点后一位显示出来)输出并四舍五入

  91. return(t);                   //返回温度值

  92. }

  93. //=====================================================================================

  94. //=====================================================================================

  95. //=====================================================================================

  96. /*****延时子程序*****/

  97. void Delay(uint num)

  98. {

  99. while( --num );

  100. }

  101. /*****初始化定时器0*****/

  102. void InitTimer(void)

  103. {

  104. TMOD=0x1;

  105. TH0=0x3c;

  106. TL0=0xb0;     //50ms(晶振12M)

  107. }

  108. /*****读取温度*****/

  109. void check_wendu(void)

  110. {

  111. uint a,b,c;

  112. c=ReadTemperature();                          //获取温度值

  113. a=c/100;                                                     //计算得到十位数字

  114. b=c/10-a*10;                                            //计算得到个位数字

  115. m=c/10;                                                      //计算得到整数位

  116. n=c-a*100-b*10;                                    //计算得到小数位

  117. if(m<0){m=0;n=0;}                                   //设置温度显示上限

  118. if(m>99){m=99;n=9;}                                   //设置温度显示上限

  119. }

  120. /*****显示开机初始化等待画面*****/

  121. void Disp_init(void)

  122. {

  123. P0 = ~0x80;      //显示----

  124. P2 = 0x7F;

  125. Delay(200);

  126. P2 = 0xDF;

  127. Delay(200);

  128. P2 = 0xF7;

  129. Delay(200);

  130. P2 = 0xFD;

  131. Delay(200);

  132. P2 = 0xFF;         //关闭显示

  133. }

  134. /*****显示温度子程序*****/

  135. void Disp_Temperature(void)     //显示温度

  136. {

  137. P0 = ~0x98;      //显示C

  138. P2 = 0x7F;

  139. Delay(100);

  140. P2=0xff;

  141. P0=~LEDData[n];    //显示个位

  142. P2 = 0xDF;

  143. Delay(100);

  144. P2=0xff;

  145. P0 =~LEDData[m%10];    //显示十位

  146. DIAN = 0;         //显示小数点

  147. P2 = 0xF7;

  148. Delay(100);

  149. P2=0xff;

  150. P0 =~LEDData[m/10];    //显示百位

  151. P2 = 0xFD;

  152. Delay(100);

  153. P2 = 0xff;         //关闭显示

  154. }

  155. /*****显示报警温度子程序*****/

  156. void Disp_alarm(uchar baojing)

  157. {

  158. P0 =~0x98;      //显示C

  159. P2 = 0x7F;

  160. Delay(100);

  161. P2=0xff;

  162. P0 =~LEDData[baojing%10]; //显示十位

  163. P2 = 0xDF;

  164. Delay(100);

  165. P2=0xff;

  166. P0 =~LEDData[baojing/10]; //显示百位

  167. P2 = 0xF7;

  168. Delay(100);

  169. P2=0xff;

  170. if(set_st==1)P0 =~0xCE;

  171. else if(set_st==2)P0 =~0x1A; //上限H、下限L标示

  172. P2 = 0xFD;

  173. Delay(100);

  174. P2 = 0xff;         //关闭显示

  175. }

  176. /*****报警子程序*****/

  177. void Alarm()

  178. {

  179. if(x>=10){beep_st=~beep_st;x=0;}

  180. if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))

  181. {

  182. BEEP=0;

  183. ALAM=0;

  184. }

  185. else

  186. {

  187. BEEP=1;

  188. ALAM=1;

  189. }

  190. }

  191. /*****主函数*****/

  192. void main(void)

  193. {

  194. uint z;

  195. InitTimer();    //初始化定时器

  196. EA=1;      //全局中断开关

  197. TR0=1;

  198. ET0=1;      //开启定时器0

  199. IT0=1;

  200. IT1=1;

  201. check_wendu();

  202. check_wendu();

  203. for(z=0;z<300;z++)

  204. {

  205. Disp_init();

  206. }

  207. while(1)

  208. {

  209. if(SET==0)

  210. {

  211. Delay(2000);

  212. do{}while(SET==0);

  213. set_st++;x=0;shanshuo_st=1;

  214. if(set_st>2)set_st=0;

  215. }

  216. if(set_st==0)

  217. {

  218. EX0=0;    //关闭外部中断0

  219. EX1=0;    //关闭外部中断1

  220. check_wendu();

  221. Disp_Temperature();

  222. Alarm();   //报警检测

  223. }

  224. else if(set_st==1)

  225. {

  226. BEEP=1;    //关闭蜂鸣器

  227. ALAM=1;

  228. EX0=1;    //开启外部中断0

  229. EX1=1;    //开启外部中断1

  230. if(x>=10){shanshuo_st=~shanshuo_st;x=0;}

  231. if(shanshuo_st) {Disp_alarm(shangxian);}

  232. }

  233. else if(set_st==2)

  234. {

  235. BEEP=1;    //关闭蜂鸣器

  236. ALAM=1;

  237. EX0=1;    //开启外部中断0

  238. EX1=1;    //开启外部中断1

  239. if(x>=10){shanshuo_st=~shanshuo_st;x=0;}

  240. if(shanshuo_st) {Disp_alarm(xiaxian);}

  241. }

  242. }

  243. }

  244. /*****定时器0中断服务程序*****/

  245. void timer0(void) interrupt 1

  246. {

  247. TH0=0x3c;

  248. TL0=0xb0;

  249. x++;

  250. }

  251. /*****外部中断0服务程序*****/

  252. void int0(void) interrupt 0

  253. {

  254. EX0=0;      //关外部中断0

  255. if(DEC==0&&set_st==1)

  256. {

  257. do{

  258. Disp_alarm(shangxian);

  259. }

  260. while(DEC==0);

  261. shangxian--;

  262. if(shangxian<xiaxian)shangxian=xiaxian;

  263. }

  264. ……………………

  265. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

所有资料51hei提供下载:

(0)

相关推荐