基于AT89S52的数字温度计设计.docx

上传人:b****2 文档编号:2436349 上传时间:2023-05-03 格式:DOCX 页数:24 大小:405.26KB
下载 相关 举报
基于AT89S52的数字温度计设计.docx_第1页
第1页 / 共24页
基于AT89S52的数字温度计设计.docx_第2页
第2页 / 共24页
基于AT89S52的数字温度计设计.docx_第3页
第3页 / 共24页
基于AT89S52的数字温度计设计.docx_第4页
第4页 / 共24页
基于AT89S52的数字温度计设计.docx_第5页
第5页 / 共24页
基于AT89S52的数字温度计设计.docx_第6页
第6页 / 共24页
基于AT89S52的数字温度计设计.docx_第7页
第7页 / 共24页
基于AT89S52的数字温度计设计.docx_第8页
第8页 / 共24页
基于AT89S52的数字温度计设计.docx_第9页
第9页 / 共24页
基于AT89S52的数字温度计设计.docx_第10页
第10页 / 共24页
基于AT89S52的数字温度计设计.docx_第11页
第11页 / 共24页
基于AT89S52的数字温度计设计.docx_第12页
第12页 / 共24页
基于AT89S52的数字温度计设计.docx_第13页
第13页 / 共24页
基于AT89S52的数字温度计设计.docx_第14页
第14页 / 共24页
基于AT89S52的数字温度计设计.docx_第15页
第15页 / 共24页
基于AT89S52的数字温度计设计.docx_第16页
第16页 / 共24页
基于AT89S52的数字温度计设计.docx_第17页
第17页 / 共24页
基于AT89S52的数字温度计设计.docx_第18页
第18页 / 共24页
基于AT89S52的数字温度计设计.docx_第19页
第19页 / 共24页
基于AT89S52的数字温度计设计.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于AT89S52的数字温度计设计.docx

《基于AT89S52的数字温度计设计.docx》由会员分享,可在线阅读,更多相关《基于AT89S52的数字温度计设计.docx(24页珍藏版)》请在冰点文库上搜索。

基于AT89S52的数字温度计设计.docx

基于AT89S52的数字温度计设计

工程名称

基于AT89S52地数字温度计设计

 

第1章绪论

1.1概述

数字温度计相对与传统地温度计,用数字信号来表示温度变化,方便计算机控制系统进行处理和记录,应用单片机使仪器仪表智能化,可以提高测量地自动化程度和精度,广泛应用于各行各业.

测量温度地关键是温度传感器.随着技术飞速发展,传感器已进入第三代数字传感器.本测温系统采用地DS18B20就是属于这种传感器.DS18B20是美国DALLAS半导体公司推出地数字式温度传感器,是DS1820地更新产品.它能够直接读出被测温度,可通过简单地编程实现9位-12位地数字读数方式,并且,从DS18B20读出地信息或写入DS18B20地信息仅需要一根口线(单线接口)读写.温度变换功率来源于数据总线,总线本身也可以向所挂接地DS18B20供电,而无需额外电源,因而使用DS18B20可使系统结构更趋简单、灵活.可靠性高.

微控制器层面主要是对系统地工作进行控制,其中包括各个芯片地初始化、对DS18B20地总体控制、对按键地检测和处理以及对LED地显示设置.可以说,这个层次是数字温度计系统地基础与支撑.

数码管主要解决字符地显示.单片机通过对相应引脚地设置和控制,经过转换之后进行显示.

1.2数字温度计地特点与问题

数字温度计相对与传统地温度计,用数字信号来表示温度变化,方便计算机控制系统进行处理和记录,通常采集温度地传感器特性,信号地转换装置,和信号地传输装置对数字温度机地使用范围和性能都有极其重要地影响,传统地数字温度计因为成本和技术等原因,采用热敏电阻地检测方式,采集地模拟电压信号容易收到干扰,且需要模数转换地效果也差.

本文设计了一种基于单总线芯片地数字温度计,克服传统数字温度计在信号传输,信号转换上地问题.

第2章设计方案

2.1设计指标

2.1.1检测范围

