当前位置:文档之家› 基于单片机的温度控制器设计

基于单片机的温度控制器设计

基于单片机的温度控制器设计1引言1.1设计目的1.温度显示的基本范围-55℃—128℃;2.精度误差等于0.1℃;3.所测温度值由四位数码管显示;4.可以任意设定温度的上下限报警功能。

1.2设计要求设计一个温度控制电路,用AT89C51作为温度测试控制系统设计的核心器件,用数字温度传感器DS18B20实现温度的测量,用数码管显示对应的温度。

通过指示灯和报警器完成温度上下限的报警指示功能,并通过对电风扇和电热丝的操作,使其恢复到要求的范围内。

设计加、减按钮以及设置按钮实现上下限温度的任意设定。

2系统方案设计该方案使用了AT89C51单片机作为控制核心,以智能温度传感器DS18B20为温度测量元件,对各点温度进行检测,设置温度上下限,超过其温度值就报警指示,并通过控制使温度恢复到要求的范围内。

显示电路采用4位共阴极LED数码管显示。

使用三极管,电阻,指示灯和蜂鸣器组成的报警指示电路,设计温度控制器,实现温度的测量、控制、报警、显示、设置等功能。

总体设计方框图如图1所示:图1 总体设计方框图3硬件设计3.1温度传感器与单片机的连接用AT89C51作为温度控制系统设计的核心器件。

AT89C51是一种低损耗、高性能、CMOS八位微处理器。

DS18B20与单片机的接口电路非常简单,DS18B20只有三个引脚,一个接地,一个接电源,一个数字输入输出引脚接单片机I/O口。

测量温度范围在-55℃到+128℃之间,数字温度计的分辨率用户可以从9位到12位选择,内部有温度上、下限告警设置。

总线上传输的所有数据和命令都是以字节的低位在前。

DS18B20在使用时,一般都采用单片机来实现数据采集。

温度传感器的单总线与单片机的P3.7连接,单片机与温度传感器的连接图如图2所示:图2 单片机与温度传感器的连接图3.2报警温度调整按键本系统设计三个按键,采用查询方式,一个用于选择切换设置报警温度和当前温度,另外两个分别用于设置报警温度的加和减。

按键电路图如图3所示:图3 按键电路图3.3单片机与报警控制电路系统中的报警电路是由三极管,蜂鸣器,发光二极管和限流电阻组成,并与单片机的P1.5~P1.7端口连接。

控制电路由滑动变阻器,电热丝(电灯泡)和电风扇(电动机)组成,与单片机的P1.3~P1.4端口连接。

报警控制电路图如图4所示:图4 报警控制电路图3.4显示电路显示电路采用4位共阴极LED数码管,P2端口是一个内部带上拉电阻的8位双向I/O,作为段码输出。

P3口的低四位作为数码管的位选端。

采用动态扫描的方式显示。

数码管显示电路图如图5所示:图5 数码管显示电路图4系统软件设计系统程序主要包括主程序,显示数据程序,读出温度程序,按键扫描程序等。

4.1主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,其程序流程见图6所示:图6 主程序流程图4.2显示数据程序显示数据刷新程序主要是对分离后的温度显示数据进行刷新操作,当标志位为1时将符号显示位移入第一位。

程序流程图如图7所示:图7 显示数据程序流程图4.3读出温度程序读出温度程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。

其程序流程图如图8所示:图8 程序流程图4.4按键扫描程序按键采用扫描查询方式,设置标志位,当标志位为1时,显示设置温度,否则显示当前温度。

按键扫描程序流程图图如图9所示:图9 按键扫描程序流程图5系统仿真及实际调试进入Proteus界面后,连接好电路,并将程序下载进去。

将DS18B20精度的改为0.1,数码管显示温度与传感器的温度相同,温度显示仿真图如图10所示:图10 温度显示仿真图当按下SET键一次时,进入温度报警上线调节,此时显示软件设置温度报警上线,按ADD或DEC时,分别对报警温度进行加1或减1;当再次按下SET键时,进入温度报警下线调节,此时显示软件设置温度报警下线,按ADD或DEC 时,分别对报警温度进行加1或减1;当第三次按下SET键时,退出温度报警线设置,显示当前温度。

