51单片机温度传感器课程设计要点Word格式.docx

上传人:b****2 文档编号:4192043 上传时间:2023-05-02 格式:DOCX 页数:20 大小:507.64KB
下载 相关 举报
51单片机温度传感器课程设计要点Word格式.docx_第1页
第1页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第2页
第2页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第3页
第3页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第4页
第4页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第5页
第5页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第6页
第6页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第7页
第7页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第8页
第8页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第9页
第9页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第10页
第10页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第11页
第11页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第12页
第12页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第13页
第13页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第14页
第14页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第15页
第15页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第16页
第16页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第17页
第17页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第18页
第18页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第19页
第19页 / 共20页
51单片机温度传感器课程设计要点Word格式.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

51单片机温度传感器课程设计要点Word格式.docx

《51单片机温度传感器课程设计要点Word格式.docx》由会员分享,可在线阅读,更多相关《51单片机温度传感器课程设计要点Word格式.docx(20页珍藏版)》请在冰点文库上搜索。

51单片机温度传感器课程设计要点Word格式.docx

4K字节可编程闪烁存储器 

寿命:

1000写/擦循环 

数据保留时间:

10年 

全静态工作:

0Hz-24Hz 

三级程序存储器锁定 

128*8位内部RAM 

32可编程I/O线 

两个16位定时器/计数器 

5个中断源 

可编程串行通道 

低功耗的闲置和掉电模式 

片内振荡器和时钟电路

3.3管脚说明

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 

口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:

口管脚 

备选功能 

P3.0 

RXD(串行输入口) 

P3.1 

TXD(串行输出口) 

P3.2 

/INT0(外部中断0) 

P3.3 

/INT1(外部中断1) 

P3.4 

T0(记时器0外部输入) 

P3.5 

T1(记时器1外部输入) 

P3.6 

/WR(外部数据存储器写选通) 

P3.7 

/RD(外部数据存储器读选通) 

P3口同时为闪烁编程和编程校验接收一些控制信号.

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,

ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时, 

ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;

当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

4.温度传感器模块

▲图3DS18B20相关资料

4.1DS18B20原理与分析

DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。

与传统的热敏电阻相比,它能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

可以分别在93.75ms和750ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

因而使用DS18B20可使系统结构更趋简单,可靠性更高。

他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。

以下是DS18B20的特点:

(1)独特的单线接口方式:

DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(2)在使用中不需要任何外围元件。

(3)可用数据线供电,电压范围:

+3.0~+5.5V。

(4)测温范围:

-55-+125℃。

固有测温分辨率为0.5℃。

(5)通过编程可实现9-12位的数字读数方式。

(6)用户可自设定非易失性的报警上下限值。

(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。

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

DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;

高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。

器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。

计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。

其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。

温度/℃

二进制表示

十六进制表示

+125

0000011111010000

07D0H

+85

0000010101010000

0550H

+25.0625

0000000110010000

0191H

+10.125

0000000010100001

00A2H

+0.5

0000000000000010

0008H

0000000000001000

0000H

-0.5

1111111111110000

FFF8H

-10.125

1111111101011110

FF5EH

-25.0625

1111111001101111

FE6FH

-55

1111110010010000

FC90H

▲图4 一部分温度对应值表

另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。

系统对DS18B20的各种操作按协议进行。

操作协议为:

初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

4.2DS18B20温度传感器与单片机的接口电路

DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。

另一种是寄生电源供电方式,如图4所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。

当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。

采用寄生电源供电方式时VDD端接地。

由于单线制只有一根线,因此发送接口必须是三态的。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。

DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。

该协议定义了几种信号的时序:

初始化时序、读时序、写时序。

所有时序都是将主机作为主设备,单总线器件作为从设备。

而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。

数据和命令的传输都是低位在先。

5.软件设计

系统程序主要包括主程序、读出温度子程序、温度转换子程序、计算温度子程序、显示等等。

5.1主程序

主要功能是完成DS18B20的初始化工作,并进行读温度,将温度转化成为压缩BCD码并在显示器上显示传感器所测得的实际温度。

5.2读出温度子程序

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写。

其程序流程图1如下图所示。

▲图5 程序流程图1

5.3温度转换命令子程序

温度转换命令子程序主要是发温度转换开始命令,当采用12位分辩率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。

流程图图2如下

▲图6 程序流程图2

5.4计算温度子程序

计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。

流程图3如下:

▲图7 程序流程图3

6.完整程序如下:

#include<

reg52.h>

intrins.h>

typedefunsignedcharuint8;

#defineuintunsignedint

#defineucharunsignedchar

sbitDQ=P3^3;

//定义DQ引脚为P3.3

ucharcodeBw[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

//百位编码

ucharcodeXsw[16]={0x30,0x31,0x31,0x32,0x33,0x33,0x34,0x34,0x35,0x36,0x36,0x37,0x38,0x38,0x39,0x39};

//小数位编码

sbitRS=P2^0;

sbitRW=P2^1;

sbitEN=P2^2;

sbitBUSY=P0^7;

ucharwendu;

uchartemp_g,temp_d;

unsignedcharcodeword1[]={"

Temperature:

"

};

voiddelay(uintxms)

{uinti,j;

for(i=xms;

i>

0;

--i)

for(j=110;

j>

--j);

}

voidDelayus(intt)//在11.059MHz的晶振条件下调用本函数需要24μs,然后每次计数需16μs

{ints;

for(s=0;

s<

t;

s++);

}//等待繁忙标志

voidwait(void)

{P0=0xFF;

do

{RS=0;

RW=1;

EN=0;

EN=1;

}while(BUSY==1);

EN=0;

}//写数据

voidw_dat(uint8dat)

{

wait();

P0=dat;

RS=1;

RW=0;

EN=1;

}//写命令

voidw_cmd(uint8cmd)

P0=cmd;

RS=0;

}//发送字符串到LCD

voidw_string(uint8addr_start,uint8*p)

w_cmd(addr_start);

while(*p!

='

\0'

{

w_dat(*p++);

}

}//初始化1602

voidInit_LCD1602(void)

w_cmd(0x38);

//16*2显示,5*7点阵,8位数据接口

w_cmd(0x0c);

//显示器开、光标开、光标允许闪烁

w_cmd(0x06);

//文字不动,光标自动右移

w_cmd(0x01);

//清屏

ucharReset()//完成单总线的复位操作。

uchard;

DQ=0;

//将DQ线拉低

Delayus(29);

//保持480μs.复位时间为480μs,因此延时时间为(480-24)/16=28.5,取29μs。

DQ=1;

//DQ返回高电平

Delayus(3);

//等待存在脉冲.经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16=2.875,取3μs。

d=DQ;

//获得存在信号

Delayus(25);

//等待时间隙结束

return(d);

//返回存在信号,0=器件存在,1=无器件

voidwrite_bit(ucharbitval)//向单总线写入1位值:

bitval

//将DQ拉低开始写时间隙

if(bitval==1)

DQ=1;

//如果写1,DQ返回高电平

Delayus(5);

//在时间隙内保持电平值,

//Delayus函数每次循环延时16μs,因此Delayus(5)=5*16+24=104μs

}

