基于51的温度报警器设计.docx

上传人:b****8 文档编号:10486103 上传时间:2023-02-13 格式:DOCX 页数:30 大小:1.43MB
下载 相关 举报
基于51的温度报警器设计.docx_第1页
第1页 / 共30页
基于51的温度报警器设计.docx_第2页
第2页 / 共30页
基于51的温度报警器设计.docx_第3页
第3页 / 共30页
基于51的温度报警器设计.docx_第4页
第4页 / 共30页
基于51的温度报警器设计.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

基于51的温度报警器设计.docx

《基于51的温度报警器设计.docx》由会员分享,可在线阅读,更多相关《基于51的温度报警器设计.docx(30页珍藏版)》请在冰豆网上搜索。

基于51的温度报警器设计.docx

基于51的温度报警器设计

目录

1概述4

1.1研究背景4

1.2设计思想及基本功能4

2总体方案设计5

2.1方案选取5

2.2系统框图5

2.3总体方案设计6

3硬件电路设计6

3.1电源电路设计6

3.2晶振电路7

3.3复位电路7

3.4矩阵键盘电路8

3.5温度检测电路9

3.6液晶显示电路10

3.7蜂鸣器报警电路11

4系统软件设计12

4.1主程序软件设计12

4.2键盘扫描程序设计14

4.3温度上下限设定程序设计15

4.4延时程序设计16

5系统调试16

6总结18

参考文献18

附录1系统原理图19

附录2程序清单20

1概述

1.1研究背景

温度作为一种最基本的环境参数,和人们的安全、生活,工农业生产有着紧密的联系,因此在某些场合对温度进行检测,并且在温度超过期待范围后进行报警便显得尤为重要,对能实现温度检测并报警的装置的设计和研发也就有了特别的意义。

单片机作为一种微控制器,由于具有体积小,质量轻,功耗低,价格便宜,可靠性高,功能强大等特点,已经进入人们生活,工业生产的各个领域,现在很难在某个领域看不到单片机的痕迹。

在智能仪表领域,由于单片机的上述优点,用单片机作为控制平台,结合不同类型的传感器,可以很容易地对温度,湿度,流量等物理量进行检测。

针对在日常生活和工业生产中对温度进行检测和监控的需求,本课题以AT89C51单片机为核心设计了一种温度报警器,它可以通过键盘对温度进行上下限设置,用液晶进行温度显示,并且在超出温度设定范围后发声报警。

本设计也具有一定的扩展性,例如可以再加一个烟尘传感器和光电传感器,扩展为火灾报警器。

1.2设计思想及基本功能

本课题对温度报警器进行设计时,在满足温度检测和报警功能的基础上,为了增加其应用的灵活性,采用了矩阵键盘电路,从而可以对温度报警范围进行设定,以适应对温度有检测需求的不同应用场合。

为了增加人机交互性,采用了功耗低的字符型液晶显示汉字和温度。

该温度报警器具有以下基本功能:

(1)手动设定温度范围:

该功能使用户可以根据不同场合设定温度报警范围,增强了该设计的应用性。

(2)温度采集:

采用了数字温度传感器对现场温度在-55℃到+125℃范围内的应用场合进行温度采集。

(3)液晶显示:

通过常用的液晶模块对当前温度传感器采集的温度进行显示。

(4)蜂鸣器报警:

当温度传感器采集的温度不在设定范围内时,使蜂鸣器发声,进行报警。

2总体方案设计

2.1方案选取

在用单片机作为控制核心进行仪器设计时,附加的外围模块选择范围是很宽的,在选用时要多加比较,从而做出最合理的设计。

(1)温度采集模块选择

方案一:

非数字型温度传感器pt100,精度高,稳定性好,测量范围大;

方案二:

数字型温度传感器DS18B20,体积小,精度高,抗干扰能力强,硬件开销低;

这两个方案都是在对温度进行检测时经常使用的,考虑到DS18B20的精度和测温范围对本设计已经足够,且在使用时不需要进行AD转换,硬件电路简单,所以本设计采用DS18B20作为温度检测模块。

