您的当前位置:首页基于51单片机的数字温度计课程设计报

基于51单片机的数字温度计课程设计报

2022-12-08 来源:乌哈旅游


摘要

温度的检测与控制是工业生产过程中比较典型的应用。本设计以AT89C52单片机为核心,采用DS18B20温度传感器检测温度,由温度采集、温度显示,温度报警等功能模块组成。基于题目基本要求,本系统对温度采集和温度显示系统行了重点设计。本系统大部分功能能由软件实现,吸收了硬件软件化的思想。实际操作时,各功能在开发板上也能完美实现。本系统实现了要求的基本功能,其余发挥部分也能实现。

关键字:AT89C52单片机、DS18B20温度传感器、数码管显示、温度采集

目录

一.绪论 ............................................................................................... 二.设计目的 ........................................................................................ 三.设计要求 ........................................................................................ 四.设计思路 ........................................................................................ 五.系统的硬件构成及功能 ..............................................................

5.1主控制器 .................................................................................. 5.2显示电路 .................................................................................. 5.3温度传感器 ..............................................................................

六.系统整体硬件电路 ...................................................................... 七.系统程序设计 ............................................................................... 八.测量及其结果分析 ......................................................................... 九.设计心得体会 ................................................................................ 十.参考文献 ........................................................................................ 附录1 源程序

附录2 元件清单及PCB图

一.绪论

随着时代的发展,控制智能化,仪器小型化,功耗微量化得到广泛关注。单片机控制系统无疑在这些忙面起到了举足轻重的作用。单片机的应用系统设计业已成为新的技术热点,其中数字温度计就是一个典型的例子。

人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。

测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段: ①传统的分立式温度传感器 ②模拟集成温度传感器 ③智能集成温度传感器。

目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用。该设计控制器使用ATMEL公司的AT89C52单片机,测温传感器使用DALLAS公司DS18B20,用数码管来实现温度显示。

二.设计目的

1.理解掌握MCS-51系列单片机的功能和实际应用。 2.掌握仿真开发软件的使用。

3.掌握数字式温度计电路的设计、组装与调试方法。

三.设计要求

1.以MCS-51系列单片机为核心器件,组成一个数字式温度计。

2.采用数字式温度传感器为检测器件,进行单点温度检测,检测精度为0.5

C

3.温度显示采用4位LED数码管显示,三位整数,一位小数。 4.具有键盘输入上下限功能,超过上下限温度时,进行声音报警。

四.设计思路

1.根据设计要求,选择AT89C52单片机为核心器件。

2.温度检测器件采用DS18B20数字式温度传感器。与单片机的接口为P3.6引脚。

3.键盘采用独立式按键,由三个按键组成,分别是:设置键(SET),加一建(+1),确认键(RET)。

SET键(上下限温度设置键):当该键按下时,进入上下限温度设置功能。通过P3.1引脚接入。

+1键(加一调整键):在输入上下限温度时,该键按下一次,被调整位加一。通过P3.2引脚接入。

RET键(确认键):当该键按下时,指向下一个要调整的位。通过P3.3引脚接入。

4.声音报警蜂鸣器通过P1.7引脚接入。 硬件电路设计总体框图为图4.1:

按键输入电路 时钟电路复单片机 位电路 温度检测 蜂鸣器电路 图4.1

五、系统的硬件构成及功能 1.主控制器

单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。很适合便携手持式产品的设计使用。 AT89S52在仿真软件中的图像为图5.1

LED显示器驱动电路 3位LED显示器

图5.1

2.显示电路

显示电路采用四位共阳LED数码管,从P3口RXD,TXD串口输出段码。 LED数码管在仿真软件中如图5.2

图5.2

3.温度传感器

DS18B20是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:

•独特的单线接口仅需一个端口引脚进行通讯

•简单的多点分布应用 •无需外部器件 •可通过数据线供电 •零待机功耗

•测温范围-55~+125℃,以0.5℃递增。华氏器件-67~+2570F,以0.90F 递增 •温度以9 位数字量读出

•温度数字量转换时间200ms(典型值) •用户可定义的非易失性温度报警设置

•报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列、各种封装形式如图3.3.1所示,DQ 为数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。其电路图如图5.3.1所示.。

图5.3.1外部封装形式

在仿真软件中如图5.3.2所示

图5.3.2

DS18B20的测温原理如图5.3.3所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振

随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图5.3.3中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。

另外,由于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

斜率增加器预置τ1比较低温度系数振荡器计数器 1加 1预置Txτ2= 0高温度系数振荡器计数器 2温度寄存器= 0图5.3.3

停止 在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度