voidds18write_byte(charval)//向单总线写入一个字节值:

val

uchari;

uchartemp;

for(i=0;

i<

8;

i++)//写入字节,每次写入一位

{

temp=val>

>

i;

temp&

=0x01;

write_bit(temp);

}ucharread_bit()//从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义的Delayus()函数,而采用一个for()循环来实现延时。

//将DQ拉低开始读时间隙

//然后返回高电平

3;

i++);

//延时15μs

return(DQ);

//返回DQ线上的电平值

uchards18read_byte()//从单总线读取一个字节的值

ucharvalue=0;

i<

i++)

{//读取字节,每次读取一个字节

if(read_bit())

value|=0x01<

<

//然后将其左移

Delayus(6);

return(value);

intReadtemperature()//如果单总线节点上只有一个器件则可以直接掉用本函数。

如果节点上有多个器件,为了避免数据冲突,应使用MatchROM函数来选中特定器件。

uchartemp_d,temp_g,k,get[2],temp;

Reset();

ds18write_byte(0xcc);

//跳过ROM

ds18write_byte(0x44);

//启动温度转换

ds18write_byte(0xbe);

//读暂存器

for(k=0;

k<

2;

k++)

get[k]=ds18read_byte();

temp_d=get[0];

//低位

temp_g=get[1];

//高位

if((temp_g&

0xf0)==0xf0)//正负号判断

temp_d=~temp_d;

if(temp_d==0xff)//保证-48(1111110100000000)、-32和-16显示正常

temp_d=temp_d+0x01;

//00000000

temp_g=~temp_g;

//00000010

temp_g=temp_g+0x01;

//00000011

else

{temp_d=temp_d+0x01;

}

w_cmd(0xc5);

w_dat(Xsw[temp_d&

0x0f]);

//查表得小数位的值

temp=((temp_d&

0xf0)>

4)|((temp_g&

0x0f)<

4);

w_cmd(0xc1);

w_dat(0x2d);

//负号

else//正数

w_dat(Bw[temp/100]);

returntemp;

main()

Init_LCD1602();

w_string(0x80,word1);

while

(1)

wendu=Readtemperature();

temp_g=wendu%100/10+'

0'

;

//这里要特别注意啊少了%100就差很多

temp_d=wendu%10+'

w_cmd(0xc2);

delay

(2);

w_dat(temp_g);

w_dat(temp_d);

w_cmd(0xc4);

w_dat(0x2e);

//小数点

w_cmd(0xc6);

w_dat(0xdf);

//温度符号

w_dat(0x43);

7.总结与体会

课程设计给我们带来的不只是一个项目的一系列学习,更重要的是我在这个设计过程中所锻炼的能力和培养的一种精神。

在本次课程设计中,比起上学期,更多是靠自己,去查阅资料,去寻找解决办法,还有就是和同学们互相帮助学习。

我们这次课题虽然不难,但要去做好它,让它实现正确的功能,也少不了不断的研究和探索,可能废寝忘食,可能绞尽脑汁。

不仅是现在的学习,在以后的生活中工作也,以这样一种态度和精神去完成自己的梦想,实现自己的价值。

8.参考文献

[1]《单片机原理及应用》(第二版)张毅刚彭喜元彭宇编著

[2]《ProtelDxp2004简明教程和考证指南》电子工业出版社

[3]《《C单片机原理及应用》》

[4]《数字电路基础技术》康华光第五版

[5]数字温度传感器DS18B20的原理与应用[EB/OL]

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

当前位置:首页 > 医药卫生 > 基础医学

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

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