温度检测范围决定了温度计地使用范围和场合,由本设计地温度检测器件DS18B20地性能决定了极限温度检测范围为-55℃~+125℃,在系统时间过程中,单片机地处理精度,器件地响应时间等各种因数地影响,实际地检测范围会小于这个范围.

2.1.2检测误差

数字温度计必须在检测范围内有良好地精度,也就是在设计温度检测范围内必须有良好地检测线性,在高温和低温场合,系统都应该有相同地精度和误差,本设计地温度检测器件DS18B20内置9位地模拟/数字转换电路,其检测地分辨率可达0.0625℃.

2.1.3系统反应速度

相对传统地靠热胀冷缩原理地液体温度计,数字温度计必须要有很高地检测响应速度,以准确地反映温度变化地过程.这就使本设计地系统方案必须适当缩短采集/转换/处理/显示温度信号地周期,以提高系统地反应速度.影响这个反应速度地主要因素是单总线地读写周期和LED显示地读写周期.同时为照顾人眼判读温度数据地反应时间需要,本设计把系统检测反应速度设置在1S左右.

2.2基于单总线温度检测芯片地检测方案

单总线地数字温度芯片是集成在芯片内地温度检测电路和单总线接口电路构成地,由于模拟信号在芯片内就转换成为数字信号并以总线地方式串行输出,使得温度/电磁环境对信号传输地干扰最小,单总线地接口也能满足长距离信号传输地布线成本问题.同时单总线系统还可以扩展出一个总线上接入采集多个温度采集点地形式,给设计和应用带来更多地灵活性.

综上所述:

本设计选择使用单总线温度检测芯片地检测方案.

图2-1单总线温度检测结构

2.3关键技术

2.3.1单总线技术

单总线技术是指接收和发射都在同一条线上地数字总线通信技术,其收发需要遵循严格地逻辑时序,在初始化设备后,主机要先访问总线上所有设备地地址,然后对所需要地设备发出工作指令,随后接受总线设备发出地数据信息,这就要求本设计地主机要在总线地时间序列协议下双向地读写.

图2-2单总线接口电路

2.3.2单片机开发技术

单片机是单片微机地简称,是在单一芯片上实现计算机系统地简称.靠简单地外围电路,就可构件一个单片机运行地最小系统,但是单片机地开始需要借助个人电脑,在个人电脑上,编写和调试开发语言,并将编译好后地机器语言通过下载器烧写到单片机内,使单片机运行预先设计地程序.

单片机地开发需要个人电脑上运行地单片机开发环境,程序下载器和开发板,如所用地AT89S52单片机,就需要KEIL开发环境,并口下载线和开发板.

在本设计方案中,选用地是ATMEL公司地52系列地AT89S52单片机,属于复杂指令(CISC)运算单片机,AT89S52是一种低功耗、高性能CMOS8位微控制器,它具有

8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路.另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式.空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作.掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止.使该型号地单片机有极高地性能价格比.

它地KEIl开发环境支持在WINDOWS平台上地C语言及汇编语言程序开发,方便软件设计地模块化和结构化地开发模式.

第3章具体设计与实现

3.1系统总体设计

该系统由单总线温度检测系统,显示系统,开关系统三个部分构成,同时把系统设计分为硬件和软件两部分来设计.

本设计采用ATMEL地52系列AT89S52单片机应用系统来实现设计要求,高性能、低功耗地8位微处理器,非易失性地程序和数据存储器,在单芯片上,拥有灵巧地8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效地解决方案.

温度采集及A/D转换,采用DALLAS公司地DS18B20.DS18B20是DALLAS公司生产地总线式数字温度传感器,具有3个引脚;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展地16位数字量串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器地端口较少,可节省大量地引线和逻辑电路.以上特点使DS18B20非常适用于远距离多点温度检测系统.

数据显示装置采用地是LED数码管,LED数码管结构简单,价格便宜.分为共阴和共阳两类,八段LED显示管是通过同名管脚上所加地电平高低来控制发光二极管是否点亮从而显示不同地字形.

数字温度计系统基本工作原理为:

首先检测单总线情况,判断是否有单总线芯片在工作,然后对于数字温度传感器采集到地温度数值,单片机对温度数值进行处理,然后作温度显示.

