基于51单片机的数字温度报警器.doc
《基于51单片机的数字温度报警器.doc》由会员分享,可在线阅读,更多相关《基于51单片机的数字温度报警器.doc(26页珍藏版)》请在冰点文库上搜索。
郑州科技学院
单片机课程设计
题目:
基于51单片机的数字温度报警器
专业班级:
电气工程及其自动化班
院系:
电气工程学院
姓名:
学号:
指导教师:
日期:
2017年6月2日
目录
1课程设计目的 1
2课程设计任务与要求 1
3设计方案与论证 1
3.1单片机的选择 2
3.2温度传感器的选择 2
3.3显示模块选择 3
4系统硬件电路设计 3
4.1系统整体电路图 3
4.2单片机最小系统 4
4.3报警电路设计 5
4.4显示电路设计 5
4.5电源电路设计 6
5系统软件设计 7
5.1主程序 7
5.2读出温度子程序 7
5.3温度转换命令子程序 7
5.4计算温度子程序 7
6仿真过程 7
6.1仿真软件介绍 7
6.2仿真结果 8
7总结与致谢 10
参考文献:
11
附录1:
总体原理图 12
附录2:
实物图 13
附录2:
源程序 14
1.课程设计目的
温度控制在冶金、化工、建材、食品、机械、石油等工业中,具有不可或缺的作用。
对于不同场所、不同工艺、所需温度高低范围不同、精度不同,则采用的测温元件、测温方法以及对温度的控制方法也将不同;产品工艺不同、控制温度的精度不同、时效不同,则对数据采集的精度和采用的控制算法也不同,所以,对温度的测控方法多种多样。
随着电子技术和微型计算机的迅速发展,微机测量和控制技术也得到了迅速的发展和广泛的应用。
利用微机对温度进行测控的技术,也便随之而生,并得到日益发展和完善,越来越显示出其优越性。
随着科技水平的不断提高,单片机给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计即用单片机对温度进行实时检测与控制,通过数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S52,测温传感器使用DS18B20,用4位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到设计要求。
本温度计属于多功能温度计,功能较强,可以设置上下限报警温度,且测量准确、误差小。
当测量温度超过设定的温度上下限时,启动蜂鸣器和指示灯报警。
2.课程设计任务与要求
基本范围0℃-99℃;精度误差小于0.5℃;LED数码直读显示;实现声光报警;可以任意设定温度的上下限报警功能 。
3.设计方案与论证
方案一,由于本设计是测温电路,根据设计要求可以使用热敏电阻之类的感温器件利用其感温效应,然后将随被测温度变化的电压或电流采集过来,经过A/D转换后,将数据传输到单片机进行数据的处理,然后在显示电路上显示,这样就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案二,在单片机电路设计中,大多都是使用传感器,这是非常容易想到利用数字温度传感器,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,然后传输给单片机进行数据处理,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路设计比较简洁,软件设计也比较简单,故采用方案二。
3.1单片机的选择
AT89S52单片机是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,片上Flash允许程序存储器在系统可编程,亦适于常规编程器,在功能强大的微型计算机的AT89S52单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S52引脚结构图如图3.1:
图3.1AT89S52结构图
3.2温度传感器的选择
温度传感器的种类众多,在应用与高精度、高可靠性的场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器当仁不让。
超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20更受欢迎。
DS18B20的主要特征:
全数字温度转换及输出;最高12位分辨率,精度可达土0.5摄氏度;12位分辨率时的最大工作周期为750毫秒;可选择寄生工作方式;检测温度范围为–55°C~+125°C(–67°F~+257°F);内置EEPROM,限温报警功能。
用户可定义报警设置;64位光刻ROM,内置产品序列号,方便多机挂接;多样封装形式,适应不同硬件系统;独特的单线接口仅需要一个端口引脚进行通信;多个DS18B20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.0~5.5V;零待机功耗;温度以9或12位数字;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件
3.3显示模块选择
数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
4.系统硬件电路设计
4.1系统整体电路图
该系统电路主要包括:
单片机最小系统、DS18B20温度传感器系统、报警系统、LED显示模块电路及电源接口和数据下载接口等电路,如图4.1所示。
图中有三个独立式按键可以分别调整温度计的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。
图中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。
图4.1系统整体电路图
4.2单片机最小系统
最小系统包括晶振电路、复位电路、按键设置部分,AT89S52单片机最小系统的电路如图:
4.2
单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
图4.2单片机最小系统电路
4.3报警电路设计
报警电路中加一PNP三极管驱动,基极接单片机P11口,当端口变成低电平时,驱动三极管会导通,VCC电压加载到蜂鸣器使其发声、报警发光二极管亮,如图4.3
图4.3报警电路
4.4显示电路设计
如图4.4,采用LG3641BHLED数码管显示电路采用4位共阳LED数码管从P14,P15,P16,P17串口输出段码。
用PNP三极管进行驱动,当相应的端口变成低电平时,驱动相应的三极管会导通,驱动三极管给数码管相应的位供电,这时只要P0口送出数字的显示代码,数码管就能正常显示数字。
图4.4数码管显示电路
4.5电源电路设计
我们选用的是串联起来的4节1.5v的5号电池,从经济的角度考虑的,干电池比较便宜,但其还有不足之处,干电池存储的是电量。
随着电量的消耗,它的供电电压就会不断的下降,所有我们需要使用一个稳压器,来保证电源供给的是标准的5v电压。
4节1.5v串联起来产生的和电压最大是6v,而本文的AT89S52单片机工作电压的范围是4v—5.5v,在该系统中我们使用的电压是5v。
这时我们可以用LM7805稳压器来产生稳定的5v电压[15]。
稳压电路如下图4.5所示:
图4.5LM7805稳压电路
在该电路中,C12是极性电容,起到稳压的作用,而C2是非极性电容,它起的作用是滤除输出电压中不是直流的成分,即滤波。
LM7805稳压芯片的稳压压差为2V左右,在实际使用中容易出现电压过低的状态,此时提供的电源达不到系统的电源要求,会出现程序跑飞的现象,而另一款LM2904的稳压压差可以达到40mV,效果比LM7805好很多,但考虑到经济原因我们采用LM7805,只要在稳压前端提供较大的电源供应即可。
5.系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,按键扫描。
5.1主程序
主程序的主要功能是负责读出并处理DS18B20的测量的当前温度值,温度的实时显示,并根据设置的上下限判断是否报警。
系统开始运行时,温度传感器测量并计算温度值通过P1.0口传输进单片机里进行处理,经过处理后的数据再通过P0口传输到数码管进行显示。
通过按键设置温度报警界限,当超过报警界限时单片机将相应的数据通过P1.1口传输进行声光报警。
温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度。
5.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
5.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
5.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。
6.仿真过程
6.1仿真软件介绍
本次仿真用了Proteus软件,Proteus(海神)的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。
该软件的特点:
(1)全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。
(2)具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS一232动态仿真、1C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
(3)目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
(4)支持大量的存储器和外围芯片。
总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大,可仿真51、AVR、PIC。
Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。
因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。
对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象[18]。
程序编译用Keil软件,KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
6.2仿真结果
将生成的cao.hex文件调入Proteus电路图的单片机中,点击图左下角的开始键运行,程序的开始界面如图6.1,数码管显示“————”。
图6.1仿真程序初始化
程序初始化后通过调节DS18B20温度传感器的数值,数码管会显示相应的数值,例如10℃,其结果如图6.2所示。
图6.2仿真程序正常运行结果
在设置系统报警温度上下限时,按下按键S1,数码管会显示“H38C”(系统默认上限为38℃),此时进入温度上限设置模式,可通过调节S2和S3分别增加和减小数码管上显示的数字,例如设置上限为39℃,如图6.3所示。
接着再次按下键S1,数码管会显示“L05C”(系统默认下限为5℃),此时进入温度下限设置模式,可通过调节S2和S3分别增加和减小数码管上显示的数字,例如设置下限为5℃,如图6.4所示。
图6.3仿真设置最高温度报警线
图6.4仿真设置温度报警最低线
当温度超过设置的上下限时,系统会进行声光报警,蜂鸣器会发出“滴……滴……滴”蜂鸣声,同时LED灯会闪烁。
7.总结与致谢
通过本次的课程设计,我学到了很多东西,同时在做的过程中也发现很多的问题,从最初的课题选择到对相关课题资料的搜集与摘选,再到自己的思路的设计、编写以致最后阶段的修改与完善。
在这一过程中,我对我所学习的相关电子知识又有了更深一层的学习和理解,让我对自己所学的又有了更深的掌握。
单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法。
只有我们去试着做了,才能真正的掌握,只学习理论有些东西而不结合实践是很难理解的,更谈不上掌握。
从这次的课程设计中,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
在此过程中,我也要感谢对我一直悉心指导和帮助的指导教师——朱小会老师。
正是在她不厌其烦的指导和讲解中,让我对我的课程设计思路逐渐清晰明朗,每当在我课程设计中遇到困难时总能迎刃而解,总之非常感谢她这段时间对我们的鼓励和指导。
参考文献:
[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:
北京航空航天大学出版社,1998
[2] 李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994
[3] 江力.单片机原理与应用技术.清华大学出版社.2006
[4] 蔡美琴等.MCS一51系列单片机系统及其应用[M].北京:
高等教育出版社,1999.
[5]王树勋.MCS一51单片微型计算机原理与开发.北京:
机械工业出版社,1995
[6]何希才.传感器及其应用电路.北京:
电子工业出版社,2001
[7]刘迎春、叶湘滨.传感器原理设计与应用(第三版)[M].长沙:
国防科技大学出版社,
1997
[8]靳达.单片机应用系统开发实例导航.北京:
人民邮电出版社,2003.
[9]潘新民,王燕芳.微型计算机实用系统设计[M].北京:
人民邮电出版社,1992.
[10]胡汉才.单片机原理及接口技术.北京:
清华大学出版社,1996
[11]何力民.MCS一51系列单片机应用系统设计.北京:
北京航空航天大学出版社,1993
[12]江晓安.等数字电子技术.编著.西安电子科技大学出版社.1993
[13]阎石.数字电子技术基础(第三版).北京:
高等教育出版社,1989
[14]廖常初.现场总线概述[J].电工技术,1999.
[15]靳达.单片机典型模块设计实例导航.北京:
人民邮电出版社,2003.
[16]王松武,于鑫,武思军.电子创新设计与实践.北京:
国防工业出版社,2005
附录1:
总体原理图
附录2:
实物图
附录2:
源程序
/******************************************************************
程序名称:
DS18B20温度测量、报警系统
简要说明:
DS18B20温度计,温度测量范围0~99.9摄氏度
可设置上限报警温度、下限报警温度
即高于上限值或者低于下限值时蜂鸣器报警
默认上限报警温度为38℃、默认下限报警温度为5℃
报警值可设置范围:
最低上限报警值等于当前下限报警值
最高下限报警值等于当前上限报警值
将下限报警值调为0时为关闭下限报警功能
******************************************************************/
#include
#include"DS18B20.h"
#defineuintunsignedint
#defineucharunsignedchar//宏定义
#defineSETP3_1//定义调整键
#defineDECP3_2//定义减少键
#defineADDP3_3//定义增加键
#defineBEEPP3_7//定义蜂鸣器
bitshanshuo_st;//闪烁间隔标志
bitbeep_st;//蜂鸣器间隔标志
sbitDIAN=P2^7;//小数点
ucharx=0;//计数器
signedcharm;//温度值全局变量
ucharn;//温度值全局变量
ucharset_st=0;//状态标志
signedcharshangxian=38;//上限报警温度,默认值为38
signedcharxiaxian=5;//下限报警温度,默认值为5
uchar
codeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*****延时子程序*****/
voidDelay(uintnum)
{
while(--num);
}
/*****初始化定时器0*****/
voidInitTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0;//50ms(晶振12M)
}
/*****定时器0中断服务程序*****/
voidtimer0(void)interrupt1
{
TH0=0x3c;
TL0=0xb0;
x++;
}
/*****外部中断0服务程序*****/
voidint0(void)interrupt0
{
EX0=0;//关外部中断0
if(DEC==0&&set_st==1)
{
shangxian--;
if(shangxian}
elseif(DEC==0&&set_st==2)
{
xiaxian--;
if(xiaxian<0)xiaxian=0;
}
}
/*****外部中断1服务程序*****/
voidint1(void)interrupt2
{
EX1=0;//关外部中断1
if(ADD==0&&set_st==1)
{
shangxian++;
if(shangxian>99)shangxian=99;
}
elseif(ADD==0&&set_st==2)
{
xiaxian++;
if(xiaxian>shangxian)xiaxian=shangxian;
}
}
/*****读取温度*****/
voidcheck_wendu(void)
{
uinta,b,c;
c=ReadTemperature()-5;//获取温度值并减去DS18B20的温漂误差
a=c/100;//计算得到十位数字
b=c/10-a*10;//计算得到个位数字
m=c/10;//计算得到整数位
n=c-a*100-b*10;//计算得到小数位
if(m<0){m=0;n=0;}//设置温度显示上限
if(m>99){m=99;n=9;}//设置温度显示上限
}
/*****显示开机初始化等待画面*****/
Disp_init()
{
P2=0xbf;//显示-
P1=0xf7;
Delay(200);
P1=0xfb;
Delay(200);
P1=0xfd;
Delay(200);
P1=0xfe;
Delay(200);
P1=0xff;//关闭显示
}
/*****显示温度子程序*****/
Disp_Temperature()//显示温度
{
P2=0xc6;//显示C
P1=0xf7;
Delay(300);
P2=LEDData[n];//显示个位
P1=0xfb;
Delay(300);
P2=LEDData[m%10];//显示十位
DIAN=0;//显示小数点
P1=0xfd;
Delay(300);
P2=LEDData[m/10];//显示百位
P1=0xfe;
Delay(300);
P1=0xff;//关闭显示
}
/*****显示报警温度子程序*****/
Disp_alarm(ucharbaojing)
{
P2=0xc6;//显示C
P1=0xf7;
Delay(200);
P2=LEDData[baojing%10];//显示十位
P1=0xfb;
Delay(200);
P2=LEDData[baojing/10];//显示百位
P1=0xfd;
Delay(200);
if(set_st==1)P2=0x89;
elseif(set_st==2)P2=0xc7;//上限H、下限L标示
P1=0xfe;
Delay(200);
P1=0xff;//关闭显示
}
/*****报警子程序*****/
voidAlarm()
{
if(x>=10){beep_st=~beep_st;x=0;}
if((m>=shangxian&&bee