文档库

最新最全的文档下载
当前位置:文档库 > 基于STC89C52单片机的LED温度计设计

基于STC89C52单片机的LED温度计设计

自动化专业电子课程设计报告

题目: LED温度计设计(序号31 )

姓名

学号

指导教师:

评阅成绩等次:

电气信息工程系

2010-2011 第二学期

目录

1.、设计的任务与要求 (2)

1.1系统设计的背景 (2)

1.2理论基础 (2)

2、总体设计和系统框图 (2)

2.1温度采集模块 (3)

2.2温度显示模块 (3)

3、设计方案 (3)

3.1硬件系统设计 (3)

3.1.1供电电路设计 (3)

3.1.2复位电路 (4)

3.1.3晶振电路 (5)

3.1.4温度采集模块设计 (5)

3.1.5显示电路 (5)

3.2软件系统设计 (6)

3.2.1 DS18B20的读写时序 (6)

3.2.2程序流程图 (7)

4、系统仿真和调试 (9)

5、设计结果分析 (9)

6、设计总结和体会 (10)

7、参考文献 (10)

附录一:硬件原理图 (11)

附录二:proteus仿真图 (12)

附录三:程序清单 (12)

摘要:本文介绍了采用51系列单片机和DS18B20温度传感器,实现数字温度测量,用数码管把温度实时显示出来,温度以一位符号位两位整数位和一位小数位的形式显示。

本系统主要包括供电模块、单片机最小系统模块、DS18B20温度采集模块

和LED数码管显示模块。

关键词:51 DS18B20 LED

1.、设计的任务与要求

1.1系统设计的背景

温度的测量广泛的应用在工农业生产和社会生活中,由于工农业的发展要求温度的测量的精度和实时性提出了更高的要求,传统的水银温度计和热电偶等,存在测量不方便、精度低、采集和传输较复杂等缺点。本设计采用美国Dallas公司的DS18B20和stc89c52单片机构成温度测量系统,用LED数码管实时显示温度,具有更高的智能性和直观性。

1.2理论基础

要较好的设计出温度计,需要我们深入的了解DS18B20温度传感器的构造、接线、信息沟通,要较好的掌握51系列单片机的使用以及硬件搭建,LED数码管的显示原理以及与单片机的连接。要找出一个较好的温度采集方案,使得到的温度更加准确。

2、总体设计和系统框图

包括方案比较、方案论证、方案选择(以方框图的形式给出各方案,并简要说明)

为了以数字的形式来显示采集的温度我们需要以一个单片机来处理数据,由于对单片机的性能要求不是很高,我们采用51系列单片机来处理数据,系统总体方框图如图1。

基于STC89C52单片机的LED温度计设计

图1

2.1温度采集模块

方案一、采用热电偶,热电偶是利用热电效应实现温度测量的敏感元件,把温度信号转换成热电动势信号,需要将模拟的电信号转换成数字信号供单片机处理,我要需要用到AD转换芯片ADC0832,电路较为复杂且成本较高,热电偶如图2所示。

方案二、采用DS18B20温度传感器,DS18B20输出的量为数字量,只要按特定的时序读出数值就可获得温度数据,电路较为简单且成本较低,DS18B20如图3所示,所以选择方案二。

基于STC89C52单片机的LED温度计设计

基于STC89C52单片机的LED温度计设计

图2 热电偶图3 DS18B20

2.2温度显示模块

方案一、采用LCD1602液晶显示温度,液晶可以显示较多的字符,提供更多的信息,而且每次更新数据只需要更新一次,可以减少单片机的处理时间。

方案二、采用LED数码管显示,数码管显示的较清晰,且价格较便宜连接电路简单。虽然占用了单片机较多的时间,但本系统处理的任务较少,所以可以采用数码管显示。

3、设计方案

3.1硬件系统设计

51系列单片机性能稳定价格便宜功耗低,使用于在较低应用下的智能系统的设计。3.1.1供电电路设计

该单片机的正常工作电压为+5V,一种情况下可以由外界直接输入+5V电压比如USB 供电,还可以由干电池供电。考虑到这两种情况,供电电路设计如图4所以,一路可以直接输入+5V电,另一路经过7805稳压芯片稳压成+5V提供给单片机。

基于STC89C52单片机的LED温度计设计

图4 供电电路

3.1.2复位电路

复位是单片机的初始化操作,单片机启动运行时都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态。当MCS-51系列单片机的复位引脚RST出现两个机器周期以上的高电平时,单片机就执行复位操作。根据应用的要求,复位操作通常有两种基本形式:上电复位和手动复位。上电复位要求接通电源后,自动实现复位操作,手动

复位为按下按键实现复位操作,电路设计如图5所示。

基于STC89C52单片机的LED温度计设计

基于STC89C52单片机的LED温度计设计

