1、基于单片机的温控系统的技术报告基于单片机AT89C51温控系统的技术报告 学院:自动化学院 参赛成员:李瑞江(学号:08200323)陈小龙(学号:08200316)冉景海(学号:08200318)基于单片机AT89C51温控系统一、 原理本设计以AT89C51单片机为控制核心设计了温度实时测量及控制系统。单片机AT89C51 能够根据温度传感器DS18B20 所采集的温度数据来控制加热器或致冷器的启停,从而把温度控制在设定的范围之内。在温控开关被激活的情况下,当温度低于设定的下限时,单片机启动加热器加热,同时点亮绿色发光二极管,当温度高于设定的上限时,单片机启动致冷器降温,同时点亮红色发光二
2、极管。因加热和制冷工作原理相同,本文仅进行高温制冷设计。所有温度数据均通过7位LED数码管显示出来。二、 系统设计1、 方案设计感器将温度信息变换为模拟电压信号后,将电压信号放大到单片机可以处理的范围内,经过低通滤波,滤掉干扰信号送入单片机。单片机将检测到的温度信息与设定值进行比较,如果检测值高于设定值,则启动制冷系统,降低环境温度;同理,如果检测值低于设定值,则启动加热系统,提高环境温度,达到控制温度的目的。该单片机温度控制系统是以AT89C51单片机为控制核心,用温度传感器DS18B20进行温度采集。整个系统硬件部分包括温度检测系统、A/D转换、单片机、I/O设备、控制执行系统等。单片机温
3、控系统的控制原理如下图所示:图一 单片机温控系统的控制原理2、 硬件电路设计设计中,使用AT89C51的P1.0管脚接收由温度传感器送出的数字温度信号;管脚P0.0P0.7用于输出温度各位上的数字,连接LED数码管,作为显示内容;P2.0P2.3管脚作为LED数码管轮流显示的控制信号的输出端;P3.6接绿灯(发出绿光的二极管),P3.5接红灯(发出红光的二极管);单片机的外围设备包括:时钟振荡器、DS18B20数字温度传感器、温度显示设备和高温制冷电机等。具体的硬件电路连接如下图:(原理图)3、 软件程序设计主程序调用了2个子程序,分别是LCD 显示程序、温度采集程序。LCD 显示程序,用于温
4、度等数据的实时显示;温度采集程序负责把DS18B20所采集的现场温度读入到指定的数组中。主程序的流程图如下:程序见附录:三、 PROTEUS仿真及结果照硬件连接图所示电路原理图,在Proteus 里面建立元器件连接关系。根据设计功能要求在Keil Vision3 环境下编写C 语言程序,并编译连接生成十六进制的hex 文件,把此文件加载到单片机,就可以进行Proteus 仿真了。仿真结果如下图所示:(仿真结果)程序设计中,我们定下的温度控制范围是099。如仿真结果所示,当环境温度高于100,即为100时,数码管显示00.0C,为101时,数码管显示01.0C。此时,P3.0管脚输出高电压,经过
5、光电隔离设备,继电器中有电流流过,制冷电机工作。当环境温度降低并低于于30时,蜂鸣器开始以慢“滴”声快报警,并且伴随红色发光二极管闪烁;当环境温度升高并高于45时,蜂鸣器开始以相同慢“滴”声报警并且伴随绿色发光二极管闪烁;当环境温度处于3045之间时,蜂鸣器不报警且发光二极管不闪烁。在硬件设计过程中,由于proteus仿真图中在数码管的位置没有接三极管,显示的效果较好,但在实际的电路中显示的数字较暗。附录:#include #include#include #include#define uchar unsigned char#define uint unsigned int;uint sha
6、ngxian=35,xiaxian=30;uchar k1=0;uint TempH,TempL;sbit RED_LED=P36;sbit GREEN_LED=P35;sbit SPEAK=P37;sbit chaidan=P12;sbit jia=P31;sbit jian=P32;sbit DQ=P10;/ds18b20 端口sfr dataled=0x80;/显示数据端口uint temp;uchar flag_get,count,num,minute,second;uchar code tab=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
7、0x90; uchar str6;void delay1(uchar MS);unsigned int ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);void process_alarm();void presskey();void chengxux();void chengxus();unsigned long LedOut5,LedNumVal;void
8、UARTinit(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) str5=0xc6; /显示C符号 str2=tab(TempH%100)/10; /十位温度 str3=tab(TempH%100)%10&0x7f; /个位温度,带小数点 str4=tabTempL; process_alarm(); if(flag
9、_get=1) /定时读取当前温度 temp=ReadTemperature(); TempH=temp4; TempL=temp&0x0F; TempL=TempL*6/10;/小数近似处理 printf(%d.%dn,TempH,TempL); flag_get=0; void tim(void) interrupt 1 using 1/中断,用于数码管扫描和温度检测间隔 TH0=0xef;/定时器重装值 TL0=0xf0; num+; if (num=200) num=0; flag_get=1;/标志位有效 second+; if(second=60) second=0; minute
10、+; count+; if(count=3) P2=0x01; dataled=str2; if(count=4) P2=0x02; dataled=str3; if(count=5) P2=0x04; dataled=str4; if(count=6) P2=0x08; dataled=str5; count=0; void presskey() if(chaidan=0) delay(110); if(chaidan=0) k1+; while(!chaidan); void delay(unsigned int i)/延时函数 while(i-);void Init_DS18B20(vo
11、id) unsigned char x=0; DQ = 1; /DQ复位 delay(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay(10); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5);unsigned char ReadOneChar(void) unsigned char i=0; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ
12、) dat|=0x80; delay(5); return(dat);void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat=1; delay(5);unsigned int ReadTemperature(void) unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); / 跳过读序号列
13、号的操作 WriteOneChar(0x44); / 启动温度转换 delay(200); Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); /低位 b=ReadOneChar(); /高位 b=8; t=a+b; return(t);void process_alarm() if(TempH=5) RED_LED=0; SPEAK=0; delay(11000); RED_LED=1; SPEAK=1; delay(1
14、1000); else if(TempH=shangxian&TempH=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=tabshi; delay(250); P2=0x02; dataled=tabge; delay(250); P2=0x04; dataled=tabxiaoshu1; delay(250); P2=0x08; dataled=tabxiaoshu2; delay(250); void chengxus() xiaxian=shangxian; chengxux();void main() while(1) presskey(); switch(k1) case 0:zhuchengxu();break; case 1:chengxux();break; case 2:chengxus();break; case 3:zhuchengxu();break; default:break;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1