找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的温度传感器程序有问题

[复制链接]
跳转到指定楼层
楼主
ID:645942 发表于 2019-11-20 18:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于单片机的温度传感器怎么使蜂鸣器报警啊??在线等解释。这是我在网上找的程序,可是单片机温度显示到了32度了也不报警。

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit ds=P2^2;//温度传感器信号线
  6. sbit dula=P2^6;//数码管段选线
  7. sbit wela=P2^7;//数码管位选线
  8. sbit beep=P2^3;//蜂鸣器
  9. uint temp;//定义整型的温度数据
  10. float f_temp;//定义浮点型的温度数据
  11. uint warn_11=270;//定义温度下限值 是温度值乘以10后的结果
  12. uint warn_12=250;//定义温度下限值
  13. uint warn_h1=300;//定义温度上线值
  14. uint warn_h2=320;//定义温度上线值
  15. sbit led0=P1^0;//控制发光二极管
  16. sbit led1=P1^1;
  17. sbit led2=P1^2;
  18. sbit led3=P1^3;
  19. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  20. 0x07,0x7f,0x6f,//带小数点的0~9编码
  21. 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
  22. 0x87,0xff,0xff,0xef};//不带小数点的0~0编码
  23. void delay(uint z)//延时函数
  24. {
  25. uint x,y;
  26. for(x=z;x>0;x--)
  27. for(y=110;y>0;y--);
  28. }
  29. void dsreset(void)//DS1820复位,初始化函数
  30. {
  31. uint i;
  32. ds=0;
  33. i=103;
  34. while(i>0)i--;
  35. ds=1;
  36. i=4;
  37. while(i>0)i--;
  38. }
  39. bit tempreadbit(void)//读1位数据函数
  40. {
  41. uint i;
  42. bit dat;
  43. ds=0;i++;//i++起延时作用
  44. ds=1;i++;i++;
  45. dat=ds;
  46. i=8;while(i>0)i--;
  47. return(dat);
  48. }
  49. uchar tempread(void)//读1个字节数据函数
  50. {
  51. uchar i,j,dat;
  52. dat=0;
  53. for(i=1;i<=8;i++)
  54. {
  55. j=tempreadbit();
  56. dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在dat里
  57. }
  58. return(dat);
  59. }
  60. void tempwritebyte(uchar dat)//想DS18B20写一个字节数据函数
  61. {
  62. uint i;
  63. uchar j;
  64. bit testb;
  65. for(j=1;j<=8;j++)
  66. {
  67. testb=dat&0x01;
  68. dat=dat>>1;
  69. if(testb)//写1
  70. {
  71. ds=0;
  72. i++;i++;
  73. ds=1;
  74. i=8;while(i>0)i--;
  75. }
  76. else
  77. {
  78. ds=0;
  79. i=8;while(i>0)i--;
  80. ds=1;
  81. i++;i++;
  82. }
  83. }
  84. }
  85. void tempchange(void)//DS18B20开始获取温度并转换
  86. {
  87. dsreset();
  88. delay(1);
  89. tempwritebyte(0xcc);//写跳过读ROM指令
  90. tempwritebyte(0x44);//写温度转换指令
  91. }
  92. uint get_temp()//读取寄存器中存储的温度数据
  93. {
  94. uchar a,b;
  95. dsreset();
  96. delay(1);
  97. tempwritebyte(0xcc);
  98. tempwritebyte(0xbe);
  99. a=tempread();//读低8位
  100. b=tempread();//读高8位?
  101. temp=b;
  102. temp<<=8;//两个字节组合为1个字
  103. temp=temp|a;
  104. f_temp=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625度
  105. temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
  106. f_temp=f_temp+0.05;
  107. return temp;//temp是整型
  108. }
  109. void display(uchar num,uchar dat)//数据显示程序
  110. { //num是第几个数码管,dat是要显示的数字
  111. uchar i;
  112. dula=0;
  113. P0=table[dat];//编码赋给P0口
  114. dula=1;
  115. dula=0;
  116. wela=0;
  117. i=0xff;
  118. i=i&(~((0x01)<<(num)));//用i来存储位选数据,只有一位为0
  119. P0=i;
  120. wela=1;
  121. wela=0;
  122. delay(1);
  123. }
  124. void dis_temp(uint t)//显示温度数值函数t传递的是整型的温度值
  125. {
  126. uchar i;
  127. i=t/100;//除以100得到商,为温度的十位
  128. display(0,i);//在第1个数码管上显示
  129. i=t%100/10;//100取余再除以10得到商,为温度的个位
  130. display(1,i+10);//在第2个数码管上显示
  131. i=t%100%10;//100取余再用10取余,为温度的小数位
  132. display(2,i);//在第3个数码管上显示
  133. }
  134. void warn(uint s,uchar led)//蜂鸣器报警,灯闪烁
  135. {//s控制音调,led控制灯
  136. uchar i;i=s;
  137. beep=0;//蜂鸣器响
  138. P1=~(led);//控制相应的灯亮
  139. while(i--)
  140. {
  141. dis_temp(get_temp());//用温度显示函数起到延时作用
  142. }
  143. beep=1;//蜂鸣器不响
  144. P1=0xff;//控制相应的灯灭
  145. i=s;
  146. while(i--)
  147. {
  148. dis_temp(get_temp());//用温度显示函数起到延时作用
  149. }
  150. }
  151. void deal(uint t)//温度处理函数
  152. {
  153. uchar i;
  154. if((t>warn_12)&&(t<=warn_11))//大于25度小于27度
  155. {
  156. warn(40,0x01);//第1个灯亮,蜂鸣器发出滴?
  157. }
  158. else if(t<=warn_12)//小于25度
  159. {
  160. warn(10,0x03);//第1个和第2个灯亮,蜂鸣器发出滴
  161. }
  162. else if((t<warn_h2)&&(t>=warn_h1))//小于32度大于30度
  163. {
  164. warn(40,0x04);//第3个灯亮,蜂鸣器发出滴
  165. }
  166. else if(t>warn_h2)//大于32度
  167. {
  168. warn(10,0x0c);//第3,4个灯亮,蜂鸣器发出滴
  169. }
  170. else //在27度和30度之间时只是调用显示函数延时
  171. {
  172. i=40;
  173. while(i--)
  174. {
  175. dis_temp(get_temp());
  176. }
  177. }
  178. }
  179. void init_com(void)//串口初始化函数
  180. {
  181. TMOD=0X20;
  182. PCON=0X00;
  183. SCON=0X50;
  184. TH1=0XFD;//波特率9600
  185. TL1=0XFD;
  186. TR1=1;
  187. }
  188. void comm(char*parr)//串口数据发送函数
  189. {
  190. do
  191. {
  192. SBUF=*parr++;//发送数据
  193. while(!TI);//等待发送完成标志为1
  194. TI=0;//标志清零
  195. }while(*parr);//保持循环直到字符为'\0'
  196. }
  197. void main()
  198. {
  199. uchar buff[4],i;
  200. dula=0;
  201. wela=0;
  202. init_com();
  203. while(1)
  204. {
  205. tempchange();//温度转换函数
  206. for(i=10;i>0;i--)
  207. {
  208. dis_temp(get_temp());//获取温度并显示
  209. }
  210. deal(temp);//进行温度处理
  211. sprintf(buff,"%f",f_temp);//将浮点型温度格式转化为字符型
  212. for(i=10;i>0;i--)
  213. {
  214. dis_temp(get_temp());//温度显示
  215. }
  216. comm(buff);//串口发送数据
  217. for(i=10;i>0;i--)
  218. {
  219. dis_temp(get_temp());//温度显示
  220. }
  221. }   
  222. }
复制代码


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

使用道具 举报

沙发
ID:395068 发表于 2019-11-21 09:43 | 只看该作者
先检查蜂鸣器部分电路是否有问题,然后再检查程序是否有错
回复

使用道具 举报

板凳
ID:213173 发表于 2019-11-21 13:31 | 只看该作者
程序没有问题,是你的硬件电路与程序不符导致异常。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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