图5复位电路图6晶振电路

3.1.3晶振电路

单片机晶振的作用是为系统提供基本的时钟信号,51单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越高处理速度越快,最小系统起振电容一般采用

15~33pF,电容越靠近晶振越好,晶振越靠近单片机越好,晶振电路如图6所示。

3.1.4温度采集模块设计

本系统采用DS18B20作为温度采集芯片,DS18B20通过一个单线接口发送或接收信息,因此在中央微处理器和DS18B20之间仅需一条连接线,每只DS18B20都有一个独特的片序列号,所以多只DS18B20可以同时连在一根单线总线上。DS1820 依靠一个单线端口通讯。在单线端口条件下,必须先建立ROM 操作协议,才能进行存储器和控制操作。因此,控制器必须首先提供下面 5 个ROM 操作命令之一:1)读ROM,2)匹配ROM,3)搜索ROM,4)跳过ROM,5)报警搜索。这些命令对每个器件的激光ROM 部分

进行操作,在单线总线上挂有多个器件时,可以区分出单个器件,同时可以向总线控制器指明有多少器件或是什么型号的器件。成功执行完一条ROM 操作序列后,即可进行存储器和控制操作,控制器可以提供 6 条存储器和控制操作指令中的任一条。一条控制操作命令指示DS1820 完成一次温度测量。测量结果放在DS1820 的暂存器里,用一条读暂存器内容的存储器操作命令可以把暂存器中数据读出。硬件电路设计如图7所示。

基于STC89C52单片机的LED温度计设计

图7 DS18B20硬件连接

3.1.5显示电路

我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示不同的字形。数码管又分为共阴极和共阳极两种,共阴极就是将八个LED的阴极连在一起,让其

接地,这样给任何一个LED的另一端高电平,它便能点亮。共阳极就是将八个LED的阳极连在一起。其原理图如图9所示。

基于STC89C52单片机的LED温度计设计

图9 LED原理图

3.2软件系统设计

3.2.1 DS18B20的读写时序

基于STC89C52单片机的LED温度计设计

图10 初始化过程复位和存在脉冲

基于STC89C52单片机的LED温度计设计

图11 控制器写时序

基于STC89C52单片机的LED温度计设计

图12 控制器读时序

3.2.2程序流程图

由于我们一个总线上只接了一个DS18B20所以我们不用进行序列号匹配。

开始DS18B20复位是否响应

Skip Rom

是Convert T

Delay

复位是否响应否否

Skip Rom

Read Scratchpad

判断温度正负

取反加1

温度为负计算出温度

温度为正

数码管显示

图13 系统流程图

4、系统仿真和调试

在仿真过程中温度由高到零下,然后又由零下调到零上,观察到数码管显示的温度可以很好的跟踪温度的变化。具有较好的灵活性和准确性。仿真过程中的两个截图如下。

基于STC89C52单片机的LED温度计设计

图14 仿真截图1

基于STC89C52单片机的LED温度计设计

图15 仿真截图2

5、设计结果分析

仿真过程中调节温度,数码管显示的温度可以很好的跟着变化,小数点后显示一位,可以显示正负温度,达到了预定的目标。

器件一览表如表1

器件名称数量

Stc89c52单片机1个

晶振11.0592MHZ 1个

30pf无极性电容2个

10uf有极性电容1个

按键1个

10K电阻2个

1K电阻1个

470Ω电阻8个

4位一体8段共阴数码管1个

DS18B20温度传感器1个

导线若干

6、设计总结和体会

通过对这一系统的设计,我们对以前所学的知识有了更深的了解,懂得了以前基础学习的重要性,在这一设计过程中我们查阅了大量地资料,并对以往所学进行了系统性的复习和总结。今后我们会更加注重基础知识的学习。设计过程中我们小组三人展开了密切的合作并明确了分工,其中xxx完成了硬件电路的分析设计和proteus7.0仿真环境的学习并很好的为本设计作好了仿真的工作,xxx为本设计绘制了protell99电路原理图和参加了仿真的部分设计工作,xxx学习和编写了在KEIL环境下的51单片机软件的设计,在设计过程中组内三人展开了热烈的讨论,遇到问题共同探讨,在指导老师的指导下,成功的完成了LED温度计的设计,取得了较好的效果。设计过程中我们采取了创新性的设计,我们并没有让LED一直都亮,而是采取了闪烁的形式,不仅降低了功耗,而且延长了LED数码管的寿命。

本系统还可以采用干电池供电,从而系统具有较好的可携带性。本系统中我们的设计是采取有线的设计,单片机和DS18B20是在一起的,由于时间仓促,如果近一步研究,我们想把有线的设计改成无线的设计,我们把温度传感器和单片机之间以无线的方式相连,把较多温度传感器的数据采集到主控单片机,可以检测到更多的温度数据,对于温度的控制和分析具有更高的价值和科学性。