计数值CD。考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts可用下式计算:

Ts(Tz0.25℃)(CD-Cs)/CD

表1.部分温度值对应的二进制温度数据。 温度/℃ +125 +85 +25.0625 +10.125 +0.5 0 -0.5 -10.125 -25.0625 -55 二进制表示 0000 0111 1101 0000 0000 0101 0101 0000 0000 0001 1001 0000 0000 0000 1010 0001 0000 0000 0000 0010 0000 0000 0000 1000 1111 1111 1111 0000 1111 1111 0101 1110 1111 1110 0110 1111 1111 1100 1001 0000 十六进制表示 07D0H 0550H 0191H 00A2H 0008H 0000H FFF8H FF5EH FE6FH FC90H 六.系统整体硬件电路

根据设计要求与设计思路,硬件电路设计框图如图6.1所示,在仿真软件Proteus上完成。其中LED数码管以动态扫描法实现温度显示,由四个PNP型晶体管Q2,Q3,Q4,Q5和八个电阻组成,基极与单片机的P1.0,P1.1,P1.2连接。DS18B20的数据I/O端与单片机P3.6引脚连接。外部晶振为12MHz。蜂鸣器通过Q1放大后与引脚P1.7相连。

图中有三个独立式按键可以分别调整温度计的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。图中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。

图6.1系统总体硬件电路

七.系统程序设计

数字式温度计的应用程序主要包括主程序,温度检测程序,温度转换程序, LED显示程序等。

系统的主程序主要用来初始化一些系统参数,对DS18B20的配置数据进行一系列的设定。温度检测程序是对DS18B20的状态不断地查询,读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写,读取当前的温度值后,进行温度转化程序,对温度符号处理和温度值的BCD码处理,进行温度值正负的判定,将其段码送至显示缓冲区,以备定时扫描服务程序处理。LED显示程序主要对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时,将符号显示位移入下一位。总程序程序代码见附录一

开始 显示缓冲区初始化 复位DS18B20

发跳过ROM命令 发温度转换命令 延时 复位DS18B20 发跳过ROM命令 发读存储器命令 读温度数据 温度符号判定

将温度转换为BCD码 更新显示缓冲区 八.测量及其结果分析

1.Proteus仿真结果

软件方面,在Proteus编译下进行,源程序编译及仿真调试。

在软件中选定传感器后可对其进行环境温度设置,如图8.1.1,将环境温度设为34.9。

图8.1.1

然后点击软件执行键,按操作步骤实施后,观察LED数码管示数,此时示数如图8.1.2。

图8.1.2

可见本次软件测试结果良好。

2.硬件测试结果

在硬件测试方面,检查电路板及焊接的质量情况,在检查无误后通电检查LED显示器。

其中DS18B20实物图为8.2.1

在室温下,LED显示器示数如图8.2.2,为26.4摄氏度

图8.2.2

用手盖住温度传感器后,LED显示器示数如图8.2.3,为29.7摄氏度。

比较可知,硬件调试结果也达到了要求。

九.设计心得体会

本次课设对我来说是一次难得的经历,首先是第一次接触了仿真软件Proteus,在使用时经历了很多次失败,因为这款软件与以前使用的各种软件有很多不同,使用时不停出错,接线时由于元件放置不合理而接的杂乱无章;输入源程序时还较为顺利,显示结果比较满意。其次是程序设计,我们在参考别人成功先例的基础上根据自己设计的需要编制程序,其中历经不少曲折,最后我的收获是,编程一定要细心,针对每一个细节,稍有疏忽,程序就不能正常工作。最后是单片机实践操作,由于我自己已买了一块开发板,所以硬件调试比较顺利,效果也不错,就是DS18B20温度传感器灵敏度不太高,示数变化不大。另外,我前期花了一些时间专门学习这块芯片,了解了DS18B20的工作原理的时序图。

在这次的实践与学习中,尽管期间困难重重,但我还是从中学习了不少新的知识与技能和解决困难的方法,也终于体验到了经历困难到最终获得成功的那种无以言表的喜悦之情,总之,本次课设是我收获最多的一次,也希望自己在以后的各项研究活动中能坚持这种精神。

十.参考文献

[1]单片机原理与接口技术(第二版)牛昱光李晓林电子工业出版社. 2010.7 [2]单片机系统设计与应用实例. 韩志军机械工业出版社. 2009.10 [3]《DS18B20数据手册》

附录一源程序

#include #include \"DS18B20.h\" #define uint unsigned int

