单片机课程设计论文

发布时间:2011-10-18 21:01:25

单片机课程设计论文

姓名:耿宇

学号:20081610B036

姓名:薛刚

学号:20081601B007

班级:08电子信息工程

学院:信息科学技术学


摘要

本论文主要讲述了数字温度计的设计过程,主要包括硬件设计和程序设计。硬件主要包括以AT89C51单片机为主要控制电路、温度采集电路、显示电路等。温度采集传感器采用的是美国Datlas半导体公司(现已并入MAXIM公司)于20世纪90年代新推出的一种串行总线技术。该技术只需要一根信号线(将计算机的地址线、数据线、控制线合为一根信号线)便可完成串行通信。控制电路的核心器件就是AT89C51单片机,显示电路采用8位共阴极LED数码管。由单片机控制传感器的读写来测量环境的温度,再通过与单片机连接的数码管将温度显示出。

由于采用了DS18B20作为侧位元器件,这使得本温度计与传统的温度计相比,硬件电路相对有减少。因此本温度计成本降低,使用起来更加的方便。

关键词:单片机、显示电路、温度传感器DS18B20

1. 设计任务及方案分析

一、任务要求

设计内容用单片机、温度传感器等器件实现温度采集, 要求采集的温度精确到0.1ºC

设计要求:1.硬件设计。掌握单片机、温度传感器、

显示电路等相关原理与知识;画出原理图

2、软件设计

3、用PROTEUS软件对硬件系统进行仿真

4、两人一组做实物

5、按照毕业论文要求交一份设计报告

二、设计总体方案及方案论证

按照系统的设计要求,本系统主要分为三个部分:主控制器AT89C51,温度传感器DS18B20及驱动显示电路。

方案比较

1、 测温元器件

方案一:由于本电路是测温电路,因此可以采用热敏电阻来感应温度的变化,再根据其随温度变化的感应电阻阻值的变化来测得电流的变化进而计算出此时的温度值,不过这种方案需要设计模数转换电路,这会使得电路设计起来比较麻烦。

方案二、采用温度传感器作为温度采集原件,再通过单片机来控制其工作从而实现对传感器的控制和温度的读取,这使得读取温度非常的方便,电路也较前一个方案更加的简单,操作和设计起来都更加的容易。

故比较两种方案第二种方案更合适。

2、控制器件

  这个种类较多,可以根据实际情况选择,这里选择AT89C52单片机。

3、显示器件

由于液晶显示器较贵,所以这里选用8位共阴极数码管作为显示器

件,并且该器件使用起来也十分的方便。

三、实现方案简介

DS18B20采用外接电源方式工作,一线测温的一线与AT89C52P3.0连接并加上上拉电阻使其工作,测出的数据存直接显示在LED显示器上。总体方案框图如下图所示。

2. 芯片功能简介

AT89C51的功能简介

1 AT89C51芯片简介

AT89C52是美国ATMEL公司生产的低电平,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的只读程序存储器(PEROM)256 bytes的随机存取数据存储器(RAM ),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)Flash存储单元,32个可编程I/O口线, 316位定时/计数器, 低功耗空闲和掉电模式。功能强大的AT89C52单片机适合于许多较为复杂控制应用场合。

2 引脚功能说明

1VCC:电源电压

2GND:

3 P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8TTL逻辑门电路,对端口P0写“1”时可作为高阻抗输入端用。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(8)和数据总线复位,在访问期间激活内部上拉电阻。

4P1:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4TTE逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(ILL)

AT89C51不同之处是,P1.0P1.1还可分别作为定时/计数器2的外部计数输入(P 1.0/T2)和输入(P 1.1/T2EX ),参见

Flash编程和程序校验期间,P1接收低8位地址。

P1.0P1.1的第二功能

5P2:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(ILL)

在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX @RI指令)时,P2口输出P2锁存器的内容。

6P3:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(ILL)

P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表4-2所示。

7RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。

P3口的第二功能

8/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH ) 端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存端状态。

