基于单片机的温控系统的技术报告.docx

上传人:b****6 文档编号:7379919 上传时间:2023-01-23 格式:DOCX 页数:13 大小:74.59KB
下载 相关 举报
基于单片机的温控系统的技术报告.docx_第1页
第1页 / 共13页
基于单片机的温控系统的技术报告.docx_第2页
第2页 / 共13页
基于单片机的温控系统的技术报告.docx_第3页
第3页 / 共13页
基于单片机的温控系统的技术报告.docx_第4页
第4页 / 共13页
基于单片机的温控系统的技术报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于单片机的温控系统的技术报告.docx

《基于单片机的温控系统的技术报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的温控系统的技术报告.docx(13页珍藏版)》请在冰豆网上搜索。

基于单片机的温控系统的技术报告.docx

基于单片机的温控系统的技术报告

 

基于单片机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;

}

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1