前言
鄙人本次主要介绍一下做的关于DSP的第三次实验:DS18B20数字温度测量实验,主要包括DS18B20的引脚定义、工作原理、运行代码、硬件结果以及心得体会。
一、设计内容
DS18B20是常用的数字温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
1.1 DS18B20引脚定义
DS18B20电路图如下所示,不同的引脚分别对应:
1)DQ为数字信号输入/输出端;
2)GND为电源地;
3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
1.2 工作原理
工作温度范围:-55℃到+125℃(-67°F到+257°F),其中在-10℃到+85℃精确到±0.5℃。DS18B20数字温度计提供9位到12位摄氏温度测量。转换温度为12位数字在750ms(最大)。
1.3 实验要求
数码管前四位能够显示DS18B20 的温度值。
二、实验代码
代码如下(示例):
#include "stdio.h"
#include "evm5515.h"
#include "evm5515_emif.h"
int databuffer,temp,temp1;
int *SEG_souraddr,*DS18B20_souraddr;
int LED_DATA[]={0x0F80,0x0FF2,0x0F48,0x0F60,0x0F32,0x0F24,0x0F04, 0x0FF0,0x0F00,0x0F20,0x0F10,0x0F06,0x0F8C,0x0F42,0x0F0C,0x0F1C};
//七段数码管的显示数字,0亮1灭,前两位为位码,后两位是段码
Int16 EMIF_init()
{
Uint16 i;
*(ioport volatile unsigned *)0x1C04=0x10;
*(ioport volatile unsigned *)0x1C05=0x2;
for(i=0;i<500;i++){;}
*(ioport volatile int *)0x1C02 &= 0x77FF;//打开EMIF时钟
*(ioport volatile unsigned *)0x1C04=0x020;
*(ioport volatile unsigned *)0x1C05=0x00fb;
for(i=0; i<50; i++);
EMIF_AWCCR1 = 0x0080;
EMIF_AWCCR2 = 0x00E4;
EMIF_ACS2CR1 = 0xFFF9;
return 0;
}
void main( void )
{
EVM5515_init();
EMIF_init();
DS18B20_souraddr = (int *)0x600030; //温度传感器的地址
SEG_souraddr= (int *)0x600006; //数码管的地址
while(1)
{
databuffer = *DS18B20_souraddr;
temp = databuffer; //读取地址赋值到temp
temp1 = databuffer;//读取地址赋值到temp1
temp=(temp>>4)&0XFF; //整数
temp1=temp1&0X000F; //小数
temp1=temp1*625; //将小数部分扩大1万倍
*SEG_souraddr= LED_DATA[temp/10]&0X08FF; //显示温度的十位
EVM5515_waitusec(500); //等待时间
*SEG_souraddr= LED_DATA[temp%10]&0X04FF; //显示温度的个位
EVM5515_waitusec(500); //等待时间
*SEG_souraddr= LED_DATA[temp1/1000]&0X02FF; //显示温度的十分位
EVM5515_waitusec(500); //等待时间
*SEG_souraddr= LED_DATA[(temp1%1000)/100]&0X01FF; //显示温度的百分位
EVM5515_waitusec(500); //等待时间
}
}
三、 硬件验证结果
测试结果如下所示:第一幅图测得的温度为30.81摄氏度,第二幅图是用手触摸DS18B20器件后,温度提升为30.87摄氏度。
在这里插入图片描述
四、遇到问题
问题1:不明白16位二进制数和温度一一对应的关系。
解决办法:参照DS18B20的器件说明(如下图),随后分析出了:高五位为符号位:1是正数,0是负数(负数为对应正数的补码+1);随后的BIT10-BIT0分别对应2^(6)-2(-4),其中BIT10-BIT4为整数部分,BIT3-BIT0为小数部分。
问题2:不明白程序中的语句temp1=temp1*625;的含义。
解决办法:通过老师的讲解,才明白乘上625是精度,例如上图BIT0对应的是0.0625。
总结
这次的实验分为两个部分:DS18B20测温原理的分析,以及使用电路板测量温度。
在第一个部分中,我刚开始是不明白DS18B20的测温原理,然后通过翻译老师提供的关于DS18B20器件的PDF,才明白的DS18B20生成的16位二进制数与温度的以一一对应关系。
在第二个部分中,在按照老师给定的程序进行对温度的测量时,运行完程序之后,用手触摸DS18B20器件后来提升器件的温度,提高测量的温度,但我测量的温度从30.81摄氏度提升到了30.87摄氏度,可能是由于手有点凉,实验效果不明显,但最终还是成功完成了实验。
总之,这次的实验对我来说难度还是比较大的,也是遇到了很多问题,主要是第一部分的DS18B20测温原理的分析用了不少时间,通过对资料的一点点分析才明白了实验原理,但是最终都顺利完成了实验,让我对外文文献的分析翻译有了一定的提升,收获很多。