端为高电平(VCC)CPU则执行内部程序存储器中的指令。

Flash存储器编程时,该引脚加上+12V的编程允许电源VPP,当然这必须是该器件是使用12V编程电压VCC

9XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。

10XTAL2:振荡器反相放大器的输出端。

11)数据存储器:

AT89C52256个字节的内部RAM,80H-FFH128个字节与特殊功能寄存器(SFR)地址是重叠的,也就是高128

字节的RAM和特殊功能寄存器的地址是相同的,但在物理上它们是分开的。

当一条指令访问7FH以上的内部地址单元时,指令中使用的寻址方式是不同的,也即寻址方式决定是访问高128字节。

RAM还是访问特殊功能寄存器。如果指令是直接寻址方式则为访问特殊功能寄存器。

12)中断:

AT89C52共有6个中断向量:两个外中断(INT0INT1),3个定时器中断(定时器0, 1, 2)和串行口中断。

13)时钟振荡器:

AT89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1XTAL2分别是该放大器的输入端和输出端。

这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路参见图4-1a)图所示。

外接石英晶体(或陶瓷谐振器)及电容C1C2接在放大器的反馈回路中构成并联振荡电路,对外接电容C1C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性,如果使用石英晶体,我们推荐电容使用30pF10pF,而如果使用陶瓷谐振器,建议选择40pFl0pF

用户也可以采用外部时钟。采用外部时钟的电路如图4-1b)图所示。这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。

由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。

DS18B20功能简介

1、芯片简介

(1) 适应电压范围更宽,电压范围:3.0 V5.5V,在寄生电源方式下可由数据线供电。

(2) 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(3) DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。

(4) 测温范围-55~+125,在-10+85时精度为±0.5

(5) 可编程的分辨率为912位,对应的可分辨温度分别为0.50.250.1250.0625,可实现高精度测温。

(6) 9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。

(7) 测量结果直接输出数字温度信号,以一线总线串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。

(8) 负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

2DS18B20外形和内部结构

DS18B20内部结构如图所示,主要由4部分组成:64ROM、温度传感器、非挥发的温度报警触发器THTL、配置寄存器。

DS18B20的管脚排列

DS18B20引脚定义:

(1) 64ROM

ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B2064位序列号均不相同。64ROM的循环冗余校验码(CRC=X8X5X41)。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 DS18B20中的温度传感器完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0.0625/LSB形式表达,其中S为符号位。DS18B20温度值格式表如下所示。

这是12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+25.0625的数字输出为0191H,-25.0625的数字输出为FF6FH

DS18B20温度值格式表

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8

2高低温报警触发器THTL

DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器THTL和结构寄存器。

3)配置寄存器

该字节各位的意义如下表所示。

配置寄存器结构

低五位一直都是1TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1R0用来设置分辨率,如下表1所示(DS18B20出厂时被设置为12位)。

高速暂存器是一个9字节的存储器。开始两个字节包含被测温度的数字量信息;第345字节分别是THTL、配置寄存器的临时拷贝,每一次上电复位时被刷新;第678字节未用,表现为全逻辑1;第9字节读出的是前面所有8个字节的CRC码,可用来保证通信正确。高速暂存器RAM结构图如下表2所示。

1 温度分辨率设置表

3、 DS18B20的工作时序

DS18B20的一线工作协议流程是:初始化ROM操作指令存储器操作指令数据传输。其工作时序包括初始化时序、写时序和读时序。

4-7 DS18B20暂存寄存器分布

主机控制DS18B20完成任何操作之前必须先初始化,即主机发一复位脉冲(最短为480us的低电平),接着主机释放总线进入接收状态,DS18B20在检测到I/O引脚上的上升沿之后,等待15-60us然后发出存在脉冲(60-240us的低电平)

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

读时间片:主机将数据线从高电平拉至低电平1us以上,再使数据线升为高电平,从而产生读起始信号。主机在读时间片下降沿之后15us

