当前位置:文档之家› 51温控系统说明书

51温控系统说明书

基于单片机的简单温控系统机控学院自动化12-2 潘星光3120619213实现功能:利用单片机89C52和热电偶进行测量发热电阻的温度,利用LCD1602进行显示的温度和人工可设置温度的上限与下限值,即有两个按键是来控制上限值的大小,而另两个按键则是控制下限值的大小的。

发热电阻从系统上电后就立即通电发热,设置好所需要温度范围,则测量温度显示的数值会随发热电阻通电时间的增大而增大,当测量的温度超出所设定的上限值时,就会驱动蜂鸣器报警,发热电阻停止通电,同时也会驱动马达扇风来降温;而当测量温度低于所设定的下限值时,也会进行报警,但电机不会被启动和发热电阻也继续通电发热。

当然当测量温度在上限值和下限值之间时,是不会进行报警和驱动马达的,但发热电阻仍处于通电状态中。

电路原理图:主程序:#include<reg52.h>#include<1602.h>#include<intrins.h>sbit ds = P2^2;sbit beep = P2^3;sbit rd = P3^7;sbit k = P1^0;bit flag;uchar ds_rom[8];uchar H,L,Key_value; void TempDelay(uchar us){while(us--); //6.51us }void ds_reset(){ds=1;_nop_();ds=0;TempDelay(80);//52 0usds=1;TempDelay(5);if(ds==0)flag=1;elseflag=0;TempDelay(20);ds=1;}bit ds_read_bit(){bit dat;ds=0;_nop_();_nop_();ds=1;_nop_();dat=ds;TempDelay(12);return dat;}uchar ds_read_byte(){uchar i,j,value;for(i=0;i<8;i++){j=ds_read_bit();value=(j<<7)|(value>>1);}return value;}void ds_write_byte(uchardat){uchar i,onebit;for(i=0;i<8;i++){onebit=dat&0x01;if(onebit)//写1{ds=0;TempDelay(1);ds=1;_nop_();}else //写0{ds=0;TempDelay(11);ds=1;_nop_();}dat>>=1;}}void ds_change(){ds_reset();ds_write_byte(0xcc);ds_write_byte(0x44);}uchar get_temperature(){uint temp;uchar a,b,c;ds_reset();ds_write_byte(0xcc);ds_write_byte(0xbe);a=ds_read_byte();b=ds_read_byte();temp=b;temp<<=8;temp|=a;c = temp*0.0625;return c;}void key(){Key_value = P3;Key_value =Key_value & 0x0f;if ( Key_value !=0x0f ){delay(5);if( Key_value != 0x0f ){switch(Key_value){case0x0e: H++; break;case0x0d: H--; break;case0x0b: L++; break;case0x07: L--; break;}}}}void main(){uchar i;rd = 0;init_1602();write_com( 0x80 + 0 + 3);write_data( 'H' );write_com( 0x80 + 0 + 8);write_data( 'L' );lcd_distostr(1,1,0);H = 35;L = 25;k = 1;while(1){ds_change();i = get_temperature();lcd_dis( 1,14,ucharto str( i ) );lcd_dis( 0,5,ucharto s tr( H ) );lcd_dis( 0,10,ucharto str( L ) );if ( i>=H){beep = 0;k = 0;}else if(i<=L){beep = 0;k = 1;}else{beep = 1;k = 1;}key();}}头文件1602.h程序:#define uchar unsigned char#define uint unsigned int sbit wela = P2^7;sbit dula = P2^6;sbit LCDEN = P3^4; sbit rs = P3^5;sbit rw = P3^6;uchar datstr[] = "Temperature:";uchar str[4];//uchartostr 函数转换的字符串同时可以把16进制转成10进制void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--); }void write_com(uchar com) //写命令{P0=com;rs=0;LCDEN=0;delay(10);LCDEN=1;delay(10);LCDEN=0;}void write_data(uchar date) //写数据{P0=date;rs=1;LCDEN=0;delay(10);LCDEN=1;delay(10);LCDEN=0;}void init_1602(){rw=0;dula=0;wela=0;write_com(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口delay(20);write_com(0x0c);//显示模式设置delay(20);write_com(0x06);//显示模式设置:光标右移,字符不移delay(20);write_com(0x01);//清屏幕指令,将以前的显示内容清除delay(20);}uchar *uchartostr(ucharnum) //将一个字节的数据转换为字符串或10进制{uchar x2,x1,x0,i;x2=num/100;x1=num%100/10;x0=num%100%10;i=0;if(x2!=0){str[i]=x2+48;i++;}if(x1!=0){str[i]=x1+48;i++;}str[i]=x0+48;i++;str[i]='\0';return str;}void lcd_dis(ucharX,uchar Y,uchar *dis) //显示数据数组{uchar pos;switch(X){case 0:X=0x00;break;case 1:X=0x40;break;break;default:break;}pos =0x80+X+Y;write_com(pos);//显示地址while(*dis!='\0'){write_data(*dis++);}}void lcd_distostr(ucharX,uchar Y,uchar dis)//显示字符串数组{uchar pos,i;i=dis; //设定从数组中的第几个字符串开始显示switch(X){case 0:X=0x00;break;case 1:X=0x40;break;break;default:break;}pos =0x80+X+Y;write_com(pos);//显示地址while(datstr[i] !='\0' ){write_data(datstr[i]);i++;}}主要问题:在只使用一个电源供电时,马达启动的瞬间,单片机会掉电重启以致使系统不能稳定工作下去。

可能原因:马达启动瞬间电流过大,以致此时单片机失电。

解决方法:采用双电源供电。

结果:在做好实物进行检验,系统通电后,设定好一个温度范围,经过一段时间后系统能按原设计思想进行温度报警和电机转动降温;但其中利用马达转动扇风降温,不能降至温度下限值以下,并且发热电阻在进行发热时,温度上升的速率也会较慢。

但在利用人为的方法后进行实验,发现系统可基本上按原设计思路运行。

总结:虽此次的实物并非能利用PCB板做出,而是利用万用板和单片机最小系统进行连接完成的,但所设计思路也能基本上利用硬件表达出来。

而最终的控制温度精度也不是很高,只有1℃左右,也算实现一个温度的粗略控制,这其中仍有许多地方有待改进。

而我也通过此次的实践,更加的加深单片机知识,也深知自身还有许多知识要去掌握。

说明书。

相关主题