#define uchar unsigned char //宏定义 #define SET P3_1 //定义调整键 #define DEC P3_2 //定义减少键 #define ADD P3_3 //定义增加键 #define BEEP P3_7 //定义蜂鸣器 bit shanshuo_st; //闪烁间隔标志 bit beep_st; //蜂鸣器间隔标志 sbit DIAN = P2^7; //小数点 uchar x=0; //计数器

signed char m; //温度值全局变量 uchar n; //温度值全局变量 uchar set_st=0; //状态标志

signed char shangxian=38; //上限报警温度,默认值为38 signed char xiaxian=15; //下限报警温度,默认值为5

uchar code LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /*****延时子程序*****/ void Delay(uint num) {

while( --num ); }

/*****初始化定时器0*****/ void InitTimer(void) {

TMOD=0x1; TH0=0x4c;

TL0=0x00; //50ms(晶振12M) }

/*****定时器0中断服务程序*****/ void timer0(void) interrupt 1 {

TH0=0x4c; TL0=0x00; x++; }

/*****外部中断0服务程序*****/ void int0(void) interrupt 0 {

EX0=0; //关外部中断0

if(DEC==0&&set_st==1) {

shangxian--;

if(shangxianelse if(DEC==0&&set_st==2) {

xiaxian--;

if(xiaxian<0)xiaxian=0; } }

/*****外部中断1服务程序*****/ void int1(void) interrupt 2 {

EX1=0; //关外部中断1 if(ADD==0&&set_st==1) {

shangxian++;

if(shangxian>99)shangxian=99; }

else if(ADD==0&&set_st==2) {

xiaxian++;

if(xiaxian>shangxian)xiaxian=shangxian; } }

/*****读取温度*****/ void check_wendu(void) {

uint a,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=0xfe; Delay(200);

P2=0xbf; P1=0xfd; Delay(200); P2=0xbf; P1=0xfb; Delay(200); P2=0xbf;

P1=0xf7; //第四 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(uchar baojing) {

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;

else if(set_st==2)P2=0xc7; //上限H、下限L标示 P1=0xfe;

Delay(200); P1=0xff; }

/*****报警子程序*****/ void Alarm() {

if(x>=10){beep_st=~beep_st;x=0;}

if((m>=shangxian&&beep_st==1)||(m/*****主函数*****/ void main(void) {

uint z;

InitTimer(); //初始化定时器 EA=1; //全局中断开关 TR0=1;

ET0=1; //开启定时器0 IT0=1; IT1=1;

check_wendu(); check_wendu(); for(z=0;z<300;z++) {

Disp_init(); }

while(1) {

if(SET==0) {

Delay(2000);

do{}while(SET==0);

set_st++;x=0;shanshuo_st=1; if(set_st>2)set_st=0; }

if(set_st==0) {

EX0=0; //关闭外部中断0 EX1=0; //关闭外部中断1 check_wendu();

Disp_Temperature(); Alarm(); //报警检测 }

else if(set_st==1)

{

BEEP=1; //关闭蜂鸣器 EX0=1; //开启外部中断0 EX1=1; //开启外部中断1

if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} }

else if(set_st==2) {

BEEP=1; //关闭蜂鸣器 EX0=1; //开启外部中断0 EX1=1; //开启外部中断1

if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} } } }

/*****END*****/ DS18B20.h:

#include

#define DQ P3_6 //定义DS18B20总线I/O /*****延时子程序*****/ void Delay_DS18B20(int num) {

while(num--) ; }

/*****初始化DS18B20*****/ void Init_DS18B20(void) {

unsigned char x=0;

DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时

DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14);

x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); }

/*****读一个字节*****/

unsigned char ReadOneChar(void) {

unsigned char i=0; unsigned char dat = 0;

for (i=8;i>0;i--) {

DQ = 0; // 给脉冲信号 dat>>=1;

DQ = 1; // 给脉冲信号 if(DQ)

dat|=0x80;

Delay_DS18B20(4); }

return(dat); }

/*****写一个字节*****/

void WriteOneChar(unsigned char dat) {

unsigned char i=0; for (i=8; i>0; i--) {

DQ = 0;

DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } }

/*****读取温度*****/ int ReadTemperature(void) {

unsigned char a=0; unsigned char b=0; int t=0; float tt=0;

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a;

tt=t*0.0625;

t= tt*10+0.5; //放大10倍输出并四舍五入

return(t); }

/*****END*****/

附录二元件清单及PCB图

数字温度计电路元器件清单 元器件名称 参数 单片机 89C52 晶体振荡器 12MHz 电容 电阻 数量 1 1 3 19 元器件名称 数码管 蜂鸣器 温度传感器 参数 DS18B20 数量 1 1 1 PCB图

因篇幅问题不能全部显示,请点此查看更多更全内容