本次完成了一个由c51主控的 简易的微波炉控制系统。
本次要求大致为:
1.可以设置低温20°,中温30°和高温50°。
2.可设置最长十分钟定时。
3.用DS18B20感知温度,当温度达到设置温度值时,并持续设定时间长度时,蜂鸣器提示,LED灯闪烁,同时时间归零。
如图:
数码管前俩位,是DS18B20实时监测的温度(28℃),中间俩位是预定的温度(高温挡50℃),后俩位是定时的时间(5min)。
其中使用DS18B20最初始的代码,就不多说了。并没有太多改动,只是讲DS18B20输出的温度设了一个temp1输出到函数中。
void datapros(int temp)
{float tp; if(temp< 0) //当温度值为负数{
// DisplayData[0] = 0x40; // -//因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}else{
// DisplayData[0] = 0x00;tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量//如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}temp1=temp;DisplayData[1] = smgduan[temp / 10000];DisplayData[2] = smgduan[temp % 10000 / 1000];DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;DisplayData[4] = smgduan[temp % 100 / 10];DisplayData[5] = smgduan[temp % 10];
}
下面是数码管显示的系统/
void display() //扫描显示动态数码管
{LSA=0; LSB=0; LSC=0; P0=DisplayData[2];delay(70); P0=0x00; LSA=1; LSB=0; LSC=0; P0=DisplayData[3];delay(70); P0=0x00;
// LSA=0; LSB=1; LSC=0; P0=smgduan[];delay(5); P0=0x00; LSA=1; LSB=1; LSC=0; P0=smgduan[ydz];delay(70); P0=0x00; LSA=0; LSB=0; LSC=1; P0=smgduan[0];delay(70); P0=0x00;
// LSA=1; LSB=0; LSC=1; P0=smgduan[10];delay(5); P0=0x00; LSA=0; LSB=1; LSC=1; P0=smgduan[F/10];delay(70); P0=0x00; LSA=1; LSB=1; LSC=1; P0=smgduan[F%10];delay(70); P0=0x00;
}
然后就是对温度选择的控制,我的想法是15-25℃为低温挡 、25-45℃为中温挡 、45-55℃为高温挡 。有很多不足,但仅对于DS18B20而言,没有加热的装置,所以范围是最简的选择。附上其中中档的定时及到点后的提示与报警。
if(25<temp1<45 && ydz==3) //中挡 25-45℃ 预定值为30{if(k2==0) //定时 开始{ delay(1000); if(k2==0) {ET0=~ET0;TR0=~TR0;}while(!k2); }if(F==0){ET0=0;TR0=0;led=~led;beep=~beep;} }
对定时时间的控制,我才用定时器0控制。但其中有很多来延误时间,所以只能给一个大致到一分钟的时间。
void Timer0() interrupt 1
{static u16 i;TH0=0XFC; //给定时器赋初值,定时1msTL0=0X18;i++;if(i==590000) //60s 不准确{i=0;F--;}
}
然后就是对档位的控制,因为档位并没有太高要求,我只用了 2 3 5 三个数字代替。
if(k1==0) //调节低温 中温 高温{ delay(1000); if(k1==0) {flat++;if(flat==1)ydz=3;else if(flat==2)ydz=5;else{flat=0;ydz=2;}}while(!k1); //检测按键是否松开}
最后就是主函数了
void main()
{Timer0Init(); //定时器1初始化beep=1;led=1;while(1){datapros(Ds18b20ReadTemp()); //数据处理函数 keypros();display();Time();}
}
总结:
本次专业课程设计并不是太难,只花了一下午和一晚上的时间,但对我而言 足够勉强混过这个课程了。当然,其中有很多不足,我也有很多想法:比如 再加湿度传感器、重力传感器、微波炉门有没有开关、以及加热时,加一个小风扇来使微波炉里面的热更加均匀。(再加云端、加入互联网,远程控制,更加智能化。但这些还要考虑如何将东西放入微波炉,就太复杂了)。但课程紧张,我想就这样吧,到此为止。谢谢观看