基于51单片机的数字温度计设计Word文档格式.docx
- 文档编号:5242522
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:21
- 大小:602.85KB
基于51单片机的数字温度计设计Word文档格式.docx
《基于51单片机的数字温度计设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的数字温度计设计Word文档格式.docx(21页珍藏版)》请在冰点文库上搜索。
P3.0口的第二功能是串行数据的输入口(RXD),p3.1口的第二功能是串行数据的输出口(TXD)。
4.2.2根据设计要求,画出外部系统结构图
电路总图见附录一
图4.2.2外部系统结构图
4.3温度传感器模块
4.3.1DS18B20温度传感器介绍
DS18B20是美国Dallas半导体公司生产的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易兼容微处理器等优点,可直接将温度传感器转化成串行数字信号供处理器处理。
4.3.2DS18B20温度传感器特性
(1)适应电压范围宽,电压范围在3.0~5.5V,在寄生电源方式下可由数据线供电。
(2)独特的单线接口方式,他与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通信。
(3)支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
(4)在使用中不需要任何外围元件,全部传感元件及转换电路形如多只三极管的组成电路。
(5)测温范围-55°
C~+125°
C,在-10°
C~+85°
C时精度为正负0.5°
C。
(6)可编程分辨率为9~12位,对应的可分辨温度分别为0.5°
C,0.25°
C,0.125°
C,0.0625°
C,可实现高精度测温。
(7)在9位分辨率时,最多在93.75ms内把温度转换数字;
12位分辨率时,最多在750ms内把温度值转换为数字,显然速度很快。
(8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰能力。
CRC即循环冗余校验码(CyclicRedundancyCheck):
是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
(9)负压特性。
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
4.3.3引脚介绍
DS18B20实物图如图所示。
图4.3.3DS18B20实物图
4.3.4DS18B20与单片机的连接
主机可以是微控制器,从机可以是单总线器件,他们之间的数据交换只通过一条信号线。
当只有一个从机设备时,系统可按单节点系统操作;
当有多个从机设备时,系统则按多节点系统操作。
设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能释放总线,而让其他设备使用总线。
单总线通常要求外接一个约为5kΩ的上拉电阻,如图所示。
图4.3.4DS18B20和单片机的连接
从图可以看出,DS18B20和单片机的连接非常简单,单片机只需要一个I/O口就可以控制DS18B20。
这个图的接发是单片机与一个DS18B20通信,如果要控制多个DS18B20进行温度采集,只要将所有DS18B20的I/O口全部连接到一起就可以了。
在具体操作时,通过读取各个DS18B20内部芯片的序列号来识别。
4.3.5DS18B20的工作原理
硬件电路连接好以后,对于单片机需要怎样工作才能将DS18B20中的温度数据读取出来,下面将给出详细分析。
其控制DS18B20的指令:
33H—读ROM。
读DS18B20温度传感器ROM中的编码(即64位地址)。
44H—操作RAM。
发送温度转换命令,结果存入9字节RAM。
55H—匹配ROM。
发出此命令后,接着发出64位ROM编码,访问单总线上与该编码对应的DS18B20并使之作出响应,为下一步对该DS18B20的读/写做准备。
F0H—搜索ROM。
用于确定挂接在同一总线上DS18B20的个数,识别64位ROM地址,为操作各器件做好准备。
CCH—跳过ROM。
忽略64位ROM地址,直接向18B20发温度变换命令,适用于一个从机工作。
ECH—告警搜索命令。
执行后只有温度超过设定值上限或下限的芯片才作出响应。
以上这些指令涉及的存储器是64位光刻ROM,表1列出了它的各个定义。
表164位光刻ROM各位定义
8位
48位
CRC码
序列号
产品类型编号
64位光刻ROM中的序列号是出厂前被光刻好的,他可以看做该DS18B20的地址序列码。
其各位排列顺序是:
开始8位为产品类型标号,接下来48位是该DS18B20自身的序列号,最后8位是前56位的CRC循环校验码(CRC=X8+X5+X4+1)。
光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一条总线上接挂多个DS18B20的目的。
4.3.6DS18B20的工作时序图
下图为时序图中各个总线状态。
图4.2.6时序图中各个总线态
(1)初始化
时序图如下图5所示。
先将数据线至高电平1.
图
(1)DS18B20初始化时序图
①数据线拉到低电平0。
②延时(该时间要求不是很严格,但是要尽可能短一点
③延时750μs(该时间范围可在480~960μs)。
④数据线拉到高电平1。
⑤延时等待。
如果初始化成功则在15~60μs内产生一个由DS18B20返回的低电平0,据该状态可以确定温度传感器ds18b20的存在。
但是应注意,不能无限地等待,不然会使程序进入死循环,所以要进行超时判断。
若CPU读到数据上的低电平0后,还要进行延时,延时的时间从发出高电平算起(第⑤步的时间算起)最少要480μs。
将数据线再次拉到高电平1后结束。
(2)DS18B20写数据
时序图如下图6所示。
写数据步骤:
①数据线先置低电平0。
②掩饰确定的时间为15μs。
③按从低位到高位的顺序发送数据(一次只发送一位)。
④延时时间为45μs。
⑤将数据线拉到高电平1。
重复循环①~⑤步骤,直到发送完整个字节,注意最后将数据线拉到高位1。
图
(2)DS18B20写数据
(1)DS18B20读数据
时序图如下图7所示。
图(3)DS18B20读数据
(3)DS18B20写数据
时序图如上图所示。
①将数据线拉高到1.
②延时2μs。
③将数据线拉低到0.
④延时6μs。
⑤将数据线拉高到1。
⑥延时4μs。
⑦读数据线的状态得到一个状态位,并进行数据处理。
重复①~⑦步骤,直到读取完一个字节后延时30us。
时序图见上图。
4.4显示模块
采用三位一体共阴数码管显示温度,数码管驱动使用锁存器74hc573。
采用动态显示的原理,故段选和位选都用p0口,通过p2.6口和p2.7口确定位或者段的选通,接法见附录电路原理图。
5软件设计
5.1总程序流程图
总程序流程图如下图所示。
图5.1总程序流程图
5.2程序设计
其源程序见附录三。
6安装调试
安装调试时,数码管会出现亮度不均匀或是数码管中有个别不显示的现象,经检查发现产生这种原因的可能是因为焊接的时候有虚焊、选用的上拉电阻阻值过大,或是接元器件的时候无意间把锁存器控制位导线弄断所导致。
6.1数码管引脚的判断
用5v的直流电源串电阻接在数码管十二个引脚上,可以判断出各个引脚代表哪一段和哪一位,其中6号引脚不起作用。
哪个是6号引脚呢?
让三位数码管正对自己右下角的引脚为1号引脚,逆时针依次为2、3、4、5、6、7、8、9、…、12号引脚。
判断出它的内部电路图如下图所示。
图6.1数码管内部电路图
6.2排除故障
6.2.1排除逻辑故障
这类故障往往由于设计和连线过程中工艺性错误所造成的。
主要包括错线、开路、短路。
排除的方法是首先将加工的电路板认真对照原理图,看两者是否一致。
应特别注意电源系统检查,以防止电源短路和极性错误,必要时利用数字万用表的短路测试功能,可以缩短排错时间。
6.2.1排除元器件失效
造成这类错误的原因有两个:
一个是元器件买来时就已坏了;
另一个是由于安装错误,造成器件烧坏。
可以采取检查元器件与设计要求的型号、规格和安装是否一致。
在保证安装无误后,用替换方法排除错误。
6.2.3排除电源故障
在通电前,一定要检查电源电压的幅值和极性,否则很容易造成集成块损坏。
加电后检查各插件上引脚的电位,一般先检查VCC与GND之间电位,若在5V~4.8V之间属正常。
若有高压,联机仿真器调试时,将会损坏仿真器等,有时会使应用系统中的集成块发热损坏。
7结论
本文较详细的阐述了温度测量装置设计的整体方案与软件实现。
DS18B20的优势在于集温度测量、A/D转换为一体,具有单总线结构,数字量输出,直接与单片机接口等优点,温度读取简单、直观,硬件和软件的开发过程简单,因此可用它组成单路或多路温度测量装置,有一定的使用和推广价值。
当然,在这个过程中我遇到了很多问题,有的是我看书、上网查资料解决的,有的是同过李研达老师、同学的帮助解决的,在这里还得感谢他们的支持与厚望。
参考文献
[1]刘华东等编.单片机原理与应用[M].北京:
电子工业出版社,2008
[2]吴金戌等编.8051单片机实践与应用[M].北京:
清华大学出版社,2001
[3]张毅刚等编.单片机原理及应用[M].北京:
高等教育出版社,2003
Basedonthedigitalthermometer51MCUdesign
ZhangZhaoYuan
(SchoolofPhysicsandElectricalEngineering,AnyangNormalUniversity,Anyang,Henan455000)
Abstract:
withtherealizationofsingle-chipmicrocomputercontroltemperaturemeasuringsystem,itshighaccuracy,goodstability,andselecttheDALLAScompanylatestDSl8B20alineinthedigitaltemperaturesensorispresented,anddigitaltemperaturesensorhardwareinterfacecircuitandthesoftwaredesignmethod,throughthedigitalluminescencetubestodisplaytemperature.
Keywords:
STC89C52;
Temperaturemeasurement;
附录一电路原理图
附录二面包板图
附录三源程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P2^2;
//defineinterface,确定接口
uinttemp;
//variableoftemperature,温度变量为无符号整形
ucharflag1;
//signoftheresultpositiveornegative,结果是否生效标志
sbitdula=P2^6;
//数码管段选
sbitwela=P2^7;
//数码管位选
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//显示的依次是0~f
unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
//显示的依次是0.~9.
voiddelay(uintcount)//延时子程序
{
uinti;
while(count)
{
i=200;
while(i>
0)//延时约1ms
i--;
count--;
}
}
///////功能:
串口初始化,波特率9600,方式1///////
voidInit_Com(void)
TMOD=0x20;
//GATEC\TM1M0GATEC\TM1M0//定时T1工作方式2
PCON=0x00;
//SMOD波特率倍增位,PCON=0X01时倍增//电源控制寄存器
SCON=0x50;
//SM0SM1SM2RENTB8RB8TIRI//串行控制寄存器
TH1=0xFd;
TL1=0xFd;
TR1=1;
voiddsreset(void)//sendresetandinitializationcommand//发送初始化及复位信号/*为了识别已连接到单总线上的数字温度传感器*/
DS=0;
i=103;
0)i--;
//480us~960us/*处理器先向DS18B20发送一个持续480~960us的低电平信号*/
DS=1;
/*然后进入输入模式释放总线*/
i=4;
//15~60us/*在检测到I/O引脚上升沿之后,等待15~60us*/
}/*如果由DS18B20所返回的低电平持续时间少于60us,则表示就绪信号无效。
主机要重新发送初始化时间序列*/
/*读取数据的一位,满足读时隙要求*/
bittmpreadbit(void)//readabit//readabit读一位//DS18B20的读时序:
分为读0时序和读1时序两个过程
//对于DS18B20的读时隙是从主机把单总线拉低之后,
bitdat;
//dat的取值为0、1。
//在15微秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
i++;
//i++fordelay小延时一下//DS18B20在完成一个读时序过程,至少需要60us才能完成。
//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
dat=DS;
i=8;
while(i>
return(dat);
/*读取数据的一个字节*/
uchartmpread(void)//readabytedate,读数据的一个字节
uchari,j,dat;
dat=0;
for(i=1;
i<
=8;
i++)
j=tmpreadbit();
dat=(j<
<
7)|(dat>
>
1);
//读出的数据最低位在最前面,这样刚好一个字节在DAT里
return(dat);
//将一个字节数据返回
/*写数据的一个字节,满足写1和写0的时隙要求*/
voidtmpwritebyte(uchardat)//writeabytetods18b20,向传感器写入一个字节//DS18B20的写时序:
写0时序和写1时序两个过程
{//写一个字节到DS18B20里//
ucharj;
bittestb;
for(j=1;
j<
j++)
testb=dat&
0x01;
dat=dat>
1;
取下一位(由低位向高位)
if(testb)//write1//对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得使单总线变高,整个写1时隙不低于60us。
//产生写0时隙的过程:
MCU拉低总线后,只要在整个时隙期间保持低电平即可(至少60US)
i++;
else
//write0
voidtmpchange(void)//DS18B20beginchange
dsreset();
delay
(1);
tmpwritebyte(0xcc);
//addressalldriversonbus,//允许MCU不提供64位ROM编码就使用存储器操作命令,在单点总线情况下节省时间
tmpwritebyte(0x44);
//initiatesasingletemperatureconversion//(操作RAM)发送温度转换命令,结果存入9字节RAM。
//
uinttmp()//getthetemperature
floattt;
uchara,b;
tmpwritebyte(0xbe);
//发送读取数据命令,读内部RAM9字节的内容
a=tmpread();
b=tmpread();
temp=b;
temp<
//twobytecomposeaintvariable
temp=temp|a;
//得到真实十进制温度值,两字节合成一个整型变量
tt=temp*0.0625;
//1/16=0.0625,每个数值代表1/16
temp=tt*10+0.5;
//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
returntemp;
//返回温度值
voidreadrom()//readtheserial
ucharsn1,sn2;
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
voiddelay10ms()//delay;
延时
for(a=10;
a>
0;
a--)
for(b=60;
b>
b--);
voiddisplay(uinttemp)//显示程序
ucharA1,A2,A2t,A3,ser;
ser=temp/10;
//分离出三位要显示的数字
SBUF=ser;
A1=temp/100;
//
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
dula=0;
P0=table[A1];
//显示百位
dula=1;
wela=0;
P0=0x7e;
wela=1;
wela=0;
P0=table1[A2];
//显示十位
P0=0x7d;
P0=table[A3];
//显示个位
P0=0x7b;
voidmain()
uchara;
Init_Com();
do
tmpchange();
//delay(200);
for(a=10;
{display(tmp());
}while
(1);
附录四元件清单
名称
参数
个数
单片机stc89c52
直插封装DIP40
1
ds18b20
排阻
10k
瓷片电容
22p
2
74hc573
DIP20
无源晶振
11.0592HZ
极性电容
10u
色环电阻
2.7k/10k
1/1
三位共阴数码管
5361AH
.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 数字 温度计 设计