求助!!如何实现温度的上下限报警???DS18B20

[复制链接]
 楼主| yoyoriten 发表于 2008-5-25 11:46 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;我的毕设是要实现温度的上下限指示,现在我只能做到给一个设定温度大于它则给一个降温指示,小于它则给加热指示.<br />&nbsp;&nbsp;但是要求是在一个温度范围内显示正常,大于高温则给一个降温指示,小于低温则给加热指示.<br />&nbsp;&nbsp;希望高手能给予指点一下.<br />&nbsp;&nbsp;我的部分程序如下/<br />////////////////////////////////<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;set_tmp=20,set_tmp1=15;<br />if(num_1&gtset_tmp)&nbsp;wind=1,hot=0;&nbsp;&nbsp;//温度&gt高温度,则启动风扇<br />if(num_1&lt=set_tmp||num_1&gt=set_tmp1)&nbsp;wind=0,hot=0;//温度合适,则不动作<br />if(num_1&ltset_tmp1)&nbsp;hot=1,wind=0;&nbsp;&nbsp;&nbsp;//温度&lt低温度,则启动加热<br />//////////////////////////////<br />#include&nbsp;&ltreg51.h&gt<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int<br />sbit&nbsp;wind=P1^7;<br />sbit&nbsp;hot=P1^6;<br />sbit&nbsp;DQ=P3^4;<br />code&nbsp;unsigned&nbsp;char&nbsp;key_code[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,0x7f,0x3f};<br />code&nbsp;unsigned&nbsp;char&nbsp;ksp2[4]={0xf8,0xf4,0xf2,0xf1};<br />unsigned&nbsp;char&nbsp;th,tl,tt,s[4],set_tmp=20,set_tmp1=15;<br /><br />//延时Tms<br />void&nbsp;delay(unsigned&nbsp;int&nbsp;t)<br />{unsigned&nbsp;&nbsp;char&nbsp;i;<br />while(t--)<br />&nbsp;&nbsp;&nbsp;{for(i=0;i&lt125;i++)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{;}<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//读取温度值部分<br />void&nbsp;rdtemp()<br />{unsigned&nbsp;int&nbsp;num;<br />unsigned&nbsp;char&nbsp;num_1;<br />unsigned&nbsp;char&nbsp;set_tmp1=15;<br />TxReset();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//产生复位脉冲,初始化DS18B20<br />RxWait();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待DS18B20给出应答脉冲<br />delay(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时<br />WrByte(0xcc);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//skip&nbsp;rom命令<br />WrByte(0xbe);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;scratchpad命令<br />tl=RdByte();<br />th=RdByte();<br />num=th*256+tl;&nbsp;&nbsp;&nbsp;&nbsp;//th左移8位或上tl<br />num=num&gt&gt4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据右移4位去掉小数位<br />s[0]=num%10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//个位<br />s[1]=(num/10)%10;&nbsp;&nbsp;&nbsp;//十位<br />num_1=num%256;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//得温度数值<br />if(num_1&gtset_tmp)&nbsp;wind=1,hot=0;&nbsp;&nbsp;//温度&gt设定温度,则启动风扇<br />if(num_1&lt=set_tmp||num_1&gt=set_tmp1)&nbsp;wind=0,hot=0,ok=1;&nbsp;&nbsp;//温度=设定温度,则不动作<br />if(num_1&ltset_tmp1)&nbsp;hot=1,wind=0;&nbsp;&nbsp;&nbsp;//温度&lt设定温度,则启动加热<br />}<br /><br />//读键写键部分<br />unsigned&nbsp;char&nbsp;got_key()<br />{&nbsp;unsigned&nbsp;char&nbsp;ks_1,ks_2;<br />&nbsp;&nbsp;&nbsp;ks_1=~P1;<br />&nbsp;&nbsp;&nbsp;ks_1=(ks_1&0x0f);//保留p1.0/p1.1/p1.2/p1.3<br />&nbsp;&nbsp;&nbsp;delay(1);<br />&nbsp;&nbsp;&nbsp;ks_2=~P1;<br />&nbsp;&nbsp;&nbsp;ks_2=(ks_2&0x0f);//保留p1.0/p1.1/p1.2/p1.3<br />&nbsp;&nbsp;&nbsp;if(ks_1==ks_2)&nbsp;return(ks_1);<br />&nbsp;&nbsp;&nbsp;else&nbsp;return(0);<br />}<br /><br />//按键设置<br />void&nbsp;set_key(unsigned&nbsp;char&nbsp;key)<br />{if(key==1)&nbsp;{set_tmp-=1;}<br />if(key==2)&nbsp;{set_tmp+=1;}<br />s[2]=set_tmp%10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设定温度个位<br />s[3]=set_tmp/10%10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设定温度十位<br />while(key)&nbsp;key=got_key();&nbsp;&nbsp;&nbsp;<br />}<br /><br />//定时器0中断服务子程序<br />void&nbsp;out()&nbsp;interrupt&nbsp;1<br />{unsigned&nbsp;char&nbsp;i;<br />TH0=0xfc;<br />TL0=0x18;<br />tt+=1;<br />i=tt%4;<br />P2=0;<br />if(i==2)&nbsp;P0=key_code[s];<br />else&nbsp;P0=key_code[s]+0x80;<br />P2=ksp2;<br />}<br /><br />//主程序<br />void&nbsp;main()<br />{unsigned&nbsp;char&nbsp;key;<br />unsigned&nbsp;int&nbsp;i;<br />hot=0;<br />wind=0;<br />IE=0x82;<br />TMOD=1;<br />TH0=0xe0;<br />TL0=0x00;<br />TR0=1;&nbsp;&nbsp;&nbsp;&nbsp;//启动定时计数器0<br />s[2]=set_tmp%10;<br />s[3]=set_tmp/10%10;<br />while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{delay(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TR0=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止定时计数器0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;convert();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动温度转换<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TR0=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动计数器0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt1000;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key=got_key();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(key)&nbsp;set_key(key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TR0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rdtemp();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TR1=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />&nbsp;<br />
computer00 发表于 2008-5-26 10:39 | 显示全部楼层

读取温度值然后跟设定的值比较啊。

可以看看我的代码,有个温度上限报警:<br /><br /> <br /> 相关链接:<a href='http://blog.21ic.com/user1/2198/archives/2008/48326.html'>http://blog.21ic.com/user1/2198/archives/2008/48326.html</a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部