资源描述
单片机课程设计之温度控制及报警系统的设计
37
2020年4月19日
文档仅供参考
题 目单片机温度控制及报警系统的设计
一、 设计目的
学习温度的显示、控制及报警,实现了温度的实时显示及控制。温度控制部分,提出了用DS18B20、89C52单片机及LED的硬件电路完成对温度的实时检测及显示,利用DS18B20与单片机连接由软件与硬件电路配合来实现实时控制及超出设定的上下限温度的报警系统。
课题设计的目的:
1.掌握用51单片机控制LCD显示字符的方法。
2.掌握用单片机进行显示系统开发的方法。
3.掌握单片机软件、硬件调试技术。
4.了解单线器件DS18B20的驱动方法。
5.了解LCD显示器的一般驱动原理
二、使用主要电子元件
1.单片机89C52
2. 温度传感器DS18B20
3. 显示器LCD1602
4. 排插
5.发光二极管
6.电容若干
7.电阻若干
8.按钮开关若干。
9.导线若干
10. 12MHZ晶振1个
三.系统设计思想及主要应用器件
3.1 系统设计的总体思想
根据单片机温度控制要实现的功能,设计了基于ATMEL公司的AT89C52芯片的温度测量系统。这是一种低成本的利用单片机多余I/O口实现的温度检测电路。整个系统硬件部分包括温度检测系统、信号放大系统、A/D转换、单片机、I/O设备、控制执行系统等.。温度控制部分用DS18B20、89C52单片机及LED的硬件电路完成对温度的实时检测及显示。
3.2 系统硬件简介
硬件大致构成:核心控制器件AT89C52 ,温度传感器DS18B20,显示器1602A
报警控制LED。
3.2.1 硬件设计思想
本设计是以AT89C52为单片机作为控制核心,提出了一种基于DS18B20的单总线多点温度测控系统,多个温度传感节点经过单总线与单片机相联形成分布式系统。单片机经过实时监控温度的变化,经过LCD1602字符型液晶显示各节点温度的数值,当温度值超出所设定的值时,报警器开始报警,从而远程实现对整个温度系统的管理和控制。这种分布式温度测量系统具有成本低廉、传感精度高、系统稳定、易于管理等优点。
3.3 系统主要器件
3.3.1 核心控制器件AT89C52
AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可重复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52能够按照常规方法进行编程,也能够在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可重复擦写的Flash存储器可有效地降低开发成本[1]。
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
主要功能特性:
· 兼容MCS51指令系统
· 32个双向I/O口
· 3个16位可编程定时/计数器中断
· 2个串行中断
· 2个外部中断源
· 2个读写中断口线
· 低功耗空闲和掉电模式
AT89C52各引脚及管脚如图3-1所示
图3-1 AT89C52各引脚
概述:AT89C52为40 脚双列直插封装的8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
3.3.2 DS1820内部结构及工作原理
DS18B20数字温度传感器是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,能够挂很多这样的数字温度计,十分方便。
1.DS18B20产品的特点:
l 只要求一个端口即可实现通信。
l 在DS18B20中的每个器件上都有独一无二的序列号。
l 实际应用中不需要外部任何元器件即可实现测温。
l 测量温度范围在-55.C到+125.C之间。
l 数字温度计的分辨率用户能够从9位到12位选择。
l 内部有温度上、下限告警设置。
TO-92封装的DS18B20的引脚排列见图3-3所示。
图3-3 DS18B20的引脚排列
DS18B20引脚功能描述见表3-4所示。
表3-4 DS18B20引脚功能
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数字输入输出引脚,开漏单总线接口引脚,当使用寄生电源时,可向电源提供电源
3
VDD
可选择的VDD引脚,当工作于寄生电源时,该引脚必须接地
2. DS18B20的内部结构
DS18B20的内部框图下图3-5所示。64位ROM存储器件独一无二的序列号。暂存器包含两字节(0和1字节)的温度寄存器,用于存储温度传感器的数字输出。暂存器还提供一字节的上线警报触发(TH)和下线警报触发(TL)寄存器(2和3字节),和一字节的配置寄存器(4字节),使用者能够经过配置寄存器来设置温度转换的精度。暂存器的5、6和7字节器件内部保留使用。第八字节含有循环冗余码(CRC )。
图3-5 DS18B20的内部框图
3.3.3 LCD1602A内部结构及工作原理工作原理
LCD内部结构:由CGRAM(自建字型产生器)、DDRAM(数据显示存储器)、CGROM(内含字型产生器)、指令寄存器、数据寄存器、地址计数器、指令译码器等组成
LCD显示原理:利用旋光效应对光进行偏转,再利用偏振片滤去不需要透过光的相应像素,从而实现图像显示。
LCD驱动原理:分成两大步,即写指令,写数据,其中写数据之前要找到显示的位置。
本实验所采用的液晶型号为LCD1602A 。它位数多,可显示32位,32个数码管体积相当庞大了,显示内容丰富,可显示所有数字和大、小写字母,程序简单,如果用数码管动态显示,会占用很多时间来刷新显示,而LCD1602A自动完成此功能。
1602A采用标准的16脚接口如图3-12所示。
图3-12 1602A的接口图
第1脚:VSS为地电源
第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时能够经过一个10K的电位器调整对比度(建议接地,弄不好有的模块会不显示)
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15~16脚:空脚(有的用来接背光)
1602A液晶模块内部的字符发生存储器(CGROM)已经存储了不同的点阵字符图形,这些字符有,阿拉伯数字、英文字母的大小写、常见的符号、和日文假名等,每一个字符都有一个固定的代码,其中数字与字母同ASCII码兼容。其内部还有自定义字符(CGRAM),可用业存储自已定义的字符。
四.系统软件设计
4.1 软件设计总体思路及主程序流程图
本系统采用C语言编写,主程序主要由四部分构成,系统通电后首先初始化系统,依次完成温度采集、温度处理、数据显示、键盘处理等四项功能。温度采集部分主要完成温度测试点的温度数据采集任务;温度处理部分主要是将采集到的温度数据与用户设定的各点上下限温度值进行比较处理,并判断是否超出设定的上下限值,如果超出则led灯亮报警;数据显示部分主要实现温度数据的显示,显示方式根据设计要求支持温度测试点的轮流循环显示和固定显示两种方式;键盘处理部分主要实现用户对系统参数的设置,结合显示部分,实现用户与系统之间的人机接口。系统软件主流程如图4-1所示。
开始
系统初始化
温度采集
温度处理
数据显示
键盘处理
图4-1 系统软件总流程图
4.2 测温模块
测温流程图4-2所示。
读温度
初始化温度传感器
扫描键盘选定所需芯片
选定所需芯片
进行温度转换
读取温度
调试显示子程序
子程序返回
图4-2 DSl8B20操作流程图
4.2.1 温度的采集
DSl8B20在其ROM中都存有其唯一的48位序列号,在出厂前已写入片内ROM中,主机在进入操作程序前必须逐一接入DSl8B20,用读ROM(33H)命令将该DSl8B20的序列号读出并登录。当主机需要对众多在线DSl8B20的某一个进行操作时首先要发出匹配ROM命令(55H),紧接着主机提供64位序列(包括该DSl8B20的48位序列号)之后的操作就是针对该DSl8B20的,而所谓跳过ROM命令即为之后的操作,是对所有DSl8B20的框图中先有跳过ROM即是启动所有DSl8B20进行温度变换之后经过匹配ROM再逐一地读回每个DSl8B20的温度数据在DSl8B20组成的测温系统中主机在发出跳过ROM命令之后再发出统一的温度转换启动码44H就能够实现所有DSl8B20的统一转换再经过1s后就能够用很少的时间去逐一读取这种方式,使其T值往往小于传统方式[7]。
4.2.2 温度的测量
单总线已经挂接了DS18B20。由于已经在上面获取了DS18B20的ROM代码并在AT89C52单片机内部的中建立了测量位置点和传感器64位ROM代码之间的关系表,因此对温度的巡回测量的步骤如下:
(1)发跳过ROM命令CCH。
(2)发启动所有在线的DS18B20进行温度转换命令44H。
(3)延迟1s。
(4)发匹配ROM命令55H。
(5)按照AT89C51中建立的关系表的顺序取出64位ROM代码发送到单总线。
(6)发读温度值命令BEH,读取温度值。
(7)进行CRC校验和数据处理后送LCD显示器显示。
(8)重复第4步到第7步,直到所有的DS18B20测量处理完。
(9)再重复第1步到第8步,进行下一轮的巡回测量。
温度测量电路流程如图4-3所示。
初始化
跳过ROM
等待1S
初始化
设置18B20
符合ROM
读存储器
缓冲指针增一
初始化
B-1=0?
否
图4-3 温度测量电路流程
4.3 显示模块流程图4-4所示。
忙判断
P0.7=1?
结束
开始
液晶初始化
送显示地址
写指令
送显示字符
Y
忙判断
P0.7=1?
写数据
Y
N
N
图4-4 LCD显示流程图
4.4 键盘扫描流程图
按键处理程序经过扫描按键情况,读取键值。主要完成各点温度传感器上下限报警参数设置和显示模式设置。
(1)经过扫描键盘读取键值,流程图如图4-5所示。
Y
N
键盘扫描
有键闭合
延时去键抖动动
扫描键盘
找到闭合键
计算键值
闭合键释放
建立有效标志
返回
建立无效标志
N
Y
N
Y
图4-5 键盘扫描程序流程图
(2)设置报警上、下限值
DS18B20设有温度上下限报警功能。DSl8B20的存储器由两部分组成:一个是9字节的静态RAM,其中第0和第1字节用于存储16位的温度转换值,第2(高温限TH)和第3字节(低温限TL)作为温度报警限值或通用存储器单元供用户使用;另一个是非易失性的E²PROM。当静态RAM作为温度报警限值使用时,能够在系统安装和工作前,用写RAM命令4EH将高温限TH和低温限TL写入第2和第3字节单元。由于静态RAM掉电后信息即丢失,因此需要再经过拷贝RAM命令48H将第2和第3字节单元的温度报警限值拷贝到E²PROM中。主程序只要在初始化部分使用重调E²PROM命令B8H,就能够将E²PROM中的温度报警限值重新拷贝到静态RAM中。
读取DDRAM或CGRAM中的内容。
五.电路图和程序
1.最终原理图
2.实物图
正面图
背面图
六.本设计总结
1、经过本次实验,我们学习了单片机和温度传感器的工作原理、放大器和数码管的工作原理;学会了电路组合设计的方法,掌握了单片机的中断系统与延时程序的编写方法及程序调试方法,仿真机的使用及在线调试的方法,硬件布线设计及焊接工艺等。
2、这次实验的不足之处:由于本次设计任务准备的时间不够充分,造成准备的很仓促,出现了许多问题;资料查找不完全,因为单片机型号对不上没烧进单片机,浪费时间和精力。
附录1 软件程序
//调用头文件和初始化模块
#include<reg51.h>
#include<intrins.h>
#include <DigThermo.h>
sbit RS =P2^7;
sbit RW =P2^6;
sbit EN =P2^5;
sbit DB0 =P0^0;
sbit DB1 =P0^1;
sbit DB2 =P0^2;
sbit DB3 =P0^3;
sbit DB4 =P0^4;
sbit DB5 =P0^5;
sbit DB6 =P0^6;
sbit DB7 =P0^7;
uchar alarm1 =0x28;
uchar alarm2 =0x19;
sbit LED1 =P1^0;
sbit LED2 =P1^1;
sbit MODE =P2^4;
sbit UP =P2^3;
sbit DOWN =P2^2;
//LCD驱动模块
void Delay100ms();
void InitInterupt();
void DelayL();
void DelayS();
void WriteCommand(unsigned char c);
void WriteData(unsigned char c);
void ShowChar(unsigned char pos,unsigned char c);
void ShowString(unsigned char line,char *ptr);
void InitLcd();
void delay(unsigned int);
void convert();
void RdTemp();
void check();
static char line0[]=" 00:00 ";
static char line1[]=" . ^C ";
/* 延时t毫秒 */
void delay(uint t){
uint i;
while(t--)
{/* 对于11.0592M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
/* 产生复位脉冲初始化DS18B20 */
/*主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
tplsb其中低4位为二进制的“小数”部分;tpmsb其中高 5位为符号位。
真正经过数码管输出时,需要进行到十进 制有符号实数(包括小数部分)的转换。*/
void main(void)
{
char code str1[]=" zhong guo ! ";
char code str2[]=" -11-15 ";
unsigned char i;
DelayL ();
InitLcd ();
DelayL ();
ShowString (0,str1);
ShowString (1,str2);
for (i=0;i<15;i++)
Delay100ms();
InitInterupt();
do
{
line1[0]=0x20;
delay(1); // 延时1ms
convert(); // 启动温度转换,需要750ms
delay(1000); // 延时1s
RdTemp();
line1[0]=0x20;
i=tpmsb;
if(i>99)
{
line1[0]=0x31;
i-=100;
}
line1[1]=i/10+0x30;
line1[2]=i%10+0x30;
line1[4]=tplsb+0x30;
line1[8]=alarm1/10+0x30;
line1[9]=alarm1%10+0x30;
line1[10]='^';
line1[11]='C';
line1[12]=alarm2/10+0x30;
line1[13]=alarm2%10+0x30;
line1[14]='^';
line1[15]='C';
ShowString (0,line1);
Delay100ms();
check();
if(!MODE&&!UP&&DOWN)
alarm1=alarm1-0x01;
else
if(!MODE&&UP&&!DOWN)
alarm1=alarm1+0x01;
else
if(MODE&&!UP&&DOWN)
alarm2=alarm2+0x01;
else
if(MODE&&UP&&!DOWN)
alarm2=alarm2-0x01;
else
{
alarm1=alarm1;
alarm2=alarm2;
}
} // 读取温度}
while(1);
}
void TxReset(void)
{uint i;
DQ = 0;
/* 拉低约900us */
i = 100;
while (i>0) i--;
DQ = 1; // 产生上升沿
i = 4;
while (i>0) i--;}
/* 等待应答脉冲 */
void RxWait(void)
{uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i = 4;
while (i>0) i--;}
/* 读取数据的一位,满足读时隙要求 */
bit RdBit(void)
{uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);}
/* 读取数据的一个字节 */
uchar RdByte(void)
{uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{j = RdBit();
b = (j<<7)|(b>>1);}
return(b);}
/* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp)
{/* 写1 */
DQ = 0;
i++;i++; // 延时,使得15us以内拉高
DQ = 1;
i = 8;
while(i>0) i--; // 整个写1时隙不低于60us
}
else
{
DQ = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之间
DQ = 1;
i++;
i++;
}
}
}
//温度转化模块
void convert(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0x44); // convert T 命令
}
//读取温度值模块
void RdTemp(void)
{TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0xbe); // read scratchpad 命令
tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的"小数"部分)
tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
tpmsb=tpmsb<<4;
tpmsb+=(tplsb&0xF0)>>4;tplsb=(tplsb&0x08)?5:0;}
//LCD驱动子程序模块
void DelayL ()
{unsigned char i,j;
i=0xF0;
j=0xFF;
while (i--)
while (j--); }
void DelayS ()
{ unsigned char i;
i=0x1F;
while (i--);}
void WriteCommand (unsigned char c)
{ DelayS();
P0=c;
EN=0;
RS=0;
RW=0;
_nop_ ();
EN=1;
EN=0;}
void WriteData (unsigned char c)
{ DelayS();
P0=c;
EN=0;
RS=1;
RW=0;
_nop_ ();
EN=1;
EN=0;
RS=0;
}
void ShowChar (unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xB0;
else
p=pos+0x80;
WriteCommand (p);
WriteData(c);
}
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
ShowChar (l++,* (ptr+i));
}
void InitLcd()
{
DelayL ();
P0 = 0;
WriteCommand(0x38);
DelayS ();
WriteCommand(0x38);
DelayS ();
WriteCommand(0x38);
DelayS ();
WriteCommand(0x06);
WriteCommand(0x0C);
WriteCommand(0x01);
WriteCommand(0x80);
}
void InitInterupt()
{
TMOD=0x21;
TL1=0xFD;
TH1=0xFD;
PX0=1;
EA=1;
ES=1;
PCON=0;
TR1=1;
SCON=0x50;
TL0=0x00;
TH0=0x4C;
ET0=1;
EX0=1;
IT0=1;
}
void Delay100ms()
{
unsigned char i,j,k;
for (i=0;i<8;i++)
for (j=0;j<25;j++)
for (k=0;k<250;k++);
}
void check(void)
{
if(tpmsb>=alarm1)
LED1=0;
else
if((tpmsb>=alarm2)&&(tpmsb<=alarm1))
{ LED1=1;
LED2=0;}
else
{LED1=1;
LED2=1; }}
展开阅读全文