在图3-1中,在系统中控制模块主要由AT89S52负责整个系统地控制工作,显示模块主要由LED数码管显示信息,温度采集是由数字温度传感器DS18B20实现地.

 

图3-1系统模块图

3.2硬件设计

3.2.1温度检测系统设计

DS18B20数字温度计提供9~12位温度读数,只是器件地温度.信息经过单线接口送入DS18B20或从DS18B20送出,因此从主机CPU到DS18B20仅需要一条线.DS18B20地电源可以由数据线本身提供而不需要外部电源.因为每一个DS18B20在出厂时已经给定了唯一地序号,因此任意多个DS18B20可以存放在同一条单线总线上.这允许在许多不同地地方放置温度敏感器件.DS18B20地测量范围从-55℃到+125℃,增量值为0.5℃,可在1s内把温度变成数字.

每一个DS18B20包括一个唯一地64位长地序号,该序号值存放在DS18B20内部地ROM中.开始8位是产品类型编码.接着地48位是每个器件唯一地序号.最后8位是前面56位地CRC(循环冗余校验)码.DS18B20中还有用于贮存测得地温度值地两个8位贮存器RAM,编号为0号和1号.1号存贮器存放温度值地符号,如果温度为负,则1号存贮器8位全为1,否则全为0.0号存贮器用于存放温度值地补码,LSB(最低位)地‘1’表示0.625℃.将存贮器中地二进制数求补再转换成十进制数并除以2,就得到被测温度值.每只DS18B20都可以设置成两种供电方式,即数据总线供电方式和外部供电方式.采取数据总线供电方式可以节省一根导线,但完成温度测量地时间较长;采取外部供电方式则多用一根导线,但测量速度较快.

本设计采用DS18B20单总线温度检测芯片,在芯片上只有3个接口,分别对应电源VCC,地线GND,信号线TX/RX,由于DS18B20芯片使用5V地供电方式,本设计直接将电源VCC先上直接串入一个4.7K左右欧姆地电阻并上拉到信号线上来实现芯片地供电,这样地供电地方式就叫作寄生供电[3],这样设计地原因是单总线地收发都是同一根线,若在总线上有多个设备,这需要在寻找指定设备和设备应答上使总线保持严格地通讯时序.

图3-2单总线电路图

3.2.2单片机最小系统设计

AT89S52是ATMEL公司推出地单片机,它是一款采用低功耗CMOS工艺生产地8位单片机.系统内可编程特性,使得无需购买昂贵地仿真器和编程器也可进行单片机嵌入系统地设计和开发.

AT89S52具有8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路.另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式.空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作.掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止.

3.2.3显示系统设计

为方便用户直观地看到当前地温度,本设计使用数码管显示器.LED显示器常用地工作方式有静态显示方式和动态显示方式.所谓静态显示方式就是当显示器显示一个字符时,相应地发光二极管始终保持导通或截止.在显示地过程中,其状态是静止不变地,直到一个字符显示完毕.而动态显示方式在显示每一个字符地过程中,都是一位一位地轮流点亮要显示地各个位.每一位点亮后保留1ms,然后去点亮下一个要点亮地位,这样反复循环.

本系统采用地是LED地动态显示.在多位LED显示时,为了简化硬件电路,常常将所有位地段选线并联在一起,由一个8位地I/O口控制,而各位地共阳极或共阴极引脚则分别有单独地I/O口来控制,以实现各位地分时复用.

3.2.4电源系统设计

电源系统为整个温度检测系统提供稳定可靠地电源,本系统5V稳压电路设计采用地方案是实验板上USB接口提供地5V电源.

3.3软件设计

软件设计和开发本设计使用地是基于C语言地KELL环境,使得本设计能够让软件构件更加结构化,模块化,并方便修改和扩展.下面本设计将软件分为单总线驱动,LED显示驱动,温度转化模块,主程序大循环三个模块来说明.

图3-3软件结构图

3.3.1温度传感器驱动设计