7、参考文献

[1] 康华光电子技术基础模拟部分(第五版)高等教育出版社

[2] 康华光电子技术基础数字部分(第五版)高等教育出版社

[3] 胡寿松自动控制原理第五版科学出版社

[4] 田裕鹏,姚恩涛,李开宇传感器原理科学出版社2007-9-1

[5] 闫玉德,俞虹51单片机原理与应用:C语言版机械工业出版社2004-7-1

[6] 刘荣科51单片机C语言应用与开发北京航空航天大学出版社2010-9-1

附录一:硬件原理图

基于STC89C52单片机的LED温度计设计

该原理图在protell99se下绘制

附录二:proteus仿真图

基于STC89C52单片机的LED温度计设计

附录三:程序清单

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit dq=P2^7;

///////////////////////////////

uchar code table[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x40,0x00};

uchar code tabled[]={0xbf,0x86,0xdb,0xcf, //带点的数字显示tabled[10]只显示一个小数点

0xe6,0xed,0xfd,0x87,0xff,0xef,0x80};

uchar temp_date[2];

uchar tdate ;

uchar tdated;

uchar flag;

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

void delay(uint z)

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

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

void delay600(void) //误差 -1.0416********us

{

unsigned char a,b;

for(b=61;b>0;b--)

for(a=3;a>0;a--);

}

void delay60(void) //误差 -0.555555555556us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=29;a>0;a--);

}

void delayd(uint t)

{

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

}

void ds_reset(void)

{

bit temp=1 ;

while(temp)

{

while(temp)

{

dq=1;_nop_();_nop_();

dq=0;

delay600();

dq=1;

delay60();

temp=dq;

}

delayd(67);

temp=~dq;

}

dq=1;

}

void write_byte(uchar date)

uchar i;

for(i=0;i<8;i++)

{

dq=1;_nop_();_nop_();

dq=0;_nop_();_nop_();_nop_();_nop_();

dq=(date&0x01);

date/=2;

delayd(5); //9

}

dq=1;

}

uchar read_byte(void)

{

uchar i;

uchar temp;

for(i=0;i<8;i++)

{

dq=1;_nop_();

temp>>=1;

dq=0;_nop_();_nop_();_nop_();_nop_();

dq=1;_nop_();_nop_();

if(dq==1)

temp|=0x80;

delayd(5); //9

}

dq=1;

return temp;

}

void get_temp(void)

{

ds_reset();

write_byte(0xcc);

write_byte(0x44);

delayd(50); //20

ds_reset();

write_byte(0xcc);

write_byte(0xbe);

delayd(20); //100

temp_date[0]=read_byte();

temp_date[1]=read_byte();

}

void led_display(uchar wei,uchar tnum)

{

if(wei==1)

{P2|=0x0f;

P1=table[tnum];

P2&=0xfe;

delay(3);

}

else if(wei==2)

{P2|=0x0f;

P1=table[tnum]|0x80;

P2&=0xfd;

delay(3);

}

else if(wei==3)

{P2|=0x0f;

P1=table[tnum];

P2&=0xfb;

delay(3);

}

else if(wei==4)

{P2|=0x0f;

P1=table[tnum];

P2&=0xf7;

delay(4);

}

}

void temp()

{

uchar tdate1; uchar tdate2;uchar tdated1,tdated2;

uint tdata1,tdata2;

get_temp();

if((temp_date[1]&0xf8)!=0)

{

flag=1;

tdata1=temp_date[1]*256+temp_date[0];

tdata1=~tdata1+1;

temp_date[1]=tdata1/256;

temp_date[0]=tdata1%256;

}

else flag=0;

tdate1=((temp_date[1]&0x07)<<4)+((temp_date[0]&0xf0)>>4);

tdated1=temp_date[0]&0x0f;

get_temp();

if((temp_date[1]&0xf8)!=0)

{

tdata1=temp_date[1]*256+temp_date[0];

tdata1=~tdata1+1;

temp_date[1]=tdata1/256;

temp_date[0]=tdata1%256;

}

tdate2=((temp_date[1]&0x07)<<4)+((temp_date[0]&0xf0)>>4);

tdated2=temp_date[0]&0x0f;

tdate=(tdate1+tdate2)/2; //tdate 为整数位

tdated=(tdated1+tdated2)/2; //tdated为小数位

}

void temp_show(void)

{

led_display(2,tdate%10);

led_display(3,(tdate/10)%10);

led_display(1,tdated);

if(flag==1) led_display(4,10);

if(flag==0) led_display(4,11) ;

}

void main(void)

{

uchar i;

while(1)

{

temp();

for(i=0;i<100;i++)

temp_show();

for(i=0;i<30;i++)

{

P1=0x00;

delay(10);

}

}

}