(2)显示模块选择

方案一:

三位数码管显示,数码管是单片机设计中常见的显示模块,可以显示0至9十个数字和小数点,价格便宜。

方案二:

字符型液晶模块显示,液晶模块显示清晰,功耗低,可以显示数字,汉字,英文字符和某些特殊符号,人机交互性好。

考虑到使用数码管显示要占用大量的IO口引脚,且没有液晶显示内容丰富,所以本温度报警器采用液晶模块显示当前温度。

2.2系统框图

系统框图如图2.1

图2.1系统框图

2.3总体方案设计

本课题设计的温度报警器是在满足基本功能的基础上,尽可能的简化电路,增加人机交互性。

在温度传感器选择时,为了避免大量的硬件设计,增加成本,选择了数字型温度传感器,从而不用在使用时进行AD转换,附加复杂的信号调理电路;在液晶模块选择时,考虑到单片机IO口的利用率,舍弃了需占用大量IO口并行传输的1602,选择了可以进行串行传输的12864;在报警方式选择时,舍弃了液晶显示闪烁报警,选择了更能引起用户注意的蜂鸣器发声报警方式。

3硬件电路设计

3.1电源电路设计

51单片机,温度传感器DS18B20,12864液晶模块所需正常的工作电压是5V,因此设计的电源应能够提供5V直流电,图3.1是设计的电源电路图。

在该电源电路中使用了三端集成稳压芯片LM7805,可以输出5V直流电压。

图3.1电源电路图

3.2晶振电路

电路中的晶振就是石英晶体震荡器。

石英晶体震荡器具有非常好的频率稳定性和抗外界干扰的能力,所以,石英晶体震荡器常用来产生基准频率的。

此外它还可以产生振荡电流,向单片机发出时钟信号。

图3.2是设计的单片机晶振电路。

片内电路与片外器件构成一个时钟产生电路,晶振频率一般多在1.2MHz~24MHz之间选取。

C1、C2是反馈电容,其值在20pF~100pF之间选取,一般为30pF左右。

本电路选用的电容为33pF,晶振频率为12MHz。

时钟周期为1us。

图3.2单片机晶振电路

3.3复位电路

复位电路的主要功能是使单片机进行初始化,在初始化的过程中需要在复位引脚上加大于2个机器周期的高电平。

复位后的单片机地址初始化为0000H,然后单片机继续从0000H单元开始执行程序。

单片机复位有上电复位和手动复位两种方式,图3.3所示的复位电路可以实现上电复位和手动复位两种基本功能。

图3.3复位电路图

3.4矩阵键盘电路

由于采用单个按键的方式会提高设计的复杂性,且占用IO口较多,本设计采用了4*4矩阵键盘,矩阵键盘的应用可以获取16个键值,降低了设计难度,节约了单片机IO口,提高了单片机IO口的利用率。

4*4矩阵键盘电路在本温度报警器设计中起到的作用是设定报警温度的上下限,它的四条行线和四条列线占用了单片机的P1口,如图3.4所示。

其中S0至S9用于设定温度值,S10按下则启动设定温度下限,S11按下则启动设定温度上限。

图3.4矩阵键盘电路图

3.5温度检测电路

温度检测电路采用的是单线数字型温度传感器DS18B20,其外形如图3.5所示。

DS18B20独特的单总线接口使其仅通过一条数据线就可以完成数据传输。

它的供电电压在3V至5.5V之间,感温范围在-55摄氏度至+125摄氏度之间,9至12位可调分辨率。

DS18B20有3条输出引线,分别接电源,地,单片机引脚,由于在正常工作时,该传感器需要约1mA的驱动电流,所以硬件电路需要在接电源和地的两条引线之间接一个约5K的电阻,硬件电路图如图3.6所示

图3.5DS18B20实物图

图3.6温度检测电路

3.6液晶显示电路

本课题设计的温度报警器显示模块采用的是字符型液晶QC12864B,带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行(即32个)16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

