传感器应用电路设计doc资料.docx
《传感器应用电路设计doc资料.docx》由会员分享,可在线阅读,更多相关《传感器应用电路设计doc资料.docx(19页珍藏版)》请在冰豆网上搜索。
![传感器应用电路设计doc资料.docx](https://file1.bdocx.com/fileroot1/2023-2/4/9da9e145-7296-4d80-aa34-1f8a2c5d2540/9da9e145-7296-4d80-aa34-1f8a2c5d25401.gif)
传感器应用电路设计doc资料
传感器应用电路设计.
传感器应用电路设计
电子温度计
学校:
贵州航天职业技术学院
班级:
2011级应用电子技术
指导老师:
姓名:
组员:
摘要
传感器(英文名称:
transducer/sensor)是一种检测装置,能感受到被测量的信息,并能将检测感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。
它是实现自动检测和自动控制的首要环节。
本文将介绍一种基于单片机控制的数字温度计。
在件方面介绍单片机温度控制系统的设计, 对硬件原理图做简洁的描述。
系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序、显示数据刷新子程序。
软硬件分别调试完成以后,将程序下载入单片机中,电路板接上电源,电源指示灯亮,按下开关按钮,数码管显示当前温度。
由于采用了智能温度传感器DS18B20,所以本文所介绍的数字温度计与传统的温度计相比它的转换速率极快,进行读、写操作非常简便。
它具有数字化输出,可测量远距离的点温度。
系统具有微型化、微功耗、测量精度高、功能强大等特点,加之DS18B20内部的差错检验,所以它的抗干扰能力强,性能可靠,结构简单。
随着科技的不断发展,现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长,而如何准确而又迅速的获得这些参数就需要受制于现代信息基础的发展水平。
在三大信息信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技术)中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:
①传统的分立式温度传感器 ②模拟集成温度传感器 ③智能集成温度传感器。
目前的智能温度传感器(亦称数字温度传器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。
社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89S51单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。
与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用。
该设计控制器使用ATMEL公司的AT89C52单片机,测温传感器使用DALLAS公司DS18B20,用液晶来实现温度显示。
第一章温度传感器
1.1温度传感器的定义及类型
温度传感器是利用物质各种物理性质随温度变化的规律吧温度转换为电量的传感器。
它是温度测量仪器的核心部分,品种繁多。
按测量方式可分为接触式和非接触式两类,按传感器材料及电子元件特性分为热电阻和热电偶两类,按照温度传感器输出信号的模式,可大致划分为三大类:
数字式温度传感器、逻辑输出型温度传感器、模拟温度传感器。
1.1.1接触式温度传感器
接触式温度传感器的检测部分与被检测对象有良好的接触又称为温度计。
1.1.2非接触式温度传感器
它的敏感元件与被测对象互不接触,又称非接触式测温仪表,这种仪表可用来测量运动物体,小目标和热量小或温度变化迅速对象的表面温度,也可用于测量温度场温度分布。
1.2DS18B20温度传感器使用中注意事项
较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20温度传感器与微处理器间采用串行数据传送,因此,在对DS18B20进行读写编程时,必须严格地保证读写时序,否则将无法读取测温结果。
在使用PL/M\C等高级语言进行系统程序设计时,对DS18B20操作部分最好采用汇编语言实现。
在DS18B20温度传感器的有关资料中均未提及单总线上所挂DS18B20数量问题,容易使人误认为可以挂任意多个BS18B20,在实际应用中并非如此。
连接DS18B20温度传感器的总线电缆是有长度限制的。
在采用DS18B20进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。
在DS18B20温度传感器测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回型号,一旦某个DS18B20接触不好或断线,当程序
读该DS18B20时,将没有返回信号,程序进入死循环。
第二章电路设计
2.1总体设计
经过调研分析温度传感器DS18B20作为检测元件,其测温范围为-55℃~128℃,分辨率最大可达到0.0625℃.DS18B20可以直接读出被测温度值,而且采用三线制(引脚1接地、引脚2接电源、引脚3作为信号线)与单片机相连,减少了外部硬件电路,具有低成本和易使用的特点。
按照系统设计功能要求,确定系统由三个模块组成:
主控制器、测量电路和显示电路。
数字温度计总体电路结构框图如下图所示
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值以16位带符号扩展的二进制补码形式存储在高速暂存存储器的一二字节。
单片机可以通过单线接口读出该数据,读数据时低位在前,高位在后,数据格式以0.0625℃/LSB形式表示,其中第二字节的高四位为符号位,当符号位为0时,表示测得的温度值为正值,可以直接进行二进制数转换为十进制;当符号位为1时,表示测得的温度为负值,要先将补码变成原码,在计算其对应的十进制数 。
2.2硬件电路原理图
数字温度计电路设计原理图如上图所示,控制器使用单片机ST89C52RC,温度传感器使用DS18B20,用4位共阴LED数码管以动态扫描法实现温度显示。
列驱动用NOT,段码信号由74HC595译码器驱动,P2.1口输出八位信号,须外接上拉电阻。
2.3温度测量系统硬件部分的介绍
2.3.1 AT89C52功能及特性
AT89C52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使AT89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89C52具有以下标准功能:
4k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,
2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.3.2振荡电路
晶振是晶体振荡器的简称,在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低 的频率是串联谐振,较高的频率是并联谐振。
由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶 振的两端并联上合适的电容它就会组成并联谐振电路。
这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄, 所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。
晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。
一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容,请注意一般IC的引脚都有等效输入电容,这个不能忽略。
2.4DS18B20介绍
DS18B20引脚如图所示。
TO-9封装
TO-9封装
符号
说明
1
GND
接地
2
DQ
数据输入/输出引脚。
3
VCC
电源
2.4.1DS18B20主要特性
(1)适应电压范围宽,电压范围:
3.0-5.5V,在寄生电源方式下可以由数据线供电;
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测量。
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;
(5)温度范围-55℃~+128℃,在-10~+85℃时精度为±0.5℃;
(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃,0.0625℃,可以实现高精度测温;
(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快;
(8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可以传送CRC校验码,具有极强的抗干扰纠错能力;
(9)负压特性:
电源极性接反时,芯片不会因为发热而烧毁,但是不能正常工作。
2.5有关74HC595芯片
2.5.174HC595,是串入并出移位寄存器,驱动能力较大些。
引脚序号
符号
说明
1、2、3、4、5、6、7、15
Q0——Q7
并行数据输出端
8
GND
接地
9
Q7’
串行数据输出引脚
10
MR
移位寄存器清零端
11
SH_CP
数据输入时钟端
12
ST_CP
数据输出时钟端
13
OE
使能端(低电平有效)
14
DS
数据输入端
16
VCC
电源(+5V)
2.5.274HC595的工作时序图
第三章系统软件设计
3.1软件程序
3.1.1DS18B20的程序设计
软件程序主要包括主函数、DS18B20复位函数、 DS18B290写字节函数、DS18B20读字节函数、温度转换函数和显示函数。
3.1.2主函数
主函数的主要功能是初始化并负责温度的读出、处理计算与显示。
温度测量每两秒进行一次。
#温度显示仿真
3.2源程序设计
3.2.1DS18B20的程序设计
#include"math.h"
sbitDQ=P3^7;
intt;
unsignedchardat;//读写数据变量
unsignedchara=0;
unsignedcharb=0;
floattep=0;//读一个温度时的温度转换中间间
unsignedchardatatempbuf[4];//温度字型显示中间变量
/******************************************************
函数名称:
delay(uintnum)
返回值:
无
参数:
uintnum颜色数据值
作用:
延时
*******************************************************/
voiddelay1(unsignedintnum)
{
while(num--);
}
/******************************************************
函数名称:
voidInit_DS18B20(void)
返回值:
无
参数:
无
作用:
初始化18B20
*******************************************************/
voidInit_DS18B20(void)
{
charx=0;
DQ=1;
delay1(10);//稍作延时
DQ=0;
delay1(80);//延时>480us540us
DQ=1;//拉高总线15-60us
delay1(20);
x=DQ;//读总线状态为0复位成功,为1则不成功
delay1(30);
DQ=1;//释放总线
}
/******************************************************
函数名称:
ucharReadOneChar(void)
返回值:
uchardat
参数:
无
作用:
读1820一个字节
*******************************************************/
unsignedcharReadOneChar(void)
{
unsignedchari;
unsignedchardat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;//给脉冲
if(DQ){dat|=0x80;}//读1///读0右移处理
delay1(8);//15us内读完一个数
}
return(dat);
}
/******************************************************
函数名称:
voidWriteOneChar(uchardat)
返回值:
无
参数:
uchardat
作用:
写1820一个字节
*******************************************************/
//****写DS18B20***///写060us读完,写130us内读完
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;//写所给数据最低位
delay1(10);///////////
DQ=1;//给脉冲
dat>>=1;
}
delay1(8);
}
/******************************************************
函数名称:
intReadOneTemperature(void)
返回值:
intt
参数:
无
作用:
读温度值
*******************************************************/
//***读取温度值***********//每次读写均要先复位
intReadOneTemperature(void)
{
Init_DS18B20();//初始化
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0x44);//发读开始转换命令
Init_DS18B20();
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0xbe);//读寄存器,共九字节,前两字节为转换值
a=ReadOneChar();//a存低字节
b=ReadOneChar();//b存高字节
t=b;
t<<=8;//高字节转换为10进制
t=t|a;
tep=t*0.0625;//转换精度为0.0625/LSB
t=tep*10+0.5;//保留1位小数并四舍五入****后面除10还原正确温度值)
return(t);
}
/******************************************************
函数名称:
uintTemperaturepro(void)
返回值:
void
参数:
void
作用:
温度数据进行显示处理
*******************************************************/
voidTemperaturepro(void)
{
inttemp;
temp=ReadOneTemperature();
if(temp>=0)
{
if((temp<1000)&&(temp>=100))
tempbuf[3]=11;
else
tempbuf[3]=temp/1000;//百位
if((temp<100)&&(temp>=9))
{tempbuf[3]=11;tempbuf[2]=11;}
else
tempbuf[2]=temp/100%10;//十位
if(temp==0){tempbuf[3]=11;tempbuf[2]=11;}
tempbuf[1]=temp%100/10;//个位
tempbuf[0]=temp%10;//小数
}
else
{
temp=temp-1;
tempbuf[3]=10;//负号
tempbuf[2]=abs(temp)/100;//十位
tempbuf[1]=abs(temp)/10%10;//个位
tempbuf[0]=abs(temp)%10;//小数
}
}
2、主程序的设计
#include
#include"ds18b20.h"
/**************************************************************
引脚定义
***************************************************************/
//第一部分
sbitPin_shug1=P1^0;
sbitPin_shug2=P1^1;
sbitPin_shug3=P1^2;
sbitPin_shug4=P1^3;
//第二部分
sbitPin_shcp=P2^0;
sbitPin_ds=P2^1;
sbitPin_stcp=P2^2;
sbitPin_speaker=P2^7;
//宏定义
unsignedcharLedBuffer[4]={0,0,0,0};
#defineALL_OFF()P1=P1&0xF0
unsignedcharcodeLedcode[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x02,0x00};
/**************************************************************//函数名:
voiddelay(unsignedcharn)
//返回值:
无
//参数:
unsignedcharn
//作用:
延时(专给显示部分)
***************************************************************/
voiddelay(unsignedcharn)
{
inti;
while(n--)
for(i=0;i<800;i++);
}
/**************************************************************
//函数名:
SendOneStye(unsignedchardat)
//返回值:
无
//参数:
unsignedchardat
//作用:
送一字节的数给74HC595
**************************************************************/
voidSendOneStye(unsignedchardat)
{
unsignedchari;
Pin_stcp=0;
for(i=0;i<8;i++)
{
dat=dat>>1;
Pin_ds=CY;
Pin_shcp=0;
Pin_shcp=1;
}
Pin_stcp=1;
}
/**************************************************************
//函数名:
voidDisplay()
//返回值:
无
//参数:
无
//作用:
显示
****************************************************************/
voidDisplay()
{
Pin_shug1=1;
SendOneStye(LedBuffer[0]);
Pin_shug4=0;
delay
(1);ALL_OFF();//---第一位数码管----
Pin_shug2=1;
SendOneStye(LedBuffer[1]);
Pin_shug1=0;
delay
(1);ALL_OFF();//---第二位数码管----
Pin_shug3=1;
SendOneStye(LedBuffer[2]);
Pin_shug2=0;
delay
(1);ALL_OFF();//---第三位数码管----
Pin_shug4=1;
SendOneStye(LedBuffer[3]);
Pin_shug3=0;
delay
(1);ALL_OFF();//---第四位数码管----
}
/************************************************************************
//函数名:
voidmain(void)
//返回值:
无
//参数:
无
//作用:
主函数
************************************************************************/
voidmain(void)
{
Init_DS18B20();//初始化
while
(1)//segment
{
Temperaturepro();//调用温度数据处理函数
LedBuffer[0]=Ledcode[tempbuf[3]];
LedBuffer[1]=Ledcode[tempbuf[2]];
LedBuffer[2]=Ledco