推荐基于AT89S51单片机的数字温度计的设计精品.docx
《推荐基于AT89S51单片机的数字温度计的设计精品.docx》由会员分享,可在线阅读,更多相关《推荐基于AT89S51单片机的数字温度计的设计精品.docx(26页珍藏版)》请在冰点文库上搜索。
![推荐基于AT89S51单片机的数字温度计的设计精品.docx](https://file1.bingdoc.com/fileroot1/2023-6/19/4f250010-dc9d-4e7f-8f0b-3dabf2e16ff3/4f250010-dc9d-4e7f-8f0b-3dabf2e16ff31.gif)
推荐基于AT89S51单片机的数字温度计的设计精品
基于AT89S51单片机的数字温度计的设计
摘要:
随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于AT89S51单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。
该温度计采用DS18B20作为温度信号的采集和初步处理,设计方案简单。
关键词:
单片机;温度计;DS18B20;AT89S51
Abstract:
Withtheprogressofthetimesanddevelopment,SCMtechnologyhasspreadtoourlife,work,scientificresearch,eachdomain,hasbeearelativelymaturetechnology,thispaperintroducesakindofdigitalthermometerbasedonAT89S51SCMcontrol,thethermometerbelongstothemultifunctionalthermometer,youcansetupperandlowertemperaturealarm,whenthetemperatureisnotthesetrange,canalarm.ThethermometerusingDS18B20asthecollectionandinitialprocessingtemperaturesignal,theplanofdesignissimple.
Keywords:
Microprocessor;temperature;DS18B20;AT89S51
1引言
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
2总体设计框图
温度计电路设计总体设计方框图如图2-1所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
图2-1总体设计方框图
3系统整体硬件电路
系统整体硬件电路包括,单片机AT89S51主板电路,温度显示电路,温度检测电路,晶振控制电路,复位电路等。
3.1硬件原理图
图3-1硬件原理图
以AT89S51单片机为核心,选用12M的晶振,这是最常用的选择,外接电容没有特别的要求,但是外接电容的大小会影响振荡器的频率高低、振荡器的稳定性和起振的快速性,因此我们选用30pf的电容作为起振电容。
复位电路为按键低电平复位,当按键按下,RST端为高电平,当高电平持续4us的时间就可以使单片机复位。
这里尤其要注意的是晶振和电容的位置,它们距离单片机引脚越短越好,因为太长可能无法使单片机起振。
另外是EA端一定要接上电源,使单片机能够工作。
3.2AT89S51单片机
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:
40个引脚,4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
3.2.1AT89S51主要功能
1、为一般控制应用的8位单芯片
2、晶片内部具时钟振荡器(传统最高工作频率可至12MHz)
3、内部程式存储器(ROM)为4KB
4、内部数据存储器(RAM)为128B
5、外部程序存储器可扩充至64KB
6、外部数据存储器可扩充至64KB
7、32条双向输入输出线,且每条均可以单独做I/O的控制
8、5个中断向量源
9、2组独立的16位定时器
10、1个全多工串行通信端口
11、8751及8752单芯片具有数据保密的功能
12、单芯片提供位逻辑运算指令
3.2.2AT89S51各引脚功能介绍
VCC:
AT89S51电源正端输入,接+5V。
VSS:
电源地端。
XTAL1:
单芯片系统时钟的反相放大器输入端。
XTAL2:
系统时钟的反相放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加20PF
图3-2单片机电路引脚图
的小电容,可以使系统更稳定,避免噪声干扰而死机。
RESET:
AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
EA/Vpp:
"EA"为英文"ExternalAccess"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。
因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。
如果是使用8751内部程序空间时,此引脚要接成高电平。
此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。
ALE/PROG:
ALE是英文"AddressLatchEnable"的缩写,表示地址锁存器启用信号。
AT89S51可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为AT89S51是以多工的方式送出地址及数据。
平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。
此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。
PSEN:
此为"ProgramStoreEnable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。
AT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。
PORT0(P0.0~P0.7):
端口0是一个8位宽的开路汲极(OpenDrain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。
其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。
如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。
设计者必须外加一锁存器将端口0送出的地址栓锁住成为A0~A7,再配合端口2所送出的A8~A15合成一完整的16位地址总线,而定址到64K的外部存储器空间。
PORT2(P2.0~P2.7):
端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。
P2除了当做一般I/O端口使用外,若是在AT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。
PORT1(P1.0~P1.7):
端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LSTTL负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。
如果是使用8052或是8032的话,P1.0又当做定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发脚位。
PORT3(P3.0~P3.7):
端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。
其引脚分配如下:
P3.0:
RXD,串行通信输入。
P3.1:
TXD,串行通信输出。
P3.2:
INT0,外部中断0输入。
P3.3:
INT1,外部中断1输入。
P3.4:
T0,计时计数器0输入。
P3.5:
T1,计时计数器1输入。
P3.6:
WR:
外部数据存储器的写入信号。
P3.7:
RD,外部数据存储器的读取信号。
3.3显示电路
图3-3温度显示电路
DB18B20液晶屏为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字。
液晶1、2端为电源,15、16端为背光电源,为防止直接加5V而烧坏背光灯,在15脚串联一个1K电阻,液晶3端为液晶对比度调节端,通过一个10K的电位器来调节液晶显示对比度,用于限流。
液晶4端为向液晶控制器写数据/写命令选择端,接单片机P1.0端口。
液晶5端为读/写选择端,因为我们不需要从液晶中读取数据,只向其写入命令和数据,因此此端始终选择为写状态,即低电平接地。
液晶6端为使能信号,是操作必须的信号,接单片机的P1.1口。
3.4温度检测电路设计
温度检测电路如下图3-4所示:
图3-4温度检测电路
DS18B20是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
•独特的单线接口仅需一个端口引脚进行通讯
•简单的多点分布应用
•无需外部器件
•可通过数据线供电
•零待机功耗
•测温范围-55~+125℃,以0.5℃递增。
华氏器件-67~+2570F,以0.90F递增
•温度以9位数字量读出
•温度数字量转换时间200ms(典型值)
•用户可定义的非易失性温度报警设置
•报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列、各种封装形式如图3-5所示,DQ为数据输入/输出引脚。
VDD为开漏单总线接口引脚,当被用着在寄生电源下,也可以向器件提供电源;GND为地信号,当工作于寄生电源时,此引脚必须接地。
其电路图如图3-5所示.。
图3-5外部封装形式
DS18B20的测温原理如图3-6所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图3-7中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
在正常测温情况下,DS1820的测温分辨力为0.5℃。
图3-6DS18B20的测温原理
3.5晶振控制电路
单片机XIAL1和XIAL2分别接30PF的电容,中间在并个6MHZ的晶振,形成单片机的晶振电路。
图3-7晶振控制电路
3.6复位电路
图3-8复位电路
4系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
4.1实验主程序流程图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图4-1所示。
图4-1主程序流程图
4.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图4-2所示。
图4-2读温度流程图
4.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如图4-3所示。
图4-3温度转换流程图
4.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图4-4所示。
图4-4计算温度流程图
4.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图5-5所示。
图4-5显示数据刷新流程图
5调试
系统的调试以程序为主。
硬件调试比较简单,首先检查电路的焊接是否正确,然后可用万用表测试或通电检测。
软件调试先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度子程序、显示数据刷新子程序的编程及调试,由于DB18B20与单片机采用串行数据传送,因此,我对DB18B20进行读写程序时严格地保证读写时序,以防无法读取测量结果。
本程序采用单片机汇编编写,用KELL编程调试。
软件调试到能显示温度值,而且在有温度变化时(例如用手去接触)现实温度能改变就基本完成。
性能测试时,我用制作的温度计和已有的成品温度计来同时测量比较,由于DB18B20的精度很高,所以误差指标可以限制在0.1℃以内,另外-55~+125℃的测温范围使得该温度计完全适合一般的应用场合,其低压温度供电特性可做成用电池供电的手持温度计。
在DB18B20测温程序设计中,向DB18B20发出温度转换命令后,程序总要等待DB18B20的返回信号,一旦某个DB18B20接触不好或断线,当程序读该DB18B20时,将没有返回信号,程序进入死循环,所以我在进行DB18B20硬件连接和软件设计时给予了一定的重视。
图6-1调试结果图
6结束语
该温度测试系统不仅具有结构简单、体积小、价格低廉、精确度较高、反应速度较快、数字化显示和不易损坏等特点,而且性能稳定,适用范围广,因此特别适用于对测温要求比较准确的场所。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
参考文献:
[1]李广第,王秀山.单片机基础[M].北京航空航天大学出版,20XX.
[2]余发山.单片机原理及应用技术[M].北京矿业大学出版社,20XX.
[3]廖月琴.基于AT89S51单片计数温度计的设计[J].20XX.
[4]李朝青.单片机原理及接口技术[M].北京航空航天大学出版社,20XX.
[5]金伟正.单线数字温度传感器的原理与应用[J].电子技术应用.2000.
[6]龙吉.基于AT89C2051单片机的数字温度计的设计[J].科学之友.20XX.
[7]马云峰.单片机与数字温度传感器DS18B20的接口技术[J].计算机测量与控制.20XX.
[8]丁元杰.单片机原理与应用[M].机械工业出版社,1994.
[9]付家才.单片机控制工程实践技术[M].化学工业出版社,20XX.
附录程序清单
#include//头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^0;
sbitlcden=P2^1;//液晶使能端
sbitDATA=P3^7;//DS18B20接入口
ucharFLAG_DIS=0;
ucharbai_18b20,shi_18b20,ge_18b20,num;//定义变量
bitflag_Negative_number;//负数标志
ucharcodetable[]={"tempreture:
"};//提示语
/*****一毫秒定时*****/
voiddelay_ms(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*延时子函数*/
voiddelay(uintnum)
{
while(num--);
}
/*液晶写命令*/
voidwrite_lcd_(uchar)
{
rs=0;
lcden=0;
P0=;
delay_ms
(1);
lcden=1;
delay_ms
(1);
lcden=0;
}
/*液晶写数据*/
voidwrite_lcd_date(uchardate)
{
rs=1;
lcden=0;
P0=date;
delay_ms
(1);
lcden=1;
delay_ms
(1);
lcden=0;
}
/*液晶初始化程序*/
voidlcd_init()
{
write_lcd_(0x38);
write_lcd_(0x0c);
write_lcd_(0x06);
write_lcd_(0x01);
}
/*************DS18b20温度传感器函数*********************/
voidInit_DS18B20(void)//传感器初始化
{
ucharx=0;
DATA=1;//DQ复位
delay(10);//稍做延时
DATA=0;//单片机将DQ拉低
delay(80);//精确延时大于480us//450
DATA=1;//拉高总线
delay(20);
x=DATA;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(30);
}
/*温度传感器读一个字节*/
ReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DATA=0;//给脉冲信号
dat>>=1;
DATA=1;//给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
/*温度传感器写一个字节*/
voidWriteOneChar(uchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DATA=0;
DATA=dat&0x01;
delay(10);
DATA=1;
dat>>=1;
}
delay(8);
}
/*读取温度传感器温度*/
intReadTemperature(void)
{
uchara=0;
ucharb=0;
intt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
if(b&0x80)
{
t=~t+1;
flag_Negative_number=1;
}
else{flag_Negative_number=0;}
tt=t*0.0625;
t=tt*10+0.5;
return(t);
}
/*液晶显示温度*/
voiddis_D18B20(void)
{
inttemp;
temp=ReadTemperature();//读温度
bai_18b20=temp%1000/100;//显示十位
shi_18b20=temp%100/10;//显示个位
ge_18b20=temp%10;//显示十分位
if(flag_Negative_number)//负数
{
if(bai_18b20==0)//十位为0,则不显示十位
{
write_lcd_(0x80+0x40);
write_lcd_date(0x2D);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}