基于AT89S52单片机的数字温度计设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于AT89S52单片机的数字温度计设计

一引言

在生活和生产中,经常要用到一些测温设备,但是传统的测温设备具有制作成本高、硬件电、和软件设计复杂等缺点。基于AT89S52单片机的数字温度计具有制作简单、成本低、读数方便、测温范围广和测温准确等优点,应用前景广阔。

二项目要求

基于AT89S52单片机的数字温度计设计具体要求如下:

(1)温度值用LED显示。

(2)围为-30℃~100℃,且测量误差不得大于±0.5℃。

(3)成本的体积、质量要尽可能小。

三系统设计

1 框图设计

根据设计要求分析,基于AT89S52单片机的数字温度计设计由AT89S52单片机控制器、电源、显示电路、温度传感器、复位电路和时钟电路组成,系统框图如图1所示。电源给整个电路供电,显示电路显示温度值,时钟电路为AT89S52提供时钟频率。传感器采用美国DALLAS半导体公司生产的一种智能温度传感器DS18B20,其测温范围为-55~125℃,最高分辨率可达0.0625℃,完全符合设计要求。

图一基于AT89S52单片机的数字温度计系统框图

2 知识点

本项目需要通过学习和查阅资料,掌握和了解如下知识:

●+5V电源原理及设计。

●单片机复位电路工作原理及设计。

●单片机晶振电路工作原理及设计。

●按键电路的设计。

●数码管的特性及使用。

●DS18B20的特性及使用。

●74LS07的特性及使用。

●AT89S52单片机引脚。

●单片机C语言程序设计。

四硬件设计

1 电路原理图

控制器使用单片机AT89S52,测温传感器使用DS18B20,用4位共阳极LED数码管以动态扫描法实现温度显示,电路图可见仿真图所示。

2 元件清单

基于AT89S52单片机的数字温度计元件清单如表1所示。

五软件设计

1 程序流程图

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20测量的当前温度值,温度测试每1S进行一次。这样可以在1S之内测量一次被测温度,其程序流程图如图3所示。

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校

温度转换命令子程序主要是发温度转换开始命令,采用12位分辨率转换时间约为

750ms。程序设计中采用1s显示程序延时等待转换的完成。计算温度子程序将RAM中读

取值进行BCD码地转换运算,并进行温度值正负的判定,显示数据刷新子程序主要是对显

示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。

2 程序清单

基于AT89S52单片机的数字温度计程序清单如下:

#include "reg51.h"

#include "intrins.h" //延时函数用

#define Disdata P1 //段码输出口

#define discan P3 //扫描口

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^7; //温度输入口

sbit DIN=P1^7; //LED小数点控制

uint h;

uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08, 0x09,0x09};//温度小数部分用查表法

uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};

/* 共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */ uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; // 列扫描控制字

uchar data temp_data[2]={0x00,0x00}; // 读出温度暂放

uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用

void delay(uint t)//11微秒延时函数

{

for(;t>0;t--);

}

scan()//显示扫描函数

{

char k;

for(k=0;k<4;k++) //四位LED扫描控制

{

Disdata=dis_7[display[k]];

if(k==1){DIN=0;}

discan=~scan_con[k];delay(90);discan=0x00;

}

}

ow_reset(void)//18B20复位函数

{

char presence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();

DQ=0;

delay(50); // 550us

DQ=1;

delay(6); // 66us

presence=DQ; // presence=0继续下一步

}

delay(45); //延时500us

presence = ~DQ;

}

DQ=1;

}

void write_byte(uchar val)//18B20写命令函数

{

uchar i;

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

{

DQ=1;_nop_();_nop_();

DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //最低位移出

delay(6); //66us

val=val/2; //右移一位

}

DQ = 1;

delay(1);

}

uchar read_byte(void)//从总线上读取一个字节

{

uchar i;

uchar value = 0;

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

{

DQ=1;_nop_();_nop_();

value>>=1;

DQ = 0; //

_nop_();_nop_();_nop_();_nop_(); //4us

DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us

if(DQ)value|=0x80;

delay(6); //66us

}

DQ=1;

return(value);

}

read_temp()//读出温度函数

{

相关文档
最新文档