基于Proteus的电子体温计的设计与仿真.docx
《基于Proteus的电子体温计的设计与仿真.docx》由会员分享,可在线阅读,更多相关《基于Proteus的电子体温计的设计与仿真.docx(17页珍藏版)》请在冰豆网上搜索。
![基于Proteus的电子体温计的设计与仿真.docx](https://file1.bdocx.com/fileroot1/2022-11/28/50b9f6c7-b9a2-4149-9a0e-0a863c172bb5/50b9f6c7-b9a2-4149-9a0e-0a863c172bb51.gif)
基于Proteus的电子体温计的设计与仿真
基于Proteus的电子体温计的设计与仿真
专业:
电子信息工程学号:
********姓名:
施小飞
摘要:
体温计是现代人们日常家居生活的的必备品之一,而常见的体温计多为传统的水银体温计,该体温计是基于传统的热涨冷缩的性质制成的,该体温计在使用中存在着测温时间较长,读数不方便和水银外泄的不安全因数,因此十分有必要设计一款更加方便快速的电子体温计来解决这些问题。
本文将以AT89C51单片机为基础并结合数字温度传感器DS18B20,以及数码管显示等,来实现电子体温计的设计。
关键词:
电子体温计;AT89C51单片机;温度传感器DS18B20
Proteus'smicrocontroller-baseddesignandsimulationofelectronicthermometer
Abstract:
Thermometeristhehomeofmoderndailylifeofessentialgoods,andmorecommonforthetraditionalmercurythermometerthermometer,thethermometerisbasedonthetraditionalnatureoftheheatingorcoolingismade,andthethermometerinusethereisatemperaturealongtime,readingisnotconvenientandsafemercuryleakagefactor,itisnecessarytodesignamoreconvenientandfastelectronicthermometertosolvetheseproblems.ThiswillbecombinedwithAT89C51microcontrollerbaseddigitaltemperaturesensorDS18B20,anddigitaldisplay,electronicthermometerdesignedtoachieve.
Keywords:
Electronicthermometer;AT89C51microcontroller;TemperaturesensorDS18B20
1、绪论
1.1体温计的发展与现状
体温测量的历史,可以追溯到l6世纪。
当时Saatorio用空气热膨胀的原理,制出了第一支测量口腔温度的体温计。
本世纪初,开始用水银来制作体温计,至今在临床上得到了广泛的应用。
根据1928年Ebstein的报告,当时除测量口腔及腋下的温度外,还可以测量直肠、颈部、大腿根部,外耳及尿温。
这些都是用被测皮肤温度与玻璃球内积存的水银温度相等的原理实现的。
由于水银体温计使用方便、精度高,因而应用很广。
再加上测温方法及其结构都已成熟,没多大改进余地,人们对它的研究失去了信心,至今几乎没有什么进展。
由于用水银体温计进行体温监测很不方便,水银的污染的可能也很严重等,为了正确测量人体局部温度,促使人们开发了各种不同的测温仪器和测温方法。
虽然水银体温计仍不愧是一个精度高、便宜、使用方便的测温仪器。
现在已有许多医院采用了电子体温计,用其它电子仪器测量体温也日益普及。
这一事实至少表明,电子测温仪器的性能已接近水银温度计的性能。
因此,鉴于传统的水银体温计汞的污染及其携带不方便易破碎,尤其是测量时间过长等缺点,本课题为解决此问题设计出一种数字式电子体温计。
它在稳定性及响应时间上比传统的水银体温计有着显著的优势,精度要求也能和传统的水银体温计相媲美。
1.2可靠性需求与可用性需求:
由于该设计应用于人体身体健康的体温测量,因此必须保证设计的可靠性和可用性。
该设计利用的温度传感器为精度±0.5℃的DS18B20传感器保证了该体温计测量的精确性,为了提醒使用者的高温状态,设计中的蜂鸣器则保证了该设计的可靠性。
2.系统设计
2.1系统概述
该设计是以AT89C51芯片为核心,通过检DS18B20的工作与否,然后将其内部的数字量温度读到单片机,通过相应的数码管显示,当温度超出设定的温度时用蜂鸣器报警。
其外围电路包括复位电路、晶振电路。
系统方框图为:
2.2系统元件
2.2.1AT89C51的简介
AT89C51是一种带4K字节闪存可编程可擦只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次.该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容.由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.3DS18B20的特性介绍
(1)适应电压范围更宽,电压范围:
3.0~5.5V,寄生电源方式下可由数据线供。
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
(5)温范围-55℃~+125℃,在-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.4DS18B20的结构介绍
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
2.5数码管
常见的数码管由八个条状和一个点状发光二极管管芯制成,叫八段数码管。
根据其结构的不同,可分为共阳极数码管和共阴极数码管两种,发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的成为共阴显示器。
1位显示器由8个发光二极管组成,其中7个发光二极管a~g控制7个笔画的亮或暗,另一个控制一个小数点的亮和暗,这种笔画的八段显示器能显示的字符较少,字符的形状有些失真,但失控简单,使用方便。
如下图所示:
LED数码管引脚图
3.详细设计
3.1硬件设计
3.1.1温度采集模块温度采集模块的作用是采集传感器周围的温度,并将模拟信号转化为数字信号,采集模块如下图
3.1.2复位电路
电路的功能是完成对单片机的复位,具有上电复位功能和按键复位功能。
本设计中采用自动复位的上电复位方式。
晶振为12MHZ。
复位电路如图
3.1.3显示模块
显示范围主要为0℃-100℃,精度为0.1℃,显示数码管即为4位8段显示的数码管,由于单片机资源有限,这里采用的是动态扫描的方法。
在该接法中,单片机的借口为P0口,作为输出口,需要上拉,图中的电阻均为10K。
数码管采用共阳管。
显示接口电路图如下
3.1.4报警电路
设计的安全温度为0℃—37℃当人体温度超过37℃时,就要求有所报警指示,该设计采用PNP三极管9015进行驱动蜂鸣器,三极管工作在开关状态。
原理图如下
3.1.5整体设计仿真
3.2软件设计
3.2.1设计流程
该设计的主要思路为温度采样、数码管的显示以及报警电路的设置。
流程图如下:
3.2.2源程序:
voidinit(void)
{
num=0;
alarm_flag=0;
alarm_num=0;
temp_max=36;//设置温度上限值
temp_min=0;//设置温度下限值
TMOD=0x01;//定时器T0工作于方式1
TH0=(65536-50000)/256;//定时器T0赋初值
TL0=(65536-50000)%256;
EA=1;//开总允许中断
ET0=1;//开定时器T0中断
TR0=1;//启动定时器T0
}
/******1us的延时(12M)延时子程序*******/
voiddelay_us(ucharx)//whencrystalis12M,a*2+5us,
{//子程序调用要5us,while就等于DJNZ指令
while(--x);//x取值1~255;
}
/******1ms的延时(12M)延时子程序*******/
voiddelay_ms(ucharx)
{
uchari,j;
for(i=0;ifor(j=0;j<200;j++)
{
_nop_();//一个nop约1us
_nop_();
}
}
/*********dds18b20初始化*******/
voidinit1820(void)
{
DQ=1;//复位
_nop_();//稍做延时
DQ=0;//拉低数据线,准备ResetOneWireBus;
delay_us(125);//延时要大于480us小于960us,延时510us,释放总线
delay_us(125);
DQ=1;//提升数据线;
delay_us(15);//延时35us;ds18b20要等待15-16us
15
while(DQ)//等待器件信号,检测应答脉冲信号
{
_nop_();
}
delay_us(60);//延时125us;
DQ=1;//提升数据线,准备数据传输;
}
/****写数据的一个字节,满足写1和些0的时隙要求****/
voidwrite1820(uchara)
{
uchari;
for(i=0;i<8;i++)
{
if(a&0x01)//写1,低位在前;
{
DQ=0;//拉低电平,结束Recoverytime;
_nop_();//延时,使得15us以内拉高电平
_nop_();
_nop_();
DQ=1;//发送数据;
}
else//写0
DQ=0;
_nop_();
_nop_();
_nop_();
delay_us(30);//等待SlaveDevice采样;
DQ=1;//复位;
_nop_();//短延时;
a>>=1;//右移一位
}
}
ucharread1820(void)
{
uchari;
uchartemp=0;
DQ=1;
_nop_();//准备读;
for(i=0;i<8;i++)
{
temp>>=1;//低位先发;
DQ=0;//读开始脉冲;
_nop_();//延时;
16
DQ=1;//必须写1,否则读出来的将是不预期的数据;
delay_us
(2);//延时9us;
_nop_();
if(DQ)//在12us处读取数据;
temp|=0x80;
delay_us(30);//延时65us;
DQ=1;//拉高电平
_nop_();//恢复总线;
}
returntemp;
}
voidRdtemp(void)
{
uchark,tmp_int;
uinttp;
floatm=1.0,tmp_float;
init1820();//初始化DS1820
display();
write1820(0xcc);//跳过ROM
//delay_ms
(2);
write1820(0x44);//温度转换命令
//_nop_();
//DQ=1;
//delay_ms(250);//多个1820时要延时,单个就不用
//delay_ms(250);
//delay_ms(250);
init1820();//初始化DS1820
display();
write1820(0xcc);//跳过ROM
write1820(0xbe);//读占存器命令
display();
Temp_L=read1820();//温度值低位字节(其中低4位为二进制的小数部分)
Temp_H=read1820();//高位值高位字节(其中5位为符号位)
init1820();
display();
tp=Temp_H*256+Temp_L;
/************正负号处理**********/
num=0;
k=Temp_H>>4;
if(k>0)
{
tp=((~tp)+1);
17
Temp_L=tp%256;
disp_ds18b20[num++]=LED_CODE[10];
}
/************正数处理*************/
display();
tp=tp>>4;
tmp_int=(tp&0x7f);
if(tmp_int<10)
disp_ds18b20[num++]=LED_POINT_CODE[tmp_int];
elseif(tmp_int<100)
{
disp_ds18b20[num++]=LED_CODE[(tmp_int/10)];
disp_ds18b20[num++]=LED_POINT_CODE[(tmp_int%10)];
}
else
{
disp_ds18b20[num++]=LED_CODE[(tmp_int/100)];
disp_ds18b20[num++]=LED_CODE[((tmp_int%100)/10)];
disp_ds18b20[num++]=LED_POINT_CODE[((tmp_int%100)%10)];
}
/************负数处理**************/
display();
tmp_float=ds18b20_float_date(Temp_L);
display();
disp_float(tmp_float);
if(num>=6)
num=0;
}
floatds18b20_float_date(uchartmpl)
{
uchari,a,b,k;
floatm=1.0,p;
p=0.0;
b=0;
k=(tmpl&0x0f);
if(k==0)
return(p);
for(i=0;i<4;i++)
{
a=(k&0x01);
b=(a|b);
b=(b<<1);
k=(k>>1);
}
18
b=(b>>1);
p=((m/b)/2);
return(p);
}
/**********温度值小数显示部分处理函数**************/
voiddisp_float(floatdate)
{
ucharg,s;
uintb,q;
g=(date*10);//个分位
disp_ds18b20[num++]=LED_CODE[g];//送个分位
s=date*100;
s=s%10;//十分位
disp_ds18b20[num++]=LED_CODE[s];//送十分位
b=date*1000;
b=(b%100)%10;//百分位
disp_ds18b20[num++]=LED_CODE[b];//送百分位
q=date*10000;
q=((q%1000)%100)%10;//千分位
disp_ds18b20[num++]=LED_CODE[q];//送千分位
}
/**********显示函数**************/
voiddisplay(void)
{
uchari;
P2=0x01;//P2口赋初值控制数码管的位
for(i=0;i<6;i++)
{
P0=disp_ds18b20[i];//数码管段显示
delay_ms
(1);//1ms延时
P2=(P2<<1);//数码管位控制
}
}
/**********温度比较函数******************/
voidCompare_Temp(chartemp_min,chartemp_max)//比较温度
{
uchartl_temp;//定义变量
uchary;
uinttp;
init1820();//初始化DS1820
display();
write1820(0xcc);//skiprom命令
display();
write1820(0x44);//convertT命令
19
display();
init1820();//初始化DS1820
display();
write1820(0xcc);
display();
write1820(0xbe);
display();
Temp_L=read1820();//温度值低位字节(其中低4位为二进制的小数部分)
Temp_H=read1820();//高位值高位字节(其中5位为符号位)
init1820();//初始化DS1820
display();
if((Temp_H&0xf8)!
=0x00)//温度为负温度时处理
{
Temp_L=~Temp_L;//低8位取反
Temp_H=~Temp_H;//高8位取反
tl_temp=Temp_L+1;//低8位加1
Temp_L=tl_temp;//计算后重新存入数组
if(tl_temp>255)Temp_H++;//如果低8位大于255,向高8位进1
tp=Temp_H*256+Temp_L;//将转换的温度放入到tp中间变量中
y=tp>>4;//右移4位,除去小数部分
if(y>((~temp_min)+1))//与设定的警戒下限值比较
alarm_flag=1;//低于下限值
else
alarm_flag=0;//在下限值之上
}
else//温度为正温度时处理
{
tp=Temp_H*256+Temp_L;//读取的温度为正温度
tp=tp>>4;//除去小数部分
y=(char)tp;//转为符号型
if(y>temp_max)//比较与设定的上限警戒值
alarm_flag=1;//大于上限警戒值
else
alarm_flag=0;//小于上限警戒值
}
}
/**********主函数*************/
voidmain(void)
{
uchari;
20
init();//初始化
while
(1)
{
Rdtemp();//调读取温度函数
display();
Compare_Temp(temp_min,temp_max);//比较温度函数
//delay_ms(200);//延时大约200ms
for(i=0;i<30;i++)
display();//显示函数
}
}
/*****定时器T0中断子程序*******/
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;//定时器T0赋初值
TL0=(65536-50000)%256;
//alarm_num++;
if((alarm_flag==1))//&&(alarm_num%2==0))
{
SPEAK=~SPEAK/*产生方波,驱动扬声器发出警报声音*/;
motor=0/*驱动电机工作*/;
led=0/*超出范围时,警报且红灯闪烁*/;
}
else
{
SPEAK=0;
motor=1;
led=1;
}
if(alarm_num>250)
alarm_num=0;
}
4.结束语
在本次《智能仪器》课程论文的撰写过程中,我学到了很多单片机的运用知识也遇到了许多困难,尤其是在刚接到课题时的茫然无措到后来的逐步攻坚的过程中,自己不仅学到了很多也得到了许多同学的人心帮助。
我查取了大量资料,也向很多同学请教了相关知识,感觉自己的收获很多。
很感谢胡老师给我们这次机会。
如果论文写的不好还请胡老师指正批评。
参考文献
[1]梁森,王侃夫,黄杭美.自动检测与转换技术[M].北京:
机械工业出版社,2006
[2]邓重一.数据采集与处理系统中的干扰问题及解决方法[J].电工技术杂志,2004
[5]陈杰.传感器与检测技术[M].高等教育出版社,2002
[7]沙占友,马洪涛,安国臣,孟志永.新型智能温度传感器的与原理及应用,电子测量与仪器学报第16卷增刊.2002.10:
144-146
[8]沙占友.智能化温度测试系统的优化设计.电子测量与仪器学报16卷增刊.2002.10:
125-127
[11]康华光.电子技术基础模拟部分[M].高等教育出版社,1988
[14]谢自美.电子线路设计[M].武汉:
华中科技大学出版社,2000
[17]霍孟友.单片机原理与应用[M].机械工业出版社,2004
[23]应俊,陈广飞,叶丹,张海川.无线体温监测系统的研制[J].北京生物医学工程2006年01期:
16-8