学位论文基于at89s52的数字温度计设计.docx

上传人:b****8 文档编号:8994023 上传时间:2023-02-02 格式:DOCX 页数:27 大小:511.32KB
下载 相关 举报
学位论文基于at89s52的数字温度计设计.docx_第1页
第1页 / 共27页
学位论文基于at89s52的数字温度计设计.docx_第2页
第2页 / 共27页
学位论文基于at89s52的数字温度计设计.docx_第3页
第3页 / 共27页
学位论文基于at89s52的数字温度计设计.docx_第4页
第4页 / 共27页
学位论文基于at89s52的数字温度计设计.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

学位论文基于at89s52的数字温度计设计.docx

《学位论文基于at89s52的数字温度计设计.docx》由会员分享,可在线阅读,更多相关《学位论文基于at89s52的数字温度计设计.docx(27页珍藏版)》请在冰豆网上搜索。

学位论文基于at89s52的数字温度计设计.docx

学位论文基于at89s52的数字温度计设计

项目名称

基于AT89S52的数字温度计设计

 

目录

项目名称1

基于AT89S52的数字温度计设计1

第1章绪论4

1.1概述4

1.2数字温度计的特点与问题4

第2章设计方案5

2.1设计指标5

2.1.1检测范围5

2.1.2检测误差5

2.1.3系统反应速度5

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

2.3关键技术6

2.3.1单总线技术6

2.3.2单片机开发技术6

第3章具体设计与实现7

3.1系统总体设计7

3.2硬件设计8

3.2.1温度检测系统设计8

3.2.2单片机最小系统设计9

3.2.3显示系统设计9

3.2.4电源系统设计10

3.3软件设计10

3.3.1温度传感器驱动设计10

3.3.2显示驱动设计15

3.3.3开关控制设计18

3.3.4系统软件设计21

第4章系统集成与测试22

4.1软件调试22

4.2硬件调试23

4.3系统测试23

结论24

致谢25

参考文献26

附录127

附录228

第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温度数据

workTemper

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

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

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1