基于单片机的温度报警器.docx
《基于单片机的温度报警器.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度报警器.docx(32页珍藏版)》请在冰豆网上搜索。
基于单片机的温度报警器
基于STC89C51的温度报警器设计
一.设计背景
温度是一个十分重要的物理量,对它的测量与控制有十分重要的意义。
随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度。
温度控制电路在工农业生产中有着广泛的应用。
日常生活中也可以见到,如电冰箱的自动制冷,空调器的自动控制等等。
在工业生产中,温度、压力、流量和液位是四种最常见的过程变量。
其中,温度是一个非常重要的过程变量。
例如:
在冶金工业、化工工业、电力工业、机械加工和食品加工等许多领域,都需要对各种加热炉、热处理炉、反应炉和锅炉的温度进行监控。
然而,用常规的监控方法,潜力是有限的,难以满足较高的性能要求。
采用单片机来对它们进行监控不仅具有监控方便、简单和灵活性大的优点,而且可以大幅度提高被测温度的技术指标,从而能够大大提高产品的质量和数量。
因此,单片机对温度的监控问题是一个工业生产中经常会遇到的监控问题。
现代社会是信息化的社会,随着安全化程度的日益提高,而通过温度报警器及时报警,避免不必要的损失。
2.设计功能介绍
此次要设计的是一个温度报警器,DS18B20采集温度数据送到单片机,单片机根据收到的数据判断是否超过报警界限,如果超过做出报警响应,报警界限可调。
12864显示单片机收到的数据。
三.主要器件简介
MCS-51简介
8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。
89C51单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
·中央处理器:
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
.数据存储器(RAM)
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
·程序存储器(ROM):
8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
·定时/计数器(ROM):
8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
·并行输入输出(I/O)口:
8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
·全双工串行口:
8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
·中断系统:
8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
·时钟电路:
8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。
INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。
下图是MCS-51系列单片机的内部结构示意图。
DS18B20简介
1.DS18B20基本
DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
2、DS18B20产品的特点
(1).只要求一个端口即可实现通信。
(2).在DS18B20中的每个器件上都有独一无二的序列号。
(3).实际应用中不需要外部任何元器件即可实现测温。
(4).测量温度范围在-55。
C到+125。
C之间。
(5).数字温度计的分辨率用户可以从9位到12位选择。
(6).内部有温度上、下限告警设置。
3、DS18B20引脚图及引脚功能介绍
TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。
(底视图)图
表1DS18B20详细引脚功能描述
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
4.DS18B20的使用方法
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
DS18B20的复位时序
DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
12864简介
12864A-1汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
主要技术参数和显示特性:
电源:
VDD3.3V~+5V(内置升压电路,无需负压);
显示内容:
128列×64行
显示颜色:
黄绿
显示角度:
6:
00钟直视
LCD类型:
STN
与MCU接口:
8位或4位并行/3位串行
配置LED背光
多种软件功能:
光标显示、画面移位、自定义字符、睡眠模式等
外形尺寸
主要外形尺寸
项目
标准尺寸
单位
模块体积
113.0×65.0×12.8
mm
定位尺寸
105.0×55.0
mm
视域
73.4×38.8
mm
行列点阵数
128×64
dots
点距离
0.52×0.52
mm
点大小
0.48×0.48
mm
模块引脚说明
128X64引脚说明
引脚号
引脚名称
方向
功能说明
1
VSS
-
模块的电源地
2
VDD
-
模块的电源正端
3
V0
-
LCD驱动电压输入端
4
RS(CS)
H/L
并行的指令/数据选择信号;串行的片选信号
5
R/W(SID)
H/L
并行的读写选择信号;串行的数据口
6
E(CLK)
H/L
并行的使能信号;串行的同步时钟
7
DB0
H/L
数据0
8
DB1
H/L
数据1
9
DB2
H/L
数据2
10
DB3
H/L
数据3
11
DB4
H/L
数据4
12
DB5
H/L
数据5
13
DB6
H/L
数据6
14
DB7
H/L
数据7
15
PSB
H/L
并/串行接口选择:
H-并行;L-串行
16
NC
空脚
17
/RET
H/L
复位低电平有效
18
NC
空脚
19
LED_A
-
背光源正极(LED+5V)
20
LED_K
-
背光源负极(LED-OV)
逻辑工作电压(VDD):
4.5~5.5V
电源地(GND):
0V
工作温度(Ta):
0~60℃(常温)/-20~75℃(宽温)
接口时序
模块有并行和串行两种连接方法(时序如下):
8位并行连接时序图
MPU写资料到模块
MPU从模块读出资料
串行数据连接时序图
具体指令介绍:
1、清除显示
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
L
H
功能:
清除显示屏幕,把DDRAM位址计数器调整为“00H”
2、位址归位
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
H
X
功能:
把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM
3、位址归位
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
H
I/D
S
功能:
把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM功能:
执行该命令后,所设置的行将显示在屏幕的第一行。
显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。
Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。
4、显示状态开/关
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
H
D
C
B
功能:
D=1;整体显示ONC=1;游标ONB=1;游标位置ON
5、游标或显示移位控制
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
H
S/C
R/L
X
X
功能:
设定游标的移动与显示的移位控制位:
这个指令并不改变DDRAM的内容
6、功能设定
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
H
DL
X
0RE
X
X
功能:
DL=1(必须设为1)RE=1;扩充指令集动作RE=0:
基本指令集动作
7、设定CGRAM位址
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
H
AC5
AC4
AC3
AC2
AC1
AC0
功能:
设定CGRAM位址到位址计数器(AC)
8、设定DDRAM位址
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
H
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
设定DDRAM位址到位址计数器(AC)
9、读取忙碌状态(BF)和位址
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
H
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值
10、写资料到RAM
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
H
L
D7
D6
D5
D4
D3
D2
D1
D0
功能:
写入资料到内部的RAM(DDRAM/CGRAM/TRAM/GDRAM)
11、读出RAM的值
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
H
H
D7
D6
D5
D4
D3
D2
D1
D0
功能:
从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM)
12、待命模式(12H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
L
H
功能:
进入待命模式,执行其他命令都可终止待命模式
13、卷动位址或IRAM位址选择(13H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
H
SR
功能:
SR=1;允许输入卷动位址SR=0;允许输入IRAM位址
14、反白选择(14H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
H
R1
R0
功能:
选择4行中的任一行作反白显示,并可决定反白的与否
15、睡眠模式(015H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
H
SL
X
X
功能:
SL=1;脱离睡眠模式SL=0;进入睡眠模式
16、扩充功能设定(016H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
H
H
X
1RE
G
L
功能:
RE=1;扩充指令集动作RE=0;基本指令集动作G=1;绘图显示ONG=0;绘图显示OFF
17、设定IRAM位址或卷动位址(017H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
H
AC5
AC4
AC3
AC2
AC1
AC0
功能:
SR=1;AC5~AC0为垂直卷动位址SR=0;AC3~AC0写ICONRAM位址
18、设定绘图RAM位址(018H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
H
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
设定GDRAM位址到位址计数器(AC)
4.各部分电路简介
1.最小系统介绍
最小系统由单片机,时钟电路和复位电路组成:
如下图所示
时钟电路复位电路
时钟电路为单片机工作提供时序,电路复位时单片机程序指针指向初始位置
2.数据采集电路
3.显示电路
4.报警电路
5.总原理图
五.程序清单
#include
#include
#include
#include//要用到取绝对值函数abs()
#defineucharunsignedchar
#defineuintunsignedint
/*端口定义*/
#defineLCD_dataP0//数据口
sbitLCD_RS=P3^5;//寄存器选择输入
sbitLCD_RW=P3^6;//液晶读/写控制
sbitLCD_EN=P3^4;//液晶使能控制
sbitLCD_PSB=P3^7;//串/并方式控制
sbitkey1=P2^4;
sbitkey2=P2^5;
sbitkey3=P2^6;
sbitkey4=P2^7;
sbitLED0=P1^0;
sbitLED1=P1^1;
sbitLED2=P1^2;
sbitds=P2^2;
sbitbeep=P2^3;
inttempValue1;
unsignedinttemp;
ucharcodeth0=(65535-3000)/256;
ucharcodetl0=(65535-3000)%256;
uchardisbuf[7];
uchardis1[]="温度报警器的设计";
uchardis2[]={"温度上限:
C"};
uchardis4[]={"温度:
.C"};
uchardis3[]={"温度下限:
C"};
ucharwenmax=20,wenmin=10;
voiddelay_1ms(uintx)
{
uinti,j;
for(j=0;jfor(i=0;i<110;i++);
}
voidwrite_cmd(ucharcmd)
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delay_1ms(20);
LCD_EN=1;
delay_1ms(20);
LCD_EN=0;
}
/*******************************************************************/
/**/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/**/
/*******************************************************************/
voidwrite_dat(uchardat)
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delay_1ms(20);
LCD_EN=1;
delay_1ms(20);
LCD_EN=0;
}
/*********************************************************/
/**/
/*设定显示位置*/
/**/
/*********************************************************/
voidlcd_pos(ucharX,ucharY)
{
ucharpos;
if(X==0)
{X=0x80;}
elseif(X==1)
{X=0x90;}
elseif(X==2)
{X=0x88;}
elseif(X==3)
{X=0x98;}
pos=X+Y;
write_cmd(pos);//显示地址
}
/*******************************************************************/
/**/
/*LCD初始化设定*/
/**/
/*******************************************************************/
voidlcd_init()
{
LCD_PSB=1;//并口方式
write_cmd(0x30);//基本指令操作
delay_1ms(20);
write_cmd(0x0C);//显示开,关光标
delay_1ms(20);
write_cmd(0x01);//清除LCD的显示内容
delay_1ms(20);
}
/*********************************************************/
/**/
/*主程序*/
/**/
/*********************************************************/
voidceshi()
{
write_cmd(0x01);//清除显示,并且设定地址指针为00H
delay_1ms(20);;
}
//DS18B20
//延时函数,对于11.0592MHz时钟,例i=10,则大概延时10ms.
voiddelay(unsignedinti)
{
unsignedintj;
while(i--)
{
for(j=0;j<125;j++);
}
}
voiddsInit()
{
//对于11.0592MHz时钟,unsignedint型的i,作一个i++操作的时间大于?
us
unsignedinti;
ds=0;
i=100;//拉低约800us,符合协议要求的480us以上
while(i>0)i--;
ds=1;//产生一个上升沿,进入等待应答状态
i=4;
while(i>0)i--;
}
voiddsWait()
{
unsignedinti;
while(ds);
while(~ds);//检测到应答脉冲
i=4;
while(i>0)i--;
}
//向DS18B20读取一位数据
//读一位,让DS18B20一小周期低电平,然后两小周期高电平,
//之后DS18B20则会输出持续一段时间的一位数据
bitreadBit()
{
unsignedinti;
bitb;
ds=0;
i++;//延时约8us,符合协议要求至少保持1us
ds=1;
i++;i++;//延时约16us,符合协议要求的至少延时15us以上
b=ds;
i=8;
while(i>0)i--;//延时约64us,符合读时隙不低于60us要求
returnb;