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