完成读位。每个读周期最短的持续期为60us,各个读周期之间也必须有1us以上的高电平恢复期。

4 DS18B20与单片机的典型接口设计

MCS51系列单片机为例,画出了DS18B20与微处理器的典型连接。图(a)中DS18B20采用寄生电源方式,其VDDGND端均接地,图(b)中DS18B20采用外接电源方式,其VDD端用3V5.5V电源供电。

(a) 寄生电源工作方式 (b) 外接电源工作方式

5DS18B20的各个ROM命令

(1) Read ROM [33H]

这个命令允许总线控制器读到DS18B208位系列编码,惟一的序列号的8CRC码。只有在总线上存在单只DS18B20的时候才能用这个命令。如果总线上有不止一个从机,当所有从机试图同时传送信号时就会发生数据冲突(漏极开路连在一起形成“与”的效果)。

2Match ROM [55H]

这是个匹配ROM命令,后跟64ROM序列,让总线控制器在多点总线上定位一只特定的DS18B20。只有和64ROM序列完全匹配的DS18B20才能响应随后的存储器操作。所有和64ROM序列不匹配的从机都将等待复位脉冲。这条命令在总线上有单个或多个器件时都可以使用。

(3) Skip ROM [0CCH]

这个命令允许总线控制器不用提供64ROM编码就使用存储器操作命令,在单点总线情况下,可以节省时间。如果总线上不止一个从机,在命令之后紧跟着发一条读命令,由于多个从机同时传信号。总线上发生数据冲突(漏极开路连在一起形成“与”的效果)。

4Search ROM [0F0H]

当一个系统初次启动时,总线控制器并不知道单线总线上有多少个器件或它们的64ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。

5Alarm Search [0ECH]

这条命令的流程和Search ROM相同。然而,只有在最近一次测温后遇到符合报警条件的情况,DS18B20才会响应这条命令。报警条件定义为温度高于TH或低于TL。只要DS18B20不掉电,报警状态将一直保持,直到再一次测得的温度值达不到报警条件。

6Write Scratchpad[4EH]

这个命令向DS18B20的暂存器THTL中写入数据。可以在任何时刻发出复位命令来中止写入。

7Read Scratchpad[0BEH]

这个命令读取暂存器的内容。读取将从第1字节开始,一直进行下去,直到第9CRC)字节读完。如果不想读完所有字节,控制器可以在任何时刻发出复位命令来中止读取。

8Copy Scratchpad[48H]

这个命令把暂存器的内容拷贝到DS18B20EROM存储器里,即把温度报警触发器字节存入非易失性存储器里。如果控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于把暂存器拷贝到E存储器,DS18B20就会输出一个0,如果拷贝结束的话,DS18B20输出1。如果使用寄生电源,总线控制器必须在这条命令后立即启动强上拉,并最少保持10ms

9Convert T[44H]

这个命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS18B20保持等待状态。如果控制器在这条命令之后跟着发出时间隙,而DS18B20有忙于做时间转换的话,DS18B20将在总线上输出一个0,若温度转换完,则输出1。如果使用寄生电源,总线控制器必须在发出这条命令后立即启动强上拉,并最少保持500ms以上时间。

10Read E [0B8H]

这条命令把 触发器里的值拷贝回暂存器。这种拷贝操作在DS18B20

上电时自动执行,这样一上电暂存器里马上存在有效的数据了。若在这条命令之后发出读数据隙,器件会输出温度转换忙的标识:0为忙,1为完成。

11Read Power Supply[0B4H]

若把这条命令发给DS18B20后发出读时间隙,器件会返回它的电源模式:0为寄生电源,1为外部电源。

3. 硬件系统电路设计

整个电路由主控器AT89C51控制,与其相连的分别是一个温度传感器DS18B20和一个数码管。传感器感知周围的温度并将感知的温度传给单片机,在通过相应的接口将温度传给数码管显示。这样就实现了温度的采集与显示。整个电路的电路图如下图所示:

4. 软件编程调试及性能分析