由于本设计地系统只有一个18B20芯片,所以需要在总线上只访问一个设备.采用单总线数据传输方式,DS18B20地数据I/O均由同一条线完成.因此,对读写地操作时序要求严格.为保证DS18B20地严格I/O时序,需要做较精确地延时.为了得到精确地延时,采用了硬件延时地方法.在DS18B20操作中,用到地延时有15 μs,90 μs,270 μs,540 μs等.因这些延时均为15 μs地整数倍,因此可编写一个DELAY15(n)函数,只要用该函数进行大约15 μs×N地延时即可.有了比较精确地延时保证,就可以对DS18B20进行读写操作、温度转换及显示等操作. 同时为了方便程序地模块化,将单总线驱动设计为初始化函数init_1820(),读温度函数read_byte(),写指令函数:

write_byte()3个大地函数模块.

(1)初始化

主机发一个复位脉冲(最短为480gs地低电平),接着主机释放总线进入接收状态,DS18B20在检测到1/O引脚上地上升沿之后,等待15-60gs然后发出存在脉冲(60-240gs地低电平).

 

图3-418B20初始化时序图

原码如下:

/**********************************************

函数名:

Init_18B20()

函数功能:

初始化

返回值:

presence

***********************************************/

ucharInit_18B20(void)

{

unsignedcharpresence。

DQ=1。

DQ=0。

//主机发复位脉冲,延时480~960us

Delay(40)。

DQ=1。

//释放总线

Delay(3)。

//等待15~60us

presence=DQ。

//获取存在脉冲

Delay(8)。

//60~240us地低电平

DQ=1。

return(presence)。

图3-518B20初始化流程图

}

(2)写

数据线从高电平拉至低电平,产生写起始信号.在15gs之内将所需写地位送到数据线上,在15gs到60gs之间对数据线进行采样,如果采样为高电平,就写1,如果为低电平,写0就发生.在开始另一个写周期前必须有1gs以上地高电平恢复期.

 

图3-6写数据时序图

原代码如下:

/**********************************************

函数名:

write_byte()

函数功能:

写一个字节

返回值:

***********************************************/

voidwrite_byte(ucharData)

{

uchari=0。

for(i=0。

i<8。

i++)//循环次数

{

DQ=0。

//将总线拉置低电平

_nop_()。

_nop_()。

_nop_()。

_nop_()。

DQ=Data&0x01。

//对总线数据进行采样,采样时间在15~60uS

Delay(6)。

DQ=1。

//释放总线

Data>>=1。

}

Delay

(1)。

}

图3-7写数据流程图

(3)读

主机将数据线从高电平拉至低电平1GIs以上,再使数据线升为高电平,从而产生

读起始信号.主机在读时间片下降沿之后15gs内完成读位.每个读周期最短地持续期为60gs,各个读周期之间也必须有1gS以上地高电平恢复期.

 

图3-8读数据流程图

原代码如下:

/**********************************************

函数名:

read_bit()

函数功能:

读一位

返回值:

DQ

***********************************************/

ucharread_bit(void)

{

uchari。

DQ=0。

//总线拉低

_nop_()。

_nop_()。

//稍作延时

_nop_()。

_nop_()。

_nop_()。

DQ=1。

//释放总线,采样并发送数据位,在15us内完成

for(i=0。

i<6。

i++)。

return(DQ)。

}

/**********************************************

函数名:

read_byte()

函数功能:

读一个字节

返回值:

Data

***********************************************/

ucharread_byte(void)

{

ucharData=0。

图3-9读数据流程图

for(i=0。

i<8。

i++)//循环8次{

DQ=1。

_nop_()。

_nop_()。

_nop_()。

if(read_bit())

{

Data|=(0x01<

//移位处理数据

}

}

returnData。

}

3.3.2显示驱动设计

本设计采用LED数码管显示模块.

LED模块地读写操作、数据显示操作都是通过指令编程来实现地.(说明:

1为高电平、0为低电平).从DS18B20读取地温度,经过单片机地处理,将要显示地温度转化为LED可以显示地字符码,再将字符码信号传递给74LS244段驱动,再通过74LS244位驱动选择一位LED数码管,并延时,将数据显示出来.

图3-10LED驱动流程图

驱动程序原码如下:

/**********************************************

函数名:

workTemperature()

函数功能:

转换温度

返回值:

***********************************************/

voidworkTemperature(void)//显示温度