本设计采用的是该液晶的串行方式,其串行方式引脚接法如表1所示,硬件电路图如图3.7所示。

表1:

QC12864B串行方式引脚接线图

管脚号

名称

LEVEL

功能

1

VSS

0V

电源地

2

VDD

+5V

电源正

3

Vo

-

对比度调整

4

CS

H/L

片选,高电平有效

5

SID

H/L

串行数据输入

6

CLK

H/L

串行同步时钟,上升沿读取SID数据

15

PSB

L

L:

串行方式

19

A

VDD

背光源电压+5V

20

K

VSS

背光源负端0V

图3.7液晶显示电路

3.7蜂鸣器报警电路

当温度超过设定范围时,采用蜂鸣器模块电路报警,电路中跳线帽的作用是可以人为地接通或断开该电路,电阻起到限流的作用。

电路工作原理是当温度超出温度设定范围时,通过程序编程给P0口第7个引脚赋为低电平,三极管导通,

蜂鸣器发声。

图3.8蜂鸣器报警电路

4系统软件设计

系统软件设计主要包括键盘扫描子程序,温度上下限设定子程序,延时子程序等几部分构成。

本章节系统的介绍了温度报警器的主程序和各主要功能子程序的设计流程,具体的程序代码见附录2。

4.1主程序软件设计

主程序构成无限循环,主要完成相关模块初始化,温度采集,设定温度上下限,液晶显示,温度超出设定范围时蜂鸣器报警等功能,主程序的流程图如图4.1所示。

图4.1主程序流程图

程序首先进行相关宏定义,定义变量和数组,编写所需要的子函数,然后在主函数中调用液晶初始化子函数对液晶进行初始化,并在液晶第一行显示‘温度显示’四个汉字,调用温度采集函数对当前温度进行采集,调用温度上下限设定子函数设定适合现场的温度范围,然后将采集到的温度值同设定的温度上下限进行比较。

若在设定范围内,则调用液晶显示函数显示当前温度并返回到温度采集子函数调用处;若不在设定范围内,则调用液晶显示函数显示当前温度,使蜂鸣器报警,程序返回温度采集子函数调用处。

4.2键盘扫描程序设计

图4.2键盘扫描程序流程图

该键盘扫描程序采用行扫描的方式,从第一行扫描到第四行,首先将第一行设为低电平,其余行为高电平,通过读取P1口高四位电平情况判断是否有键按下,若无键按下则扫描下一行,若有键按下,延时5ms消抖,再次判断是否有键按下,若无键按下则扫描下一行,若有键按下则通过switch语句获取相应键值,松手检测后扫描下一行。

4.3温度上下限设定子程序设计

图4.3温度上下限设定子程序流程图

该程序功能是设定温度上下限,程序开始,调用键盘扫描函数获取一个键值,通过第一个if语句判断该键值是否为10,若是则通过for循环执行三次依次获取三个键值并赋给数组b[],从而计算出温度下限l,然后再次调用键盘扫描函数通过第二个if语句进行所得键值是否为11的判断;在第一个if语句判断中若键值不为10,则通过第二个if语句进行所得键值是否为11的判断。

在第二个if语句进行所得键值是否为11的判断中,若键值为11,则通过for循环执行三次依次获取三个键值并赋给数组c[],从而计算出温度上限h,然后程序结束;若不为11,则程序结束。

4.4延时子程序设计

图4.4延时子程序流程图

由于单片机采用的是12MHZ晶振,则执行一条空指令所用时间恰为1us,子函数中设定的参数x是空指令执行次数,所以这是一个us级的软件延时函数。

5系统调试

由于实验室的仪器较老,有些损坏,为了更好地调试,最终采用了自己买的51开发板。

首先利用Keil软件进行编程,反复调试无错后生成了一个Hex文件,然后将程序烧录进单片机里面,进行运行。