一、整个软件的主流程图如下图所示:

二、主程序

#include "reg51.h"

#define uchar unsigned char

#define unit unsigned int

sbit DQ=P3^0;

sbit p20=P2^0;

sbit p21=P2^1;

sbit p22=P2^2;

sbit p23=P2^3;

code uchar tab[]={0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xf8,0x80,0x90};

code uchar tab1[]={0x40,0x79,0x24,0x30,0x19,

0x12,0x02,0x78,0x00,0x10};

uchar a,b,t,h,c;

uchar bai,shi,ge,xiao;

void delay(unsigned int i)

{

while(i--);

}

//初始化函数

bit int_DS18B20(void)

{

unsigned char x=0;

DQ=1;

delay(8);

DQ=0;

delay(52);

DQ=1;

delay(6);

x=DQ;

delay(20);

return(x);

}

//读一个字节

unsigned char read(void)

{

unsigned char i=0,j=0;

unsigned char dat=0;

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

{

DQ=0;

j++;

dat>>=1;

DQ=1;

j++;j++;

if(DQ)

dat|=0x80;

delay(5);

}

return(dat);

}

//写一个字节程序

write(unsigned char dat)

{

unsigned char i=0;

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

{DQ=0;

DQ=dat&0x01;

delay(6);

DQ=1;

dat>>=1;

}

delay(5);

}

//启动转换

void int_(void)

{

while(int_DS18B20());

write(0xCC);

write(0x44);

}

void main(void)

{

unit count=0;

P2=0x00;

int_();

DQ=1;

delay(2200);

for(count=0;count<1000;count++)

{p20=1;

P0=tab[0];

delay(20);

p20=0;

p21=1;

P0=tab[0];

delay(20);

p21=0;

p22=1;

P0=tab[0];

delay(20);

p22=0;

p23=1;

P0=0xc6;

delay(20);

p23=0;

}

while(1)

{delay(120);

while(int_DS18B20());

write(0xcc);

write(0xbe);

a=read();

b=read();

if(b>127)//根据温度的正负值选择相应的显示程序

{a=~a;

b=~b;

a=a>>4;

t=b<<4;

t=t|a;

t+=1;

shi=t/10;

ge=t-shi*10;

for(count=0;count<123;count++)

{if(t>=10)

{p20=1;

P0=0xbf;

delay(20);

p20=0;

p21=1;

P0=tab[shi];

delay(20);

p21=0;

p22=1;

P0=tab1[ge];

delay(20);

p22=0;

p23=1;

P0=0xc6;

delay(20);

p23=0;

}

else

{p20=0;

p21=1;

P0=0xBF;

delay(20);

p21=0;

p22=1;

P0=tab1[ge];

delay(20);

p22=0;

p23=1;

P0=0xc6;

delay(20);

p23=0;

}

}

}

else

{count=0;

a=a>>4;

t=b<<4;

t=t|a;

bai=t/100;

shi=(t-100*bai)/10;

ge=t-(bai*100+shi*10);

for(count=0;count<123;count++)

{if(t>=100){

if(bai)

{p20=1;

P0=tab[bai];

delay(20);

p20=0;

}

else

p20=0;

if(shi)

{ p21=1;

P0=tab[shi];

delay(20);

p21=0;

}

p21=0;

p22=1;

P0=tab1[ge];

delay(20);

p22=0;

p23=1;

P0=0xc6;

delay(20);

p23=0;

}

else

{if(shi)

{ p20=1;

P0=tab[shi];

delay(20);

p20=0;

}

else

p20=0;

p21=1;

P0=tab1[ge];

delay(20);

p21=0;

p22=1;

P0=tab[xiao];

delay(20);

p22=0;

p23=1;

P0=0xc6;

delay(20);

p23=0;

}

}

}

int_();

}

}

程序的仿真图

参考文献: 《基于Proteus8051单片机实例教程》

《单片机原理及接口技术》

DS18B20数字温度计论文

单片机课程设计论文

相关推荐