温度检测设计论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

温度检测设计论文
小组成员及任务分配:
郝鹏1403669077(编写论文)
卓应广1403669017(编程)
贾渊杰1403669080(查找资料,整理论文)
民生学院测控技术与仪器
●第一章:前言
温度检测系统可以通过DS18B20温度传感器对温度进行检测,并通过数码管显示,同时利用I/O口与单片机连接,实现温度采集,数据处理,数据调整,温度显示等功能。

该系统的需求分析如下
一过程。

斜坡式累加器用来补偿感温振荡器的非线性,以期在测温时获得比较高的分辨力。

这是通过改变计数器对温度每增加一度所需计数的值来实现的。

因此,要想获得所需的分辨力,必须同时知道在给定温度下计数器得值和每一度的计数值。

温度测量电路的方框图如图
硬件及软件设计的考虑
由于单片机串口有限,因此通过锁存器实现串行输入并行输出节省串口,程序编写时应先调用led数码管所连接的寄存器,进而调用数码管。

第三章:硬件电路设计:
最小系统电路
IAP15F2K61S2属于IAP15系类型号单片机,该系列单片机有3个16位可重转载普通定时器/计数器分别是定时器/计数器0,定时器/计数器1和定时器/计数器
0,掉电唤醒专用定时器;5个外部中断INT0/INT1/INT2_______/INT3________/INT4________
;一组高速异步串行口;一组高速同步串行通信端口SPI ;2个数据指针DPTR ;外部数据总线等功能。

上图为单片机内部结构图
单片机电源电路
上图为单片机电源电路
LED八段共阳极数码管显示电路
为八段共阳极数码管节省串口通过锁存器实现串行输入,并行输出。

同时为了灵
活使用,与其他开发板不同八个数码管阳极没有接电源VCC而是通过锁存器连接单片机,单片机输出高电平实现八个数码管的共阳极连接。

在使用时,应先通过P2口选择模块连接的锁存器,在通过P0口输出数据来控制数码管。

DS18B20数字温度传感器电路
DS18B20具有独特的单线接口仅需一个端口引脚与单片机P1.4进行通讯。

该数字温度传感器无需另外接电源,可通过数据线供电供电范围3.0V~5.5V。

18B20传感器测温范围在-55度到125度,并在-10度到85度范围内精准度在+-5度
图 1 是表示DS18B20 的方框图。

64 位只读存储器储存器件的唯一片序列号。

高速暂存器含有两个字节的温度寄存器,这两个寄存器用来存储温度传感器输出的数据。

除此之外,高速暂存器提供一个直接的温度报警值寄存器(TH和TL),和一个字节的的配臵寄存器。

配臵寄存器允许用户将温度的精度设定为9,10,11 或12 位。

TH,TL 和配臵寄存器是非易失性的可擦除程序寄存器(EEPROM),所以存储的数据在器件掉电时不会消失。

DS18B20通过达拉斯公司独有的单总线协议依靠一个单线端口通讯。

当全部器件经由一个3态端口或者漏极开路端口(DQ引脚在DS18B20上的情况下)与总线连接的时候,控制线需要连接一个弱上拉电阻。

在这个总线系统中,微控制器(主器件)依靠每个器件独有的64位片序列号辨认总线上的器件和记录总线上的器件地址。

由于每个装臵有一个独特的片序列码,总线可以连接的器件数目事实上是无限的。

单总线协议,包括指令的详细解释和“时序”见单总线系统节。

DS18B20的另一个功能是可以在没有外部电源供电的情况下工作。

当总线处于高电平状态,DQ与上拉电阻连接通过单总线对器件供电。

同时处于高电平状态的
总线信号对内部电容(Cpp)充电,在总线处于低电平状态时,该电容提供能量给器件。

这种提供能量的形式被称为“寄生电源”。

作为替代选择,DS18B20同样可以通过VDD引脚连接外部电源供电
使用时应注意:
SKIP ROM [CCh] (忽略ROM 指令)
这条指令允许总线控制器不用提供64 位ROM 编码就使用功能指令。

当只有一只从机在总线上时,无论如何,忽略ROM指令之后只能跟着发出一条读取暂存器指令[BEh]。

READ SCRATCHPAD [BEh] (读暂存器指令)
这条命令读取暂存器的内容。

读取将从字节0 开始,一只进行下去,知道第9字节(字节8,CRC)读完,如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。

CONVERT T [44h] (温度转换指令)
这条命令用以启动一次温度转换。

温度转换指令被执行,产生的温度转换结果数据以2个字节的形式被存储在高速暂存器中,而后DS18B20保持等待状态。

在温度转换期间(tconv),必须在10us(最多),内给单总线一个强上拉,见DS18B20 供电节。

以上是该电路程序设计时所需用到的指令。

电路参考来源:蓝桥杯内部学习资料
第四章:软件程序设计
温度检测程序初步的主要思路以框图形式表示。

