51温控系统说明书

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于单片机的简单温控系统机控学院自动化12-2潘星光3120619213实现功能:利用单片机89C52和热电偶进行测量发热电阻的温度,利用LCD1602进行显示的温度和人工可设置温度的上限与下限值,即有两个按键是来控制上限值的大小,而另两个按键则是控制下限值的大小的。发热电阻从系统上电后就立即通电发热,设置好所需要温度范围,则测量温度显示的数值会随发热电阻通电时间的增大而增大,当测量的温度超出所设定的上限值时,就会驱动蜂鸣器报警,发热电阻停止通电,同时也会驱动马达扇风来降温;而当测量温度低于所设定的下限值时,也会进行报警,但电机不会被启动和发热电阻也继续通电发热。当然当测量温度在上限值和下限值之间时,是不会进行报警和驱动马达的,但发热电阻仍处于通电状态中。电路原理图:主程序:#includereg52.h#include1602.h#includeintrins.hsbitds=P2^2;sbitbeep=P2^3;sbitrd=P3^7;sbitk=P1^0;bitflag;uchards_rom[8];ucharH,L,Key_value;voidTempDelay(ucharus){while(us--);//6.51us}voidds_reset(){ds=1;_nop_();ds=0;TempDelay(80);//520usds=1;TempDelay(5);if(ds==0)flag=1;elseflag=0;TempDelay(20);ds=1;}bitds_read_bit(){bitdat;ds=0;_nop_();_nop_();ds=1;_nop_();dat=ds;TempDelay(12);returndat;}uchards_read_byte(){uchari,j,value;for(i=0;i8;i++){j=ds_read_bit();value=(j7)|(value1);}returnvalue;}voidds_write_byte(uchardat){uchari,onebit;for(i=0;i8;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;}}voidds_change(){ds_reset();ds_write_byte(0xcc);ds_write_byte(0x44);}ucharget_temperature(){uinttemp;uchara,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;returnc;}voidkey(){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;}}}}voidmain(){uchari;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,uchartostr(i));lcd_dis(0,5,uchartostr(H));lcd_dis(0,10,uchartostr(L));if(i=H){beep=0;k=0;}elseif(i=L){beep=0;k=1;}else{beep=1;k=1;}key();}}头文件1602.h程序:#defineucharunsignedchar#defineuintunsignedintsbitwela=P2^7;sbitdula=P2^6;sbitLCDEN=P3^4;sbitrs=P3^5;sbitrw=P3^6;uchardatstr[]=Temperature:;ucharstr[4];//uchartostr函数转换的字符串同时可以把16进制转成10进制voiddelay(uintz)//延时函数{uintx,y;for(x=z;x0;x--)for(y=120;y0;y--);}voidwrite_com(ucharcom)//写命令{P0=com;rs=0;LCDEN=0;delay(10);LCDEN=1;delay(10);LCDEN=0;}voidwrite_data(uchardate)//写数据{P0=date;rs=1;LCDEN=0;delay(10);LCDEN=1;delay(10);LCDEN=0;}voidinit_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进制{ucharx2,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';returnstr;}voidlcd_dis(ucharX,ucharY,uchar*dis)//显示数据数组{ucharpos;switch(X){case0:X=0x00;break;case1:X=0x40;break;break;default:break;}pos=0x80+X+Y;write_com(pos);//显示地址while(*dis!='\0'){write_data(*dis++);}}voidlcd_distostr(ucharX,ucharY,uchardis)//显示字符串数组{ucharpos,i;i=dis;//设定从数组中的第几个字符串开始显示switch(X){case0:X=0x00;break;case1:X=0x40;break;break;default:break;}pos=0x80+X+Y;write_com(pos);//显示地址while(datstr[i]!='\0'){write_data(datstr[i]);i++;}}主要问题:在只使用一个电源供电时,马达启动的瞬间,单片机会掉电重启以致使系统不能稳定工作下去。可能原因:马达启动瞬间电流过大,以致此时单片机失电。解决方法:采用双电源供电。结果:在做好实物进行检验,系统通电后,设定好一个温度范围,经过一段时间后系统能按原设计思想进行温度报警和电机转动降温;但其中利用马达转动扇风降温,不能降至温度下限值以下,并且发热电阻在进行发热时,温度上升的速率也会较慢。但在利用人为的方法后进行实验,发现系统可基本上按原设计思路运行。总结:虽此次的实物并非能利用PCB板做出,而是利用万用板和单片机最小系统进行连接完成的,但所设计思路也能基本上利用硬件表达出来。而最终的控制温度精度也不是很高,只有1℃左右,也算实现一个温度的粗略控制,这其中仍有许多地方有待改进。而我也通过此次的实践,更加的加深单片机知识,也深知自身还有许多知识要去掌握。说明书

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功