基于单片机的温度测量控制系统设计27页docWord文件下载.docx
《基于单片机的温度测量控制系统设计27页docWord文件下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度测量控制系统设计27页docWord文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
本系统除了显示温度以外还可以通过键盘预设一个温度值,对所测温度进行监控,当温度高于设定温度时,启动蜂鸣器报警;
当所测温度低于设定温度时,启动继电器2S;
当所测温度等于设定温度时LED等闪烁。
2.2软件设计方案
从软件的功能不同可分为两大类:
一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。
二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。
每一个执行软件是一个小的功能执行模块。
这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。
各执行模块规划好后,就可以规划监控程序了。
首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。
主程序是系统的监控程序,在程序运行的过程中必须先经过初始化。
本设计的主程序中将传感器获取的温度与预设温度进行了比较,并对各种不同的状态变化的控制做出了设定。
流程图如图2.2所示。
系统在初始化完成后就进入温度测量程序,实时的测量当前的温度并通过显示电路在LCD上显示。
根据硬件设计完成对温度的控制。
按下4*3键盘上的OK键可以便可以输入预设温度。
图2.2
3硬件设计
3.1主控制部分AT89S51的设计方案:
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
其主要特性如下:
(1)18位微处理器和控制器,中央处理器是整个单片机的核心部件,能同时处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
(2)内含一个布尔运算器,可直接对数据的位进行操作和运算,特别适用于逻辑控制。
(3)内含4KB可重擦写的可编程闪烁程序存贮器(EEPROM)。
(4)内含128*8位的数据存贮器(RAM)。
(5)4个8位(32根)双向且可独立寻址的I/O(输入输出)接口P0~P3。
(6)2个16位的计数器/定时器。
(7)片内振荡器和时钟电路。
(8)全双工方式的串行接口(DART)。
(9)两级中断优先权的6个中断源/5个中断矢量的中断逻辑。
(10)指令集有111条指令,其中64条为单周期指令,支持6种寻址方式。
(11)最高时钟振荡频率可达12MHz,大部分指令执行时间为1us,乘、除指令为4us。
(12)与MCS-51兼容,寿命为1000次写/擦循环,数据保留时间为10年。
(13)低功耗的闲置和掉电模式,可编程串行通道,三级程序存储器锁定。
引脚及功能AT89C51单片机为40脚双列直插式封装结构。
其引脚排列顺序及引脚符号如图3.1所示:
图3.1AT89C51管脚图
AT89C51重要管脚说明:
Vcc:
电源电压
GND:
地
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口,作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端口。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号校验期间,P1接收低8位地址。
表3.1.1为P1口第二功能。
P1口第二功能
表3.1.1
端口引脚
第二功能
P1.5
MOSI(用于ISP编程)
P1.6
MISO(用于ISP编程)
P1.7
SCK(用于ISP编程)
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流I。
在访问8位地址的外部数据存储器时,P2口线上的内(也即特殊功能寄存器,在整个访问期间不改变)。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
作输入端口时,被外部拉低的P3口将用
P3口的第二功能表
表3.1.2
端口功能
RXD(P3.0)
串行输入口
T0(P3.4)
定时/计数器0外部输入
TXD(P3.1)
串行输出口
T1(P3.5)
定时/计数器1外部输入
INT0(P3.2)
外中断0
WR(P3.6)
外部数据存储器写选通
INT1(P3.3)
外中断1
RD(P3.7)
外部数据存储器读选通
上拉电阻输出电流I。
P3口除了作为一般的I/O口线外,更重要的用途是它的第
二功能,P3口的第二功能如表3.1.2。
3.2温度采集模块
由于DS18B20芯片将温度传感器、信号放大调理、A/D转换、接口全部集成于一芯片,与单片机连接简单、方便且化学性很稳定。
它能用做工业测温元件,且此元件线形较好。
在0—100摄氏度时,最大线形偏差小于1摄氏度。
该芯片直接向单片机传输数字信号,便于单片机处理及控制。
与AD590相比是更新一代的温度传感器,所以温度传感器采用DS18B20。
DS18B20是DALLAS公司生产的一线式数字温度传感器,它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于温度测控系统,可直接将温度转化成串行数字信号(按9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片,温度测量范围-55~+125℃,可编程为9~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到三根或者两根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
从而可以看出DS18B20可以非常方便的被用于远距离多点温度检测系统。
DS18B20内部结构主要由四部分组成:
64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。
在硬件上,DS18B20与单片机的连接有两种方法,一种是Vcc接外部电源,GND接地,I/O与单片机的I/O线相连;
另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。
无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻。
3.3显示模块
本设计显示电路采用LM016L来显示测量得到的温度值。
LM016L液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。
IR用于寄存指令码,只能写入不能读出。
DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据。
BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码。
CGROM由8位字符码生成5*7点阵字符160种和5*10点阵字符32种。
CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM。
LM016L液晶模块的引脚功能如表3.2所示:
LM016L引脚功能表
表3.3
引脚
符号
功能说明
1
VSS
一般接地
2
VDD
接电源(+5V)
3
VEE
液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高
4
RS
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5
R/W
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6
E
E(或EN)端为使能(enable)端,下降沿使能。
7
DB0
低4位三态、双向数据总线0位(最低位)
8
DB1
低4位三态、双向数据总线1位
9
DB2
低4位三态、双向数据总线2位
10
DB3
低4位三态、双向数据总线3位
11
DB4
高4位三态、双向数据总线4位
12
DB5
高4位三态、双向数据总线5位
13
DB6
高4位三态、双向数据总线6位
14
DB7
高4位三态、双向数据总线7位(最高位)
4、软件设计
4.1温度采集
CPU对DS18B20的访问流程是:
先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作。
DS18B20每一步操作都要遵循严格的工作时序和通信协议。
如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:
每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
流程图如图4.1所示
图4.1
4.2键盘输入
3*4的键盘与单片机I/O口相连。
采用列扫描的方式扫描键盘,按下键盘,则该按键出行列接通,I/O口输入为低电平,则此时便可将所按键的值输入单片机,经数据处理后便可输出显示在LCD上。
因为键盘的制造工艺不同,在按下键盘过程中,若手一晃,结果按键就会抬起极小的一段时间,此时单片机检测到的就是有一个抬手后又按了一个键子,这是我们所不希望的,所以在键盘输入时加个按键延时以消除抖动。
即按键后,过一段时发现还是按键的就认为一直是按键的,此时单片机可以写程序此为一次按键。
所以要加除抖是用来防止失误或手抖造成的错误按键。
图4.2
4.3LCD显示
LM016L的寄存器选择控制表如表4.3所示
LM016L选择控制表
表4.3
操作说明
写入指令寄存器(清除屏等)
都busyflag(DB7),以及读取位址计数器(DB0~DB6)值
写入数据寄存器(显示各字型等)
从数据寄存器读取数据
注:
关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0。
LM016L显示的流程图如图4.3所示
图4.3
5总结
本次课程设计完成了基于单片机AT89C51的温度测量与控制系统的设计方案与软硬件实现。
系统包括数据采集模块,单片机控制模块,显示模块和温度设置模块,报警模块和LED显示模块六个部分。
文中对每个部分功能、实现过程作了详细介绍。
完成了课题既定的任务,基本达到了预期的目标。
能够进行两位数温度的测定与控制。
该系统在输入了预设温度后将预设温度与测定温度进行比较,当测定温度高于预设温度是蜂鸣器启动一段时间进行报警;
当测定温度等于预设温度时LED灯闪烁提醒;
当测定温度低于传感器温度是继电器启动2S。
其仿真图如下图所示:
系统具有如下特点:
⑴.采用智能温度传感器DS18B20采集温度数据,简化了硬件电路设计,温度采集数据更加精准;
⑵.AT89C51单片机的采用,有利于功能扩展;
⑶.电路设计充分考虑了系统可靠性和安全性。
本次课设软件和硬件相结合,有相当大的难度,同时也有很大的实用性。
在做课程设计的过程中,我的理论和实践水平都有了较大的提高。
并且我熟练掌握了单片机硬件设计和接口技术,同时对温度传感器的原理及应用有了一定的了解,掌握了各种控制电路及其相关元器件的使用。
图5.1测定温度高于预设温度
图5.2测定温度等于预设温度
图5.3测定温度低于预设温度
通过此次对温度测量与控制系统的设计,我们学会了怎样把所学的书本知识应用于实践中去,并学会了如何去思考整个控制系统的软硬件设计。
实践过程中我们遇到了一些困难,但在解决问题的过程中,我们学会了团队合作精神和怎样发现问题、分析问题,进而解决问题。
此次课程设计不仅增强了我们学习专业课的兴趣,而且给了我们勇气和信心,更重要的是它为我们以后的学习指明了方向。
6参考文献
[1]雄壮.陈策.程序设计技术(第三版)[M].重庆:
重庆大学出版社.2008.02
[2]张毅刚.单片机原理与应用设计[M].北京:
电子工业出版社,2008年
[3]参考网页资料
[4]参考网页资料
[5]参考网页资料
[6]参考网页资料
[7]参考网页资料
[8]胡寿松.自动控制原理.北京:
国防工业出版社,2000
5王锦标.方崇智.过程计算机控制.北京:
清华大学出版社.1997
附录1设计原理图
附录2设计程序
#include<
reg51.h>
#include<
string.h>
#defineucharunsignedchar
#defineuintunsignedint
#definekey_portP1
sbitbuzzer=P0^4;
sbitled=P0^1;
sbitrelay=P0^0;
sbitdq=P0^5;
sbitrs=P3^2;
sbitrw=P3^1;
sbite=P3^0;
uchartable[]={0,0,0,0};
//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchartable1[]="
Ceding_T:
"
;
uchartable2[]="
Yuse_T:
ucharm,flag,shandeng,k;
ucharj,temp1,temp2,i;
ucharReadOneChar(void);
ucharreadtemperature(void);
uintmi(uchara);
charbiao[3];
voidwrite_com(ucharcom);
voidwrite_dat(uchardat);
//延时程序
voiddelay(uinti)
{
while(i--);
}
voiddelay_50us(uinti)
ucharj;
for(;
i>
0;
i--)
for(j=19;
j>
j--);
}
voiddelay_50ms(uinti)
uintj;
for(j=6245;
//LCD程序
voidinit_lcd(void)//lcd初始化
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
voidwrite_com(ucharcom)//写指令
e=0;
rs=0;
rw=0;
P2=com;
delay_50us(10);
e=1;
delay_50us(20);
voidwrite_dat(uchardat)//写数据
rs=1;
P2=dat;
//键盘扫描程序
//ds18b20程序
voidinit_ds18b20(void)//ds18b20初始化
ucharn;
dq=1;
delay(8);
dq=0;
delay(80);
n=dq;
delay(100);
voidWriteOneChar(uchardat)
uchari;
for(i=0;
i<
8;
i++)
{
dq=0;
dq=dat&
0x01;
delay(4);
dq=1;
dat>
>
=1;
}
delay(4);
ucharReadOneChar(void)
uchari,value;
value>
if(dq)
value|=0x80;
returnvalue;
ucharreadtemperature(void)//读温度函数
uchara,b;
init_ds18b20();
WriteOneChar(0xcc);
//跳过ROM
WriteOneChar(0x44);
//启动温度测量
delay(300);
WriteOneChar(0xbe);
//读温度
a=ReadOneChar();
b=ReadOneChar();
b<
<
=4;
b+=(a&
0xf0)>
4;
returnb;
voidjianpan(void)
{
unsignedchartemp,a,sign;
key_port=0xff;
//写1初始化
key_port=0xf0;
//写判断按下初值
temp=key_port;
//读状态
a=0;
if((temp&
0xF0)!
=0xF0)//只要有键按下,temp!
=0xf0
delay_50us(50);
//延时去抖动
=0xF0)
{
key_port=0xfe;
temp=key_port;
switch(temp)
{
case(0xee):
a=1;
break;
case(0xde):
a=2;
case(0xbe):
a=3;
case(0x7e):
a=4;
}
key_port=0xfd;
temp=key_port;
case(0xed):
a=5;
case(0xdd):
a=6;
case(0xbd):
a=7;
case(0x7d):
a=8;
bre