51温控系统说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的简单温控系统
机控学院自动化12-2 潘星光3120619213
实现功能:利用单片机89C52和热电偶进行测量发热电阻的温度,利用LCD1602进行显示的温度和人工可设置温度的上限与下限值,即有两个按键是来控制上限值的大小,而另两个按键则是控制下限值的大小的。发热电阻从系统上电后就立即通电发热,设置好所需要温度范围,则测量温度显示的数值会随发热电阻通电时间的增大而增大,当测量的温度超出所设定的上限值时,就会驱动蜂鸣器报警,发热电阻停止通电,同时也会驱动马达扇风来降温;而当测量温度低于所设定的下限值时,也会进行报警,但电机不会被启动和发热电阻也继续通电发热。当然当测量温度在上限值和下限值之间时,是不会进行报警和驱动马达的,但发热电阻仍处于通电状态中。
电路原理图:
主程序:
#include
#include<1602.h>
#include
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 0us
ds=1;
TempDelay(5);
if(ds==0)
flag=1;
else
flag=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(uchar
dat)
{
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)
{
case
0x0e: H++; break;
case
0x0d: H--; break;
case
0x0b: L++; break;
case
0x07: 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();
}
}