资源描述
(完整版)基于单片机的数字温度计设计60543
单片机课程设计报告
题 目:
基于单片机的数字温
度计设计
教 学 系:
***
年 级、专 业:
2010级电子科学和技
术(1)班
姓 名 学 号:
***
***
***
指 导 教 师:
***
完 成 时 间:
2012年6月
基于单片机的数字温度计设计
作者:*** 指导老师: ***
(年级专业:2010级电子科学和技术一班)
摘 要:本文介绍一种基于AT89S52单片机的一种温度测量及报警电路,该电路采用DS18B20作为温度监测元件,测量范围—55℃-~+125℃,使用4位LED模块显示,能通过键盘设置温度报警上下限.正文着重给出了软硬件系统的各部分电路,介绍了集成温度传感器DS18B20的原理,AT89S52单片机功能和使用。该电路设计新颖、功能强大、结构简单。
关键词:温度测量 DS18B20 AT89S52
Abstract : The introduction of a cost-based AT89S52 MCU a temperatur measurement circuits, the circuits used DS18B20 high—precision temperatur sensor , measuring scope -55℃—~+125℃,can use the keybord set the warning limitation, the use of four bits seven segments LED that can be display the current temperature. The paper focuses on providing a software and hardware system components circuit, introduced the theory of DS18B20, the founctions and applications of AT89S52 。This circuit design innovative, powerful, can be expansionary strong.
Key Words : Temperatur measurement DS18B20 AT89S52
目 录
1前言······························································3
2方案设计··························································3
3 系统的硬件设计····················································4
3.1 主控制器························································4
3。2 显示电路························································5
3。3 温度传感器工作原理··············································6
3。4 温度传感器接口电路··············································9
4 系统的软件设计····················································9
4.1 主程序··························································9
4.2 温度测量························································9
4。2.1 初始化DS18B20················································9
4。2。2 等待应答信号·················································10
4.2.3 DS18B20读字节···············································10
4。2.4 DS18B20写字节················································11
4。2。5 启动温度测量·················································12
4.2.6 读取测量结果·················································13
4。2.7各算法流程图·················································14
4。3 数码管显示·····················································15
5 系统的测试和总结·················································16
5。1 测试时的图片···················································16
5.2总结···························································17
参考文献···························································18
致谢词·····························································19
附录1原理图·······················································20
附录2源程序清单···················································20
1 前言
数字温度计(Digital Thermometer)简称DTM,它是采用数字化测量技术,把连续的温度值转换成不连续、离散的数字形式并加以显示的仪表。传统的温度计功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字温度计,由于精度高、抗干扰能力强,可扩展性强、集成方便得到了广泛的使用。温度是许多监控系统中的一个重要参数。DS18B20直接把温度信息转换成相应的数字信号。数据采集、处理模块主要由AT89S52单片机构成,完成温度数据的读取和显示。
本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对AT89S52单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。该设计控制器使用ATMEL公司的AT89S52单片机,测温传感器使用DALLAS公司DS18B20,用数码管来实现温度显示。
2方案设计
本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:
l 利用温度传感器(DS18B20)测量某一点环境温度
l 测量范围为—55℃~+125℃,精度为±0。5℃
l 用数码管进行实际温度值显示
采用AT89S52单片机P3 .5口控制温度传感器DS18B20的温度测量,以四位数码感形式输出测量温度,原理图如下图2.1所示:
图2。1 DS18B20和单片机接口
图2。2 总体设计方框图
3 系统的硬件设计
3。1 主控制器
AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,和工业80C51 产品指令和引脚完 全兼容.片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使得AT89S52为众多嵌入式控制使用系统提 供高灵活、超有效的解决方案。AT89S52具有以下标准功能:
8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路.另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作.掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止.8 位微控制器 8K 字节在系统可编程 Flash AT89S52
图3.1 时钟电路和复位电路
3.2 显示电路
显示采用4位数码管,图3。2.1为数码管段驱动,图3。2。2为数码管位驱动,图3.2.3为温度显示电路
图3。2。1 数码管段驱动
图3.2。2 数码管位驱动
图3.2.3温度显示电路
3.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引脚。当工作于寄生电源时,此引脚必须接地。其电路图 3。3.2所示。
图 3。3。1外部封装形式 图3.3.2传感器电路图
DS18B20的测温原理如图3.3。3所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将—55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器 1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据.
图3。3.3 DS18B20测温原理图
在正常测温情况下,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
3.4 温度传感器接口电路
图3。4.1温度传感器接口电路
4 系统的软件设计
4.1 主程序
/*-—-—-------------- 主函数 —-—---—-—-—-——-—---—*/
void main()
{
while(1)
{
Convert(); //调用启动温度转换函数
RdTemp(); //调用读取温度值函数
}
}
4。2 温度测量
4。2。1.初始化DS18B20
/*-—--———----——-— 初始化DS18B20 —-——-—-——---—--—*/
void TxReset()
{
uint i;
DQ=0; //发送复位脉冲
i=100;
while(i〉0) i--; //拉低900us
DQ=1; //释放总线
i=4;
while(i〉0) i--;
}
4。2。2.等待应答信号
/*—--—-——-—--——— 等待DS18B20应答 -————-—-——-----*/
void RxWait()
{
uint i;
while(DQ); //等待15—60us
while(~DQ); //DS18B20发出存在脉冲60-240us
i=4;
while(i>0) i—-;
}
4.2.3.DS18B20读字节
/*-———-—-——--————- 读取一位数据 —————-—---——----*/
bit RdBit()
{
uchar i;
bit b;
DQ = 0; //读开始1us
i++;
DQ = 1; //产生读时间隙15us
i++;
i++;
b = DQ; //读位
i = 8;
while(i〉0) i——; //等待60us
DQ = 1; //释放总线
return b;
}
/*--—-—--————-—-—— 读取字节数据 --—---—--———-———*/
uchar RdByte()
{
uchar i,j,d;
d=0;
for(i=0;i〈8;i++) //各位由低向高读出DS18B20
{
j=RdBit();
d=(j<<7)|(d>〉1);
}
return d;
}
4.2.4.DS18B20写字节
/*-—————---—-——-—— 写入字节数据 —---—-—---———---*/
void WrByte(uchar d)
{
uint i;
uchar j;
bit btmp;
for(j=0;j〈8;j++) //各位由低向高写入DS18B20
{
btmp=d&0x01;
d=d〉〉1;
if(btmp) //写1
{
DQ=0; //延时15us
i++;
i++;
DQ=1; //写1时隙不低于60u
i=8;
while(i>0) i—-;
}
else //写0
{
DQ=0;
i=8;
while(i>0) i—-; //保持低电平60us到120us
DQ=1; //释放总线
i++;
i++;
}
}
}
4.2.5.启动温度测量
/*——-—-—-———-———-- 启动温度测量——————-———---———*/
void Convert()
{
uint i;
Delay(125); //延时1ms
TxReset(); //初始化DS18B20
RxWait(); //等待DS18B20答应
Delay(125); //延时
WrByte(0xcc); //跳过ROM命令
WrByte(0x44); //温度转换命令
for(i=0;i〈250;i++) //延时1s
Display();
}
4.2。6.读取测量结果
/*-—-——-—-——-——--—- 读取温度值 —---——-—-————----*/
void RdTemp(void)
{
short int temp;
uint x;
bit flag = 1;
TxReset(); //初始化DS18B20
RxWait(); //等待DS18B20应答
Delay(125); //延时
WrByte(0xcc); //跳过ROM命令
WrByte(0xbe); //读暂存存储器命令
templow = RdByte(); //温度值低字节,低4位为小数
temphigh = RdByte(); //温度值高字节
temp = (temphigh 〈< 8) | templow; //温度为16位补码
if(temp〈0) //负温度
{
flag = 0;
temp = ~temp + 1;
}
tempzheng = temp >> 4; //温度值整数
x = temp & 0x000f;
tempxiao = (x*10)/16; //温度值小数
if(flag) //正温度
disp[0] = tempzheng/100; //百位
else //负温度
disp[0] = 16; //负号
disp[1] = (tempzheng%100)/10; //十位
disp[2] = tempzheng%10; //个位
disp[3] = tempxiao; //小数
}
4。2.7.各算法流程图
初始化
调用显示子程序
1S到?
初次上电
读出温度值温度计算处理显示数据刷新
发温度转换开始命令
N
Y
N
Y
Y
发DS18B20复位命令
发跳过ROM命令
发读取温度命令
读取操作,CRC校验
9字节完?
CRC校验正?确?
移入温度暂存器
结束
N
N
Y
图 4.2。7。1 主程序流程图 图4。2.7。2 读温度流程图
发DS18B20复位命令
发跳过ROM命令
发温度转换开始命令
结束
温度数据移入显示寄存器
十位数0?
百位数0?
十位数显示符号百位数不显示
百位数显示数据(不显示符号)
结束
N
N
Y
Y
图4.2。7。3 温度转换流程图 图4.2.7.5显示数据刷新流程图
开始
温度零下?
温度值取补码置“—”标志
计算小数位温度BCD值
计算整数位温度BCD值
结束
置“+”标志
N
Y
图4.2。7.4 计算温度流程图
4.3 数码管显示
/*-—-——-—----———-- 数码管显示 ———-———-—-——-—---*/
void Display()
{
uchar i,j;
j=0x08;
for(i=0;i<4;i++)
{
P1=j; //数码管位码输出
LOCK=1; //打开锁存
if(i==2) P0=led[disp[i]]|0x01; //显示小数点
else P0=led[disp[i]]; //数码管段码输出
LOCK=0; //关闭锁存
j=j>>1; //调整位码
Delay(125);
P0=0x00;
}
}
5 系统的测试和总结
5。1 测试时的图片
图5。1.1温度传感器图
5.1。2测试时室内温度显示图 5。1.3测试时手握住传感器时的温度显示
5。2 总结
通过此次课程设计,使我更加扎实的掌握了有关基于单片机的数字温度计设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍所在,
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决问题,锻炼实践能力的重要环节,是对我们学生实际工作能力的具体训练和考察过程,随着科学技术发展的越来越快,单片机已经成为当今计算机使用中空前活跃的领域,在生活中可以说无出不在,因此学习和使用单片机的开发技术是十分重要的。回顾起此次课程设计,至今我仍然感触良多,的确,从理论到实践,在整整一个星期里,可以说苦多甜少,但是我却学到了很多很多的东西,同时还巩固了学的知识,通过这次课程设计使我懂得了理论和实践相结合很重要的道理,只有理论是远远不够的,只有把理论知识和实践结合起来,从实践中得出理论知识,才能真正为社会服务,从而提高至今的实际的动手能力和独立思考能力.在设计的过程中遇到的问题,可以说是困难重重,在做的过程中难免会遇到各种各样的问题,同时在设计中发现自己的不足之处,等等,通过这次课程设计之后,一定可以把以前所学的知识理解通透。
参考文献
[1]谢维成.单片机原理和使用及C51程序设计。北京:清华大学出版社,2009
[2]李朝青.单片机原理及接口技术[M].北京:北京航空航天大学出版社,2005
[3]马忠梅.单片机的C语言使用程序设计(第4版)[M]。 北京:北京航空航天大学出版社,2007
[4]江世明。基于Proteus的单片机使用技术[M]. 北京:电子工业出版社,2009
[5]彭伟.单片机C语言程序设计实训100例[M]。 北京:电子工业出版社,2009
[6]张毅刚。新编MCS—51单片机使用设计(第3版)[M]。哈尔滨:哈尔滨工业大学出版社,2008
致 谢 词
在我写本论文的过程中,周聘麟、蒋春雷老师给我提供了许多资料,并对实践中出现的问题给予耐心的解答,完稿之后在百忙之中仔细阅读,给出修改意见。周老师、蒋老师爱岗敬业,治学严谨,思维严密,平易近人是我十分尊敬的老师,在此对他表示感谢.
在本文录入的过程中,得到了其他同学的帮助,在这里对他们也表示的感谢!
附 录1 原理图
附 录2 源程序清单
#include 〈reg52。h>
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
uchar code led[]={ 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,
0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x02,0x00 }; //数码管码表
uchar disp[4]={1,2,3,4}; //数码管显示缓冲区
//数码管位选P1低四位,段选P0
sbit LOCK=P1^4; //74573锁存端
sbit DQ=P3^5; //DS18B20数据端
uchar templow; //温度值低字节
uchar temphigh; //温度值高字节
char tempzheng; //温度值整数
char tempxiao; //温度值小数
void Delay(uint x);
void Display();
void TxReset();
void RxWait();
bit RdBit();
uchar RdByte();
void WrBit(bit b);
void WrByte(uchar d);
void Convert();
void RdTemp();
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
/*——-—-—-—-——————-—— 主函数 ———-—----—--------—-*/
void main()
{
while(1)
{
Convert(); //调用启动温度转换函数
RdTemp(); //调用读取温度值函数
}
}
/*-—-—-——-—-————- 初始化DS18B20 -—---————-——————*/
void TxReset()
{
uint i;
DQ=0; //发送复位脉冲
i=100;
while(i〉0) i--; //拉低900us
DQ=1; //释放总线
i=4;
while(i>0) i--;
}
/*-——--—---——--- 等待DS18B20应答 ——--—----—-—--—*/
void RxWait()
{
uint i;
while(DQ); //等待15-60us
while(~DQ); //DS18B20发出存在脉冲60—240us
i=4;
while(i>0) i——;
}
/*---—-—-—-—------ 读取一位数据 ----————---——-—-*/
bit RdBit()
{
uchar i;
bit b;
DQ = 0; //读开始1us
i++;
DQ = 1; //产生读时间隙15us
i++;
i++;
b = DQ; //读位
i = 8;
while(i>0) i-—; //等待60us
DQ = 1; //释放总线
return b;
}
/*———-—-——————-—-— 读取字节数据 -----——-————----*/
uchar RdByte()
{
uchar i,j,d;
d=0;
for(i=0;i<8;i++) //各位由低向高读出DS18B20
{
j=RdBit();
d=(j<<7)|(d〉〉1);
}
return d;
}
/*-——————-—--——--- 写入字节数据 ---——----—--—---*/
void WrByte(uchar d)
{
uint i;
uchar j;
bit btmp;
for(j=0;j〈8;j++) //各位由低向高写入DS18B20
{
btmp=d&0x01;
d=d〉〉1;
if(btmp) //写1
{
DQ=0; //延时15us
i++;
i++;
DQ=1; //写1时隙不低于60u
i=8;
while(i>0) i--;
}
else //写0
{
DQ=0;
i=8;
while(i〉0) i—-; //保持低电平60us到120us
DQ=1; //释放总线
i++;
i++;
}
}
}
/*——--—-———-—--—-- 启动温度转换 --—-————-——-————*/
void Convert()
{
uint i;
Delay(125); //延时1ms
TxReset(); //初始化DS18B20
RxWait(); //等待DS18B20应答
Delay(125); //延时
WrByte(0xcc); //跳过ROM命令
WrByte(0x44); //温度转换命令
for(i=0;i<250;i++) //延时1s
Display();
}
/*-—--—----—---—-—— 读取温度值 -——---——--——--—--*/
void RdTemp(void)
{
short int temp;
uint x;
bit flag = 1;
TxReset(); //初始化DS18B20
RxWait(); //等待DS18B20应答
Delay(125); //延时
WrByte(0xcc); //跳过ROM命令
WrByte(0xbe); //读暂存存储器命令
templow = RdByte(); //温度值低字节,低4位为小数
temphigh = RdByte(); //温度值高字节
temp = (temphigh <〈 8) | templow; //温度为16位补码
if(temp〈0) //负温度
{
flag = 0;
temp = ~temp + 1;
}
tempzheng = temp 〉〉 4; //温度值整数
x = temp & 0x000f;
tempxiao = (x*10)/16; //温度值小数
if(flag) //正温度
disp[0] = tempzheng/100; //百位
else //负温度
disp[0] = 16; //负号
disp[1] = (tempzheng%100)/10; //十位
disp[2] = tempzheng%10; //个位
disp[3] = tempxiao; //小数
}
/*-——----—-—-———---—-— 延时 -————-——---—------—*/
void Delay(uint x)
{
uint i;
for(i=x;i>0;i-—);
}
/*—-——----——--—-—— 数码管显示 ————-—-—----—-———*/
void Display()
{
uchar i,j;
j=0x08;
for(i=0;i〈4;i++)
{
P1=j; //数码管位码输出
LOCK=1; //打开锁存
if(i==2)
P0=led[disp[i]]|0x01; //显示小数点
else P0=led[disp[i]]; //数码管段码输出
LOCK=0; //关闭锁存
j=j〉>1; //调整位码
Delay(125);
P0=0x00;
}
}
29
展开阅读全文