温度控制系统的单片机课程设计.docx
《温度控制系统的单片机课程设计.docx》由会员分享,可在线阅读,更多相关《温度控制系统的单片机课程设计.docx(23页珍藏版)》请在冰点文库上搜索。
温度控制系统的单片机课程设计
单片机课程设计报告
设计题目:
水温控制系统
班级:
自动化081
学号:
200808425
姓名:
刘帅军
指导教师:
董唯光
评语:
成绩
2011年7月8日
1.问题分析及解决方案
1.1题目要求
要求设计一个水温控制系统,能正常控制和测量温度范围,控温通道输出为继电器。
测温和控温范围:
室温~80℃(实时控制);
控温精度:
正负1℃。
1.2题目分析
本系统为水温控制系统,采用单片机作为控制器控制继电器的导通与关断,利用温度传感器实时监测水的温度,通过数码管显示实际温度与设定的目标温度,然后利用加热和冷却装置进行加减温度,使水的温度维持在一定的范围之内。
通过调节目标温度按钮,可以任意调节水的温度范围。
1.3解决方案
根据题目要求,采用5V电源给单片机供电。
供电电源可以利用220/9V变压器先将220V的电压将为9V,然后利用7805稳压芯片,得到5V供电电源。
在控制环节,利用5551型三极管充当开关,通过单片机控制三极管的导通与关断,从而进一步控制继电器的开关,更进一步控制加热、冷却装置的工作状态。
在整个控制系统中,通过温度传感器(DS18B20),对被控对象进行温度与数字转换,由温度传感器输出的温度信号经过I/O口,由单片机读出数值,并在数码管上显示,通过按键可以升高或者降低所需的温度。
实际温度再经过与目标温度进行比较,若所测温度大于目标温度,则输出低的门限电压,即D1灯不亮,不执行加热环节,同时指示灯D4亮,开始执行制冷环节;反之,若所测电压小于目标电压,则输出高的门限电压,即D1灯亮,执行加热环节这样就可以把温度控制在一定的范围之内。
2.单片机选型及硬件配置
2.1单片机及扩展模块选择
2.1.1单片机及输入输出模块选型
在该题目当中,单片机选用STC89C52,温度检测模块采用DS18B20作为温度传感器对水温进行实时检测,温度显示模块选用两个四位一体共阳极数码管,分别显示实际温度和目标温度。
2.1.2电源模块的选择
由于单片机输出的是TTL电平信号,因此对单片机单独提供5V电源。
该电源可以由220V交流电源经整流、降压和稳压后获得。
对继电器线圈端子提供经5V放大后的8V电源供电,触头端子直接接入220V电源。
2.2I/O地址分配
将单片机P0口作为实际水温的段选端,P2口作为目标水温的段选端。
P1作为位选端,其中P1.0—P1.3作为实际水温位选,P1.4—P1.7作为目标水温位选。
P3口主要作为信号指示以及读取温度传感器的温度数据使用。
单片机引脚分配图如图2-1所示:
图2-1单片机引脚图
2.3系统硬件原理图
2.3.1系统原理框图
该系统的原理框图如图2-2所示:
图2-2系统原理框图
2.3.2晶振及复位电路
该系统中单片机外部晶振选为11.0592MHZ,通过两个电容与XTAL1和XTAL2引脚连接构成单片机的外部时钟电路如图2-3所示。
图2-3单片机外部时钟电路
复位操作有上电自动复位和按键手动复位两种方式。
该系统复位电路由RC微分电路产生的脉冲来实现,电路如图2-4所示,按下开关即可产生复位信号,通过导线引入单片机RST引脚即可发生复位。
图2-4单片机复位电路
2.3.3数码管驱动电路
该系统选择四位一体的共阳极数码管作为温度显示元件。
通过测试,我们发现单片机上电后输出电流不能达到要求,导致数码管显示亮度不够,因此在本电路中对位选端加了三极管驱动电路。
如图2-5所示:
图2-5数码管驱动电路
2.3.4温度显示模块
由P0口控制实际水温的段选,P2口控制目标水温的段选。
P1口作为位选端,其中P1.0—P1.3作为实际水温位选,P1.4—P1.7作为目标水温位选。
显示模块如图2-6所示。
图2-6温度显示模块
2.3.5温度控制系统整体仿真图
同时还利用Protues对该系统进行了仿真,仿真图如图2-7所示:
图2-7Protues仿真图
2.3.6DS18B20温度传感器
1.DS18B20的主要特性
1、适应电压范围更宽,电压范围为3.0~5.5V,在寄生电源方式下可由数据线供电
2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
3、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
4、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
5、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
6、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
7、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
2.指令约定代码操作说明
DS18B20的初始化
(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽可能的短一点)
(3)数据线拉到低电平“0”。
(4)延时750微秒(该时间的时间范围可以从480到960微秒)。
(5)数据线拉到高电平“1”。
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
/******************DS18B20初始化****************/
Init_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(14);
x=DQ;//稍做延时后如果x=0则初始化成功
delay(20);
}
DS18B20的写操作
(1)数据线先置低电平“0”。
(2)延时确定的时间为15微秒。
(3)按从低位到高位的顺序发送字节(一次只发送一位)。
(4)延时时间为45微秒。
(5)将数据线拉到高电平。
(6)重复上
(1)到(6)的操作直到所有的字节全部发送完为止。
(7)最后将数据线拉高。
/**************向DS18B20写命令***************/
WriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
//delay(4);
}
DS18B20的读操作
(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时15微秒。
(5)将数据线拉高“1”。
(6)延时15微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时30微秒。
DS18B20温度值格式表,如表2-1所示。
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FE6FH,-55℃的数字输出为FC90H。
表2-1DS18B20温度值格式表
//DS18B20程序读取温度
ReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低八位
b=ReadOneChar();//高八位
t=b;
t<<=8;
t=t|a;//合并高八位和低八位
return(t);
}
此函数得到的值为温度值,最小分度为0.0625,其中低四位为小数部分,(即:
把一度分为16等分)。
中间七位为其整数部分,高五位为符号位,若高五位为0,则说明得到的温度为正数。
若高五位为1,则说明得到的温度为负数。
3.软件实现
3.1控制流程图
程序控制流程图如图3-1所示:
Y
N
Y
Y
N
N
开始
单片机I/O口初始化
DS18B20初始化
数码管显示初始化
读取水的实际温度
实际温度是否低于目标温度?
控制继电器导通,进行加热
实际温度是否高于设定的最大温度?
启动报警装置,同时控制继电器关断进行降温
控制继电器关断,进行降温
实际温度是否低于设定的最小温度?
启动报警装置,同时控制继电器导通进行加热
结束
结束
图3-1程序流程图
3.2软件代码
在整个软件设计过程中采用C语言编程,所用的编程环境是Keil2。
该程序源代码如下:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitP10=P1^0;
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;//数码管1断码控制
sbitP14=P1^4;
sbitP15=P1^5;
sbitP16=P1^6;
sbitP17=P1^7;//数码管2段码控制
sbitP32=P3^2;//电源指示灯
sbitP34=P3^4;
sbitP30=P3^0;//蜂鸣器
sbitP31=P3^1;//继电器控制位
sbitup=P3^7;
sbitdown=P3^6;//按键操作端口
sbitP35=P3^5;//加热指示灯端口
sbitDQ=P3^3;//温度传感器端口
/**************温度小数部分表***********/
ucharcodeditab[16]=
{0x00,0x01,0x01,0x02,
0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,
0x08,0x08,0x09,0x09};
/*******共阳极数码管显示表********/
unsignedcharcodeduan1[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0XD8,
0x80,0x90,0x88,};
/******共阳极数码管(带小数点)显示表******/
unsignedcharcodeduan2[]={0x40,0x79,0x24,0x30,
0x19,0x12,0x02,0x78,
0x00,0x10,};
voiddelay_1(uintz);
intb=0,k,wendu_1,mubiao=200;
charpwm=0,r=0,q=0;
uintt=0;
/**********延时函数***********/
voiddelay(unsignedinti)
{
while(i--);
}
/**********DS18B20初始化**********/
Init_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(20);
}
/********从DS18B20读入数据********/
ReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/*********向DS18B20写命令*********/
WriteOneChar(unsignedchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
/*******DS18B20程序读取温度**********/
ReadTemperature(void)
{
uchara=0;
ucharb=0;
uintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等,前两个就是温度
a=ReadOneChar();//低八位
b=ReadOneChar();//高八位
t=b;
t<<=8;
t=t|a;//合并高八位和低八位
return(t);
}
/**********当前温度显示************/
xianshi()
{
intx;
intzhenshu;
intxiaoshu;
intnum=5;
wendu_1=ReadTemperature();
x=wendu_1;
zhenshu=x/16;//整数部分
xiaoshu=x&0x0f;//小数部分
wendu_1=zhenshu*10+ditab[xiaoshu];
P10=1;
P0=duan1[zhenshu/10];//百位
delay_1(num);
P10=0;
P11=1;
P0=duan2[zhenshu%10];//十位
delay_1(num);
P11=0;
P12=1;
P0=duan1[ditab[xiaoshu]];//个位
delay_1(num);
P12=0;
P13=1;
P0=0xc6;//显示C
delay_1(num);
P13=0;
/**********目标温度显示***********/
P14=1;
P2=duan1[mubiao/100];//百位
delay_1(num);
P14=0;
P15=1;
P2=duan2[mubiao/10%10];//十位
delay_1(num);
P15=0;
P16=1;
P2=duan1[mubiao%10];
delay_1(num);
P16=0;
P17=1;
P2=0xc6;
delay_1(num);
P17=0;
}
main(void)
{
P10=0;
P11=0;
P12=0;
P13=0;
P14=0;
P15=0;
P16=0;
P17=0;//关闭位选段
P35=0;//加热指示灯
P32=0;//单片机上电指示灯
P30=0;//蜂鸣器驱动口
P31=0;//P31低电平时驱动继电器
P34=0;
/*********进入循环********/
while
(1)
{
xianshi();//显示系统数据
if(down==0)
{
mubiao--;
delay_1(20);
}
if(up==0)
{
mubiao++;
delay_1(20);
}
if(mubiao>400||mubiao<200)
P30=1;//目标设置错误时报警
else
P30=0;//目标设置正常,则蜂鸣器不响
/*********************************************/
P35=0;
pwm=mubiao-wendu_1;
if(pwm>0)
{
P35=1;
P31=1;
P34=0;
}//实际温度高于目标温度,红色指示灯发光,加热器加热
else
{
P35=0;
P31=0;
P34=1;
}//实际温度低于目标温度,指示灯不发光,不加热
}
}
voiddelay_1(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
3.3程序调试
在整个系统调试过程中,由于时间仓促没有来得及做实物。
最终通过Protues仿真软件进行仿真,得到的结果和预想的结果一致。
调试步骤如下:
1.先在Protues仿真软件中搭建硬件电路;
2.根据设计思想和硬件电路在Keil2中编写程序代码,调试通过并生成.hex文件;
3.双击Protues仿真电路中的单片机,将.hex文件下载到单片机中,然后运行观察结果。
3.4设计结果
在该电路中,D1代表加热指示灯,D2代表电源指示灯,D4代表冷却指示灯,D5代表报警指示灯,利用灯泡L1代表加热器,电动机代表冷却装置。
整个设计结果分为三个部分,分别是实际温度高于设定的目标温度、实际温度低于目标温度、目标温度高于或低于设定的温度范围。
1.当水的实际温度低于目标温度时,指示灯D1亮,加热器开始加热,同时将单片机P3.4口置0,使三极管断开,关闭D4及冷却装置。
仿真结果如图3-2所示。
图3-2实际温度高于目标温度时的工作状态
2.当水的实际温度高于目标温度时,指示灯D1不亮,加热器停止加热,同时将单片机P3.4口置1,使三极管导通,点亮D4指示灯,电动机开始旋转,对水进行降温处理。
仿真结果如图3-3所示:
图3-3实际温度低于目标温度时的工作状态
3.当设定的目标温度超过或者低于设定的温度范围时(20~40℃),启动报警装置,同时报警指示灯D5发光,并且启动制冷装置。
仿真结果如图3-4所示:
图3-4目标温度低于设定的温度范围时的工作状态
3.5结果分析
能够从温度传感器中获得温度数据,并且能通过按键纠正目标温度,程序能正常执行,电阻丝也能按目标温度的高低调整自身的工作状态。
效果还行,不过其一精度不高,存在严重的滞后,其二程序执行得慢,其三是采用继电器的通断控制加热器,动作频率太低。
针对上述问题,可以在控制算法中采用PID控制,以致达到更高的精度,将继电器用IGBT等代替,具有更高的通断频率。
4.结论与体会
4.1结论
在本次课程设计过程中,主要工作可以分为以下几个方面:
1.Protues和Keil2软件的使用方法;
2.硬件电路的设计;
3.软件程序代码的编写和调试,温度精度的控制。
4.2心得体会
此次课程设计考查了我们设计电路的能力和动手能力。
从中我学到了很多东西。
设计上的电路在实际中运用可能不是像仿真那样理想,由于元件的误差及元件的大小在实际中没有很好的匹配,所以按照设计的电路焊出来的实物在调试过程中遇到了一些问题,但我都一步一步地解决了。
通过这次课程设计,我学会了如何使用仿真软件Protues以及Keil2编程软件,进一步巩固了以前学过的单片机以及数、模电知识。
最重要的是通过这次课程设计我深深体会到能把所学的知识运用到实践中才是真正掌握。
这次的课程设计时间有些仓促,并且相关的知识掌握得不到位,但随着设计的深入,发现所学的知识在我设计的电路中得到了很好的运用,在课程设计的同时,巩固和掌握了现学的知识,这才是设计的目的。
特别是在电路调试成功的那一刻,出现了我所预料的现象,着实让我高兴了一番,自己所设计的东西没有白费,并且从中获得了知识,是一件很开心的事。
这只是一次简单的课程设计,只是一个开始,设计的东西在实际中的运用还尚欠缺,但从中我学到了遇到困难要解决,不能浮躁,要静心,耐心,细心的做事,坚持下去,总能看到成功的曙光。
参考书目
[1]李华王思明张金敏.单片机原理及应用.兰州:
兰州大学出版社,2001.
[2]封志宏杜丽霞崔用明.模拟电子技术.兰州:
兰州大学出版社,2003.
[3]顾桂梅王永顺王庆贤.电气控制与PLC应用项目教程.北京:
机械工业出版社,2011.
[4]李华范多旺魏文军侯涛.计算机控制系统.北京:
机械工业出版社,2010.