单片机运行后采集到当时室内温度为11.6℃,如图5.1,用矩阵键盘将温度上下限设为10℃~15℃,用手捏住温度传感器DS18B20一段时间,当传感器采集到的温度大于15℃时,如图5.2,蜂鸣器成功报警,说明该单片机系统能够很好地完成预期的功能。

图5.1采集室内温度显示

图5.2加热后温度显示

6总结

经过一周多的努力,终于完成了单片机课程设计,我们小组的题目是基于89C51的温度报警器设计,在经过大量的资料查阅后,我经过比较论证,进行了以AT89C51单片机为微控制器的温度报警器设计。

该设计围绕单片机附加了矩阵键盘电路,可以对温度上下限进行设定,增强了该设计的适应性;附加了温度检测模块,液晶模块,蜂鸣器电路分别对温度进行检测和显示,并在温度超出设定值时发声报警。

由于基础和时间有限,在设计过程中存在一些考虑不周的地方,例如在选择显示模块时,只考虑到和数码管相比,液晶具有显示内容丰富,低功耗的特性,在价格上考虑较少,此外,由于程序较复杂,还存在一些可以简化的地方。

总之,通过一个完整的课程设计,让我对所学的单片机知识有了更加深刻的理解和掌握,了解了用C语言对单片机进行编程的方法,此外使我复习了protel画电路图,visio画流程图,从而为以后的毕业设计打下了坚实的基础。

参考文献

[1]张迎新.单片微型计算机原理、应用及接口技术(第2版)[M].北京:

国防工业出版社,2004

[2]伟福LAB6000系列单片机仿真实验系统使用说明书

[3]阎石.数字电路技术基础(第五版).北京:

高等教育出版社,2006

[4]郭天祥.新概念51单片机C语言教程.北京:

电子工业出版社,2009

 

附录1系统原理图

附录2程序清单

#include

#include//包含_nop_()的定义

#defineuintunsignedint//对无符号整型数据类型进行宏定义

#defineucharunsignedchar//对无符号字符型数据类型进行宏定义

sbitP03=P0^3;//对P0口的相关引脚进行位定义

sbitP04=P0^4;

sbitP05=P0^5;

sbitP06=P0^6;

sbitP07=P0^7;

#definers_1P03=1//宏定义rs_1表示寄存数据

#definers_0P03=0//宏定义rs_0表示寄存指令

#definerw_1P04=1//宏定义rw_1表示读操作

#definerw_0P04=0//宏定义rw_0表示写操作

#defineen_1P05=1//宏定义en_1表示使能

#defineen_0P05=0//宏定义en_0表示禁止

#defineDS_0P06=0//设P0.6引脚为低电平

#defineDS_1P06=1//设P0.6引脚为高电平

#defineDS_HDS_1//设P0.6引脚为输入

#defineDS_LDS_0//设P0.6引脚为输出

uintTEMP_Result,te;//定义整型变量

uchartable[]={"温度显示"};//定义无符号字符型数组

uinti,a[3],b[3],c[3],l=100,h=300//定义无符号整型变量和数组

uchartemp_low,temp_high,num;//定义无符号字符型变量

ucharkey,temp;

voiddelay_us(uintx)//定义us级延时函数