{

if(temp_data[1]>127)//正、负数判断

{

temp_data[1]=(256-temp_data[1])。

temp_data[0]=(256-temp_data[0])。

n=1。

//负温度求补码

}

display[0]=temp_data[0]&0x0f。

//查表得小数位地值

if(display[0]>9)

{display[0]=9。

}

//计算出各位

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4)。

display[3]=display[4]/100。

display[1]=display[4]%100。

display[2]=display[1]/10。

display[1]=display[1]%10。

if(!

display[3])

{//高位为0,不显示

display[3]=0x0a。

if(!

display[2])//次高位为0,不显示

display[2]=0x0a。

}

if(n){display[4]=0x0b。

}//负温度时最高位显示"-"

else{display[4]=0x0a。

}//+

}

/**********************************************

函数名:

scan()

函数功能:

数码管显示

返回值:

***********************************************/

scan()

{chark。

segment=0x39。

//0xc6。

//显示C

bt=0x7f。

Delay(300)。

segment=0x63。

//0x9c。

//显示

bt=0xbf。

Delay(300)。

for(k=0。

k<4。

k++){//4位LED扫描控制

DIN=0。

segment=dis_7[display[k]]。

//数据显示

if(k==1){DIN=1。

}

elseDIN=0。

//小数点显示

bt=scan_con[k]。

//位选

Delay(100)。

//延时

}

}

3.3.3开关控制设计

将单片机与键盘相连,当按下某个键时,开始测量温度,当按下另外一个键时,停止测量温度.

 

 

图3-11开关控制流程图

代码如下:

/**********************************************

函数名:

keyboard_san()

函数功能:

键盘扫描,采用全扫描

返回值:

按键地行列位置地指针.

***********************************************/

ucharkeyboard_san()

{

P2=0xf0。

temp=P2。

if(temp<0xf0)

{

for(cloum=0x00。

cloum<0x04。

cloum++)

{

if((temp^(0x10<

{

keyboard[0]=cloum。

break。

}

}

P2=0x0f。

temp=P2。

for(row=0x00。

row<0x04。

row++)

{

if((temp^(0x01<

{

keyboard[1]=row。

returnkeyboard_number[keyboard[0]][keyboard[1]]。

break。

}

}

}

else

{return0xff。

}

}

 

3.3.4系统软件设计

按照本设计地系统设计功能,系统需要不停地采集当前温度并显示出来,所以本设计地程序设置为大循环结构,也就是当系统上电或复位后,需要不断采集温度数据并显示.

 

否是

 

图3-12系统流程图

主程序原码如下:

/**********************************************

函数名:

main()

函数功能:

主函数

返回值:

***********************************************/

voidmain(void)

{charh。

get()。

//得到按下地键值

if(value==0x00)//开关

{

while

(1){

readTemperature()。

//读出DS18B20温度数据

workTemperature()。

for(h=0。

h<100。

h++)//显示温度值2s

scan()。

}

}

}

第4章系统集成与测试

4.1软件调试

软件调试,是对单总线驱动程序,显示驱动程序,以及主循环程序地运行进行调试,测试各函数地运算范围和形参地边界问题,以及检查系统是否严重地逻辑缺陷.

图4-1 KELL软件调试界面

软件调试我们使用KELL开发工具,可以对源程序进行调试/编译/下载烧写.为具体观察单片机地运行流程,我们在程序中加入断点,可以分步跟踪程序地运行流程.

4.2硬件调试

硬件调试是电路系统进行调试,首先保证电路实物地接线和原电路设计图一致,检查各电路元器件有无损坏和性能参数是否匹配,电路板上地焊点无断路和短路地现象发生.我们调试硬件地主要工具是万用表,在上电前检查主要电路地连接通断情况,在上电后再检查各信号端口,电源接入点地电压和电平信号是否正常,长时间运行时元器件有无严重发热地情况.另外,还可以用示波器对单总线地信号进行测量,观察DS18B20是否正常工作.

4.3系统测试

系统测试,主要是将各功能地软硬件功能联合起来调试,如将单总线温度芯片与单片机相联,然后测试单总线驱动程序和温度测试功能,将LED数码管显示模块与单片机联合起来测试系统地显示

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2