如下
P2=0x80; P0=0xFF; P2=0xC0; P0=0xFF;
P2=0xE0; P0=0xFF; }
void ds18b20_init() {
DQ=0;
Delay500us();
DQ=1;
Delay500us();}
延时程序有ms级延时程序和us级延时程序,因为延时程序使用较多,因此将其分位100us延时、500us延时和可输入ms延时。

void Delay100us()
{unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{while (--j);
while (--i);
} }
void Delay500us()
{unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{while (--j);
} while (--i);
}
void delayms(int ms)
{int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
温度读取程序主要为发送温度转换指令,发送读取暂存器指令,调用读字节子程序读取DS18B20发送的温度数据,并对数据进行初步转换
uchar temget()
{
uchar sum,low,high;
ds18b20_init();
write(0xCC);
write(0x44);
Delay500us();
ds18b20_init();
write(0xCC);
write(0xBE);
low=read();
high=read();
sum=high<<4;
sum=sum|(low>>4);
return sum;
}
写字节子程序。

写字节步骤为先将总线拉低,发送数据,之后再将总线拉高以准备下次数据传送。

注:数据传送时应一位一位传送。

void write(uchar dat)
{ uchar i;
for(i=0;i<8;i++)
{ DQ=0;
DQ=dat&0x01;
Delay100us();
DQ=1;
dat>>=1;
}
}
读字节子程序。

读字节步骤主要为线将总线拉低,按位读取数据,将数据总线拉高。

再将所读取的位数据顺序移至高位。

uchar read()
{ uchar i,dat;
for(i=0;i<8;i++)
{ DQ=0;
_nop_();
dat>>=1;
DQ=1;
if(DQ==1)
{dat=dat|0x80;}
Delay100us();
}
return dat;
}
显示程序。

数码管显示要先调用数码管阳极所在锁存器以选中要一个数码管,再调用数码管阴极所在锁存器,之后对数据进行传送。

注:因为每个数码管显示的数据不同,因此要对数码管进行逐个显示。

void display1(void)
{ P2=0xC0; P0=0x01;
P2=0xE0; P0=tab[yi];
delayms(1);
P2=0xC0; P0=0x02;
P2=0xE0; P0=tab[er];
delayms(1);
P2=0xC0; P0=0x04;
P2=0xE0; P0=tab[san];
delayms(1);
P2=0xC0; P0=0x08;
P2=0xE0; P0=tab[si];
delayms(1);
}
void display2(void)
{ P2=0xC0; P0=0x10;
P2=0xE0; P0=tab[wu];
delayms(1);
P2=0xC0; P0=0x20;
P2=0xE0; P0=tab[liu];
delayms(1);
P2=0xC0; P0=0x40;
P2=0xE0; P0=tab[qi];
delayms(1);
P2=0xC0; P0=0x80;
P2=0xE0; P0=tab[ba];
delayms(1);
}
主程序。

主程序功能为,对数码管进行初始化,调用初始化程序对单片机进行厨师换,串联温度读取程序并对读取的温度进行进一步处理,并调用显示程序对最后得到的温度进行显示。

void main()
{ uchar wendu;
AllInit();
yi=11;er=11;san=11;si=11;wu=11;
liu=0;qi=0;ba=0;
while(1)
{ wendu=temget();
liu=wendu/100;
qi=wendu%100/10;
ba=wendu%10;
display1();
display2();
}
}
头文件,位定义以及函数声明部分
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^4;
Uchar code tab[]={0XC0,0XF9,0XA4,
0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0 x00};
uchar yi,er,san,si,wu,liu,qi,ba;
void AllInit(void);
void delayms(int ms);
void display1(void);
void display2(void);
uchar temget();
uchar read();
void write(uchar dat);
void ds18b20_init();
void Delay100us();
void Delay500us();
第五章:总结与建议
总结
该程序可以很好的达到预期目的,运行速度较快测量精度较高,抗干扰性能较强。

在程序设计初期读取DS18B20数据之前没有对DS18B20输入温度转换指令一级读取暂存器指令并且对DS18B20得到的数据没有舍弃低四位导致数据出错,在查阅DS18B20温度传感器使用指南后这个问题得到很好的解决方案。

经验建议
在程序设计前浏览各个芯片的芯片守则,可以有效的提高程序设计时的效率,并减少出错率。

在程序设计时先列出方框图,再将子程序一一编写,最后将程序串联。

程序运行实物图:
程序运行视频见文件夹
附录一:
图为CD107D开发板图中1为DS18B20数字温度传感器,2为LED八段共阳极数码管,3为IAP15F2K61S2单片机(做89c52用)
材料清单如下图:
仿真电路图;
附录二:完整源代码(带注释)
#include <STC15.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^4; //位定义:单总线引脚DQ
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,
0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0x00};
//共阳极数码管显示对应的数组:0 1 2 3 4 5 6 7 8 9 . 全灭全亮
uchar yi,er,san,si,wu,liu,qi,ba;
void AllInit(void);
void delayms(int ms);
void display1(void);
void display2(void);
uchar temget();
uchar read();
void write(uchar dat);
void ds18b20_init();
void Delay100us();
void Delay500us();//函数声明部分
void main()
{ uchar wendu;
AllInit(); //对单片机进行上电初始化
yi=11;er=11;san=11;si=11;wu=11; //关闭前五个数码管liu=0;qi=0;ba=0;//初始化后三个数码管,并使其显示0;
while(1)
{ wendu=temget(); //调用temget函数得到温度值liu=wendu/100; //对得到的温度值转化得到其百位数值
qi=wendu%100/10;//对得到的温度值转化得到其十位数值
ba=wendu%10; //对得到的温度值转化得到其个位数值
display1(); //调用display1函数显示前四个数码管
display2(); //调用display2函数显示前四个数码管}
}
uchar temget() //读取温度函数
{ uchar sum,low,high;
ds18b20_init(); //ds18b20初始化
write(0xCC); //写入一个字节0xcc,作用是忽略ROM指令write(0x44); //写入一个字节0x44,作用是温度转换指令Delay500us();
ds18b20_init();
write(0xCC);
write(0xBE);//写入一个字节0xBE,作用是读取暂存器指令low=read(); //调用read函数获取LS BYTE位的值
high=read();//调用read函数获取MS BYTE位的值
sum=high<<4;//对获取得到的值进行转换,保留低四位,并移位到高四位
sum=sum|(low>>4); //对获取得到的值进行转换,保留高四位,并移位到低四位,然后与上一次得到的高四位相加return sum; //函数返回最终得到温度结果
}
uchar read() //读字节
{ uchar i,dat;
for(i=0;i<8;i++)
{ DQ=0; //总线拉低,等待
_nop_();
dat>>=1; //先右移一位
DQ=1; //开始读取
if(DQ==1) //对数据位进行判断为1
{dat=dat|0x80; //置1
}
Delay100us();
}
return dat; //返回读取的字节
}
void write(uchar dat) //写字节
{
uchar i;
for(i=0;i<8;i++)
{DQ=0;
DQ=dat&0x01; //从最低有效位开始通过总线
Delay100us();
DQ=1; //总线拉高,准备下一位的传送
dat>>=1; //右移一位
}
}
void ds18b20_init() //DS18B20的初始化
{DQ=0;
Delay500us();//复位:总线在低电平480us以上将被复位
DQ=1;
Delay500us(); //上拉为高电平,说明已经准备好操作}
void Delay100us() //@11.0592MHz 定时100us
{unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{while (--j);
} while (--i);
}
void Delay500us() //@11.0592MHz 定时500us
{unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{while (--j);
} while (--i);
}
void display1(void) //前四个数码管的显示
{P2=0xC0; P0=0x01; //选中第1个数码管
P2=0xE0; P0=tab[yi]; //控制第1个数码管的显示
delayms(1);
P2=0xC0; P0=0x02; //选中第2个数码管
P2=0xE0; P0=tab[er]; //控制第2个数码管的显示
delayms(1);
P2=0xC0; P0=0x04; //选中第3个数码管
P2=0xE0; P0=tab[san]; //控制第3个数码管的显示
delayms(1);
P2=0xC0; P0=0x08; //选中第4个数码管
P2=0xE0; P0=tab[si]; //控制第4个数码管的显示
delayms(1);
}
void display2(void) //后四个数码管的显示
{P2=0xC0; P0=0x10; //选中第五个数码管
P2=0xE0; P0=tab[wu]; //控制第五个数码管的显示
delayms(1);
P2=0xC0; P0=0x20; //选中第六个数码管
P2=0xE0; P0=tab[liu];//控制第六个数码管的显示
delayms(1);
P2=0xC0; P0=0x40; //选中第七个数码管
P2=0xE0; P0=tab[qi];//控制第七个数码管的显示
delayms(1);
P2=0xC0; P0=0x80; //选中第八个数码管
P2=0xE0; P0=tab[ba];//控制第八个数码管的显示
delayms(1);
}
void delayms(int ms) //毫秒级别的延时:可以延时ms毫秒{int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void AllInit(void) //上电初始化
{
P2=0xA0; P0=0x00; //关闭蜂鸣器
P2=0x80; P0=0xFF; //关闭LED
P2=0xC0; P0=0xFF; //选中每个八段数码管
P2=0xE0; P0=0xFF; //关闭所有八段数码管
}
附录三:
该程序设计基于蓝桥杯专用单片机开发板CT107D,但在其他开发板上也可兼用只需更改DQ引脚即可,其引脚可参考所使用的开发板使用说明书。

CT107D开发板费用280元。

若使用其他开发板,费用由所使用的开发板而定。

参考文献:
百度文库《基于单片机温度检测系统设计》
CT107D电路原理图
DS18B20中文资料。

相关文档
最新文档