{

for(i=0;i

_nop_();

}

ucharkeyscan()//定义键盘扫描函数

{

/*扫描第一行*/

P1=0xfe;//将第一行设为低电平,扫描第一行

temp=P1;//读取P1口电平

temp=temp&0xf0;//获取列线电平状态

while(temp!

=0xf0)//当有键按下时

{

delay_us(5000);//延时5ms消抖

temp=P1;//读取P1口电平

temp=temp&0xf0;//获取列线电平状态

while(temp!

=0xf0)//当有键按下时

{

temp=P1;//读取P1口电平

switch(temp)//switch语句获取键值

{

case0xee:

key=1;//若P1口电平为0xee,则得到键值1

break;

case0xde:

key=2;//若P1口电平为0xde,则得到键值2

break;

case0xbe:

key=3;//若P1口电平为0xbe,则得到键值3

break;

case0x7e:

key=4;//若P1口电平为0x7e,则得到键值4

break;

}

while(temp!

=0xf0)//松手检测

{

temp=P1;

temp=temp&0xf0;

}

}

}

/*扫描第二行*/

P1=0xfd;

temp=P1;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay_us(5000);

temp=P1;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P1;

switch(temp)

{

case0xed:

key=5;

break;

case0xdd:

key=6;

break;

case0xbd:

key=7;

break;

case0x7d:

key=8;

break;

}

while(temp!

=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

/*扫描第三行*/

P1=0xfb;

temp=P1;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay_us(5000);

temp=P1;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P1;

switch(temp)

{

case0xeb:

key=9;

break;

case0xdb:

key=0;

break;

case0xbb:

key=10;

break;

case0x7b:

key=11;

break;

}

while(temp!

=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

/*扫描第四行*/

P1=0xf7;

temp=P1;

temp=temp&0xf0;

while(temp!

=0xf0)

{

delay_us(5000);

temp=P1;

temp=temp&0xf0;

while(temp!

=0xf0)

{

temp=P1;

switch(temp)

{

case0xe7:

key=12;

break;

case0xd7:

key=13;

break;

case0xb7:

key=14;

break;

case0x77:

key=15;

break;

}

while(temp!

=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

returnkey;//将键值返回至键盘扫描函数调用处

}

voidarea()//温度上下限设定函数,程序设定温度上下限最大范围为00.0到99.9

{

keyscan();//调用键盘扫描函数获取键值

if(key=10)//如果键值为10,开始设定温度下限

{

for(i=0;i<3;i++)

{

keyscan();

b[i]=key;

delay_us(5000);

}

l=100*b[0]+10*b[1]+b[2];//b[0]为十位数值,b[1]为个位数值,b[2]为十分位数值

keyscan();

}

if(key=11)//如果键值为11,开始设定温度上限

{

for(i=0;i<3;i++)

{

keyscan();

c[i]=key;

delay_us(5000);

}

h=100*c[0]+10*c[1]+c[2];

}

}

voidSendbyte(uchardat)//串行发送数据子函数

{

for(i=0;i<8;i++)

{

en_0;

if(dat&0x80)//如果最高位数据被发送

rw_1;

else

rw_0;

en_1;

dat=dat<<1;//左移一位

}

}

voidwrite_com(ucharcom)//写指令子函数

{

rs_1;

Sendbyte(0xf8);

Sendbyte(com&0xf0);//取高四位,数据分两次传送

//每字节的内容被送入两个字节

//高四位放在第一个字节的高四位

Sendbyte((com&0x0f)<<4);//低四位放在第二个字节的高四位

rs_0;

}

voidwrite_date(uchardate)//写数据子函数

{

rs_1;

Sendbyte(0xfa);

Sendbyte(date&0xf0);

Sendbyte((date&0x0f)<<4);

rs_0;

}

voidlcd_init()//液晶初始化子函数

{

write_com(0x01);//清除显示屏幕

write_com(0x30);//基本指令集动作

write_com(0x0c);//开显示,无游标

write_com(0x06);//设定光标右移,整屏不移动

write_com(0x02);//清DDRAM位址归位

write_com(0x82);//将第一行显示位置设为第3个汉字位

for(num=0;num<8;num++)//在第一行显示汉字“温度显示”

{

write_date(table[num]);

}

}

voidlcd_display()//lcd显示函数

{

write_com(0x92);//设定温度值显示的位置

write_date(0x30+a[0]);//显示温度十位数值

write_date(0x30+a[1]);//显示温度个位数值

write_date(0x2e);//显示小数点

write_date(0x30+a[2]);//显示温度十分位数值

write_date(0xA1);/*lcd显示温度值符号*/

write_date(0xE6);

}

intDS18B20_init(void)

{

intt;

DS_H;

delay_us(50);

_nop_();//_nop_();是单周期指令,实现短时间延时

_nop_();

DS_L;

DS_0;//主器件拉低

delay_us(500);//最少480us

DS_H;//电

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1