温度调试仿真图如图11所示:图11 温度调试仿真当温度超过设定的上限温度时,报警器开始报警且指示灯(红灯)开始闪烁,同时,电动机带动电风扇转使温度降低;当温度超过设定的下限温度时,报警器开始报警且指示灯(绿灯)开始闪烁,同时,电热丝发热使温度升高;报警控制显示仿真图如图12所示:图12 报警控制显示仿真图6总结通过这次温度控制器的设计与仿真,让我更多的了解了设计电路的程序,以及温度控制器的工作原理与设计理念,同时在设计过程中也暴露出许多问题,刚开始设计时,没有过多的查询相关资料,只是盲目的开始设计,以致设计工作停止不前,对编程不是很熟练,使得花了大量的时间用于软件编程。

把程序调试完好后,一切工作也都能迎刃而解了。

从这次的课程设计中,我意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习使用单机片机更是如此,程序只有在经常的读写过程中才能提高,也能提高查询资料、分析问题、进而解决问题的能力。

参考文献[1]王思明,张鑫等.单片机原理及应用系统设计[M].北京:科学出版社,2012.[2]陶红艳,余成波.传感器与现代检测技术[M].北京:清华大学出版社,2009.[3]康华光.电子技术基础—数字部分[M].北京:高等教育出版社,2008.[4]朱清惠等.Proteus教程:电子线路设计制版与仿真[M].北京:清华大学出版社,2009.[5]谭浩强.C程序设计[M].北京:清华大学出版社,2008.附录源程序#include<reg51.h>//**********51单片机头文件#include<intrins.h>//***********_nop_();延时函数用#define dm P2//****************段码输出口#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//******************温度输入口sbit w0=P3^3;//******************数码管4sbit w1=P3^2;//******************数码管3sbit w2=P3^1;//******************数码管2sbit w3=P3^0;//******************数码管1sbit beep=P1^5;//*****************蜂鸣器sbit set=P3^4;//******************温度设置切换键sbit add=P3^5;//******************温度加sbit dec=P3^6;//******************温度减sbit a=P1^6;//******************红灯sbit b=P1^7;//******************绿灯sbit c=P1^3;//******************电机sbit d=P1^4;//******************电灯泡int temp1=0;//**********显示当前温度和设置温度的标志位为0时显示当前温度uint h;uint temp;uchar r;uchar high=30,low=20;//******************设置初始上下限报警温度值uchar sign;uchar q=0;uchar tt=0;uchar scale;//**************温度小数部分用查表法***********//uchar codeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x 08,0x09,0x09};//******************小数断码表uchar codetable_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//************共阴LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9""不亮""-" uchar table_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//**个位带小数点的断码表*********uchar data temp_data[2]={0x00,0x00};//******************读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//******显示单元数据,共4个数据和一个运算暂用/*****************11us延时函数*************************/void delay(uint t){for(;t>0;t--);}void scan(){int j;for(j=0;j<4;j++){if(j==0){dm=table_dm[display[0]];w0=0;delay(50);w0=1;}//*******小数else if(j==1){dm=table_dm1[display[1]];w1=0;delay(50);w1=1;}//***个位else if(j==2){dm=table_dm[display[2]];w2=0;delay(50);w2=1;}//****十位else if(j==3){dm=table_dm[display[3]];w3=0;delay(50);w3=1;}//****百位}}void ow_reset(void)//***************DS18B20复位函数{char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//******************从高拉倒低DQ=0;delay(50);//****************************550usDQ=1;delay(6);//**********************66uspresence=DQ;//****************presence=0复位成功,继续下一步}delay(45);//********************延时500uspresence=~DQ;}DQ=1;//**********************拉高电平}/****************DS18B20写命令函数************************/ //***************向1-WIRE总线上写1个字节void write_byte(uchar val){uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();//****************从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_();//******5usDQ=val&0x01;//********************最低位移出delay(6);//******************66usval=val/2;//******************向右移1位}DQ=1;delay(1);}uchar read_byte(void)//****************DS18B20读1字节函数{uchar i;uchar value=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();//******************4usDQ=1;_nop_();_nop_();_nop_();_nop_();//******************4usif(DQ)value|=0x80;delay(6);//66us}DQ=1;return(value);}read_temp()//*****************读出温度函数{ow_reset();//******************总线复位delay(200);write_byte(0xcc);//******************发命令write_byte(0x44);//*****************发转换命令ow_reset();delay(1);write_byte(0xcc);//******************发命令write_byte(0xbe);temp_data[0]=read_byte();//******************读温度值的低字节temp_data[1]=read_byte();//******************读温度值的高字节temp=temp_data[1];temp<<=8;temp=temp|temp_data[0];//******************两字节合成一个整型变量。

相关主题