基于单片机的温控系统的技术报告.docx
《基于单片机的温控系统的技术报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的温控系统的技术报告.docx(13页珍藏版)》请在冰豆网上搜索。
![基于单片机的温控系统的技术报告.docx](https://file1.bdocx.com/fileroot1/2023-1/23/b5aa4ad0-040d-49a6-b8f4-0cbbf1372d6a/b5aa4ad0-040d-49a6-b8f4-0cbbf1372d6a1.gif)
基于单片机的温控系统的技术报告
基于单片机AT89C51温控系统的技术报告
学院:
自动化学院
参赛成员:
李瑞江(学号:
08200323)
陈小龙(学号:
08200316)
冉景海(学号:
08200318)
基于单片机AT89C51温控系统
一、原理
本设计以AT89C51单片机为控制核心设计了温度实时测量及控制系统。
单片机AT89C51能够根据温度传感器DS18B20所采集的温度数据来控制加热器或致冷器的启停,从而把温度控制在设定的范围之内。
在温控开关被激活的情况下,当温度低于设定的下限时,单片机启动加热器加热,同时点亮绿色发光二极管,当温度高于设定的上限时,单片机启动致冷器降温,同时点亮红色发光二极管。
因加热和制冷工作原理相同,本文仅进行高温制冷设计。
所有温度数据均通过7位LED数码管显示出来。
二、系统设计
1、方案设计
感器将温度信息变换为模拟电压信号后,将电压信号放大到单片机可以处理的范围内,经过低通滤波,滤掉干扰信号送入单片机。
单片机将检测到的温度信息与设定值进行比较,如果检测值高于设定值,则启动制冷系统,降低环境温度;同理,如果检测值低于设定值,则启动加热系统,提高环境温度,达到控制温度的目的。
该单片机温度控制系统是以AT89C51单片机为控制核心,用温度传感器DS18B20进行温度采集。
整个系统硬件部分包括温度检测系统、A/D转换、单片机、I/O设备、控制执行系统等。
单片机温控系统的控制原理如下图所示:
图一单片机温控系统的控制原理
2、硬件电路设计
设计中,使用AT89C51的P1.0管脚接收由温度传感器送出的数字温度信号;管脚P0.0~P0.7用于输出温度各位上的数字,连接LED数码管,作为显示内容;P2.0~P2.3管脚作为LED数码管轮流显示的控制信号的输出端;P3.6接绿灯(发出绿光的二极管),P3.5接红灯(发出红光的二极管);单片机的外围设备包括:
时钟振荡器、DS18B20数字温度传感器、温度显示设备和高温制冷电机等。
具体的硬件电路连接如下图:
(原理图)
3、软件程序设计
主程序调用了2个子程序,分别是LCD显示程序、温度采集程序。
LCD显示程序,用于温度等数据的实时显示;温度采集程序负责把DS18B20所采集的现场温度读入到指定的数组中。
主程序的流程图如下:
程序见附录:
三、PROTEUS仿真及结果
照硬件连接图所示电路原理图,在Proteus里面建立元器件连接关系。
根据设计功能要求在KeilμVision3环境下编写C语言程序,并编译连接生成十六进制的hex文件,把此文件加载到单片机,就可以进行Proteus仿真了。
仿真结果如下图所示:
(仿真结果)
程序设计中,我们定下的温度控制范围是0~99℃。
如仿真结果所示,当环境温度高于100℃,即为100℃时,数码管显示00.0C,为101℃时,数码管显示01.0C。
此时,P3.0管脚输出高电压,经过光电隔离设备,继电器中有电流流过,制冷电机工作。
当环境温度降低并低于于30℃时,蜂鸣器开始以慢“滴”声快报警,并且伴随红色发光二极管闪烁;当环境温度升高并高于45℃时,蜂鸣器开始以相同慢“滴”声报警并且伴随绿色发光二极管闪烁;当环境温度处于30—45℃之间时,蜂鸣器不报警且发光二极管不闪烁。
在硬件设计过程中,由于proteus仿真图中在数码管的位置没有接三极管,显示的效果较好,但在实际的电路中显示的数字较暗。
附录:
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint;
uintshangxian=35,xiaxian=30;
uchark1=0;
uintTempH,TempL;
sbitRED_LED=P3^6;
sbitGREEN_LED=P3^5;
sbitSPEAK=P3^7;
sbitchaidan=P1^2;
sbitjia=P3^1;
sbitjian=P3^2;
sbitDQ=P1^0;//ds18b20端口
sfrdataled=0x80;//显示数据端口
uinttemp;
ucharflag_get,count,num,minute,second;
ucharcodetab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
ucharstr[6];
voiddelay1(ucharMS);
unsignedintReadTemperature(void);
voidInit_DS18B20(void);
unsignedcharReadOneChar(void);
voidWriteOneChar(unsignedchardat);
voiddelay(unsignedinti);
voidprocess_alarm();
voidpresskey();
voidchengxux();
voidchengxus();
unsignedlongLedOut[5],LedNumVal;
voidUARTinit(void)
{
SCON=0x50;
TMOD|=0x20;
TH1=0xFD;
TR1=1;
TI=1;
}
zhuchengxu()
{
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
UARTinit();
P2=0x00;//赋初值
count=0;
while
(1)
{
str[5]=0xc6;//显示C符号
str[2]=tab[(TempH%100)/10];//十位温度
str[3]=tab[(TempH%100)%10]&0x7f;//个位温度,带小数点
str[4]=tab[TempL];
process_alarm();
if(flag_get==1)//定时读取当前温度
{
temp=ReadTemperature();
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
printf("%d.%d\n",TempH,TempL);
flag_get=0;
}
}
}
voidtim(void)interrupt1using1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if(num==200)
{num=0;
flag_get=1;//标志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
count++;
if(count==3)
{P2=0x01;
dataled=str[2];
}
if(count==4)
{P2=0x02;
dataled=str[3];
}
if(count==5)
{P2=0x04;
dataled=str[4];
}
if(count==6)
{P2=0x08;
dataled=str[5];
count=0;
}
}
voidpresskey()
{
if(chaidan==0)
{
delay(110);
if(chaidan==0)
{
k1++;
while(!
chaidan);
}
}
}
voiddelay(unsignedinti)//延时函数
{
while(i--);
}
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(10);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(5);
}
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(5);
}
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
b<<=8;
t=a+b;
return(t);
}
voidprocess_alarm()
{
if(TempH=5)
{
RED_LED=0;
SPEAK=0;
delay(11000);
RED_LED=1;
SPEAK=1;
delay(11000);
}
elseif(TempH>=shangxian&&TempH<85)
{
GREEN_LED=0;
SPEAK=0;
delay(5500);
GREEN_LED=1;
SPEAK=1;
delay(5500);
}
else
{
RED_LED=1;
SPEAK=0;
GREEN_LED=1;
}
}
voidchengxux()
{
unsignedintt,shi,ge,xiaoshu1,xiaoshu2;
t=xiaxian;
while
(1)
{
if(jia==0)
{
delay(1100);
if(jia==0)
{
t++;
while(jia);
}
}
if(xiaxian>=40)
{
xiaxian=0;
}
else
if(jian==0)
{
delay(1100);
if(jian==0)
{
xiaxian--;
while(jian);
}
}
if(xiaxian<=0)
{
xiaxian=40;
}
shi=t/1000;
ge=t%1000/100;
xiaoshu1=t%100/10;
xiaoshu2=t%10;
P2=0x01;
dataled=tab[shi];
delay(250);
P2=0x02;
dataled=tab[ge];
delay(250);
P2=0x04;
dataled=tab[xiaoshu1];
delay(250);
P2=0x08;
dataled=tab[xiaoshu2];
delay(250);
}
}
voidchengxus()
{
xiaxian=shangxian;
chengxux();
}
voidmain()
{
while
(1)
{
presskey();
switch(k1)
{
case0:
zhuchengxu();break;
case1:
chengxux();break;
case2:
chengxus();break;
case3:
zhuchengxu();break;
default:
break;
}
}
}