基于at89c51单片机电子体温计设计

基于at89c51单片机电子体温计设计

ID:35621060

大小:124.00 KB

页数:22页

时间:2019-04-03

上传者:赏心悦目
基于at89c51单片机电子体温计设计_第1页
基于at89c51单片机电子体温计设计_第2页
基于at89c51单片机电子体温计设计_第3页
基于at89c51单片机电子体温计设计_第4页
基于at89c51单片机电子体温计设计_第5页
资源描述:

《基于at89c51单片机电子体温计设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

.1系统设计的目的意义1.1目的体温是生命活动的一种表现,是人体新陈代谢的一个重要生理参数。体温既有生理学的意义,又有重要的临床意义,是临床诊断的一个重要指标。因此体温计在现在的生活中有极为重要的作用。传统的水银体温计易破碎,存在水银污染的可能,测量时间较长,不易读数,为此设计一种新型的体温计,它的测量精度与传统的水银体温计相媲美的情况下,大大地缩短了测量时间且携带方便,对环境几乎没有污染。它以AT89C51单片机为核心,结合温度传感器,LED模块等外部设备,在软件的控制下,实现智能化的体温测量,不但能够精确测温,而且能够对温度进行逻辑判断,并且通过LED显示器将测量结果显示出来。若温度高于38摄氏度系统就会自动报警,这就意味着所测得的温度异于人体正常温度,引起人们注意。本设计的创新点在于,不仅完成了电子体温计的要求,而且还增加了一个报警装置。当测量者的体温高于人体正常体温时,体温计就会自动报警,人性化设计,为广大客户带来方便。1.2国内外进展情况中国电子体温计行业最早起源于1998年,以每年高于30%的速度发展至今经历了十多年时间。高达数倍甚至十多倍的利润空间、较低的政策壁垒和技术壁垒吸引了众多企业进入该行业。目前国内涌现了大小80多家电子体温计品牌,既有“欧姆龙”、“婴之侣”、“捷威”等行业领头的外资品牌,也有“华辰”、“世佳”、“华安”、“康复”等迅速发展壮大的国内品牌。今后试图进去该行业的生产厂家将达到50多家。由于行业逐步规范和新一轮电子体温计产品消费热潮的兴起,2009年以后,电子体温计产品行业进入了一个前所未有的高速发展时期,市场的快速发展孕育着巨大的商机。.. .1.3设计思路本系统可以使用ISIS画出原理图,打开ISIS软件,单击命令窗口file——newdesign,创建一个default模板,保存名称为“基于AT89C51单片机电子体温计设计.DSN”。执行菜单命令library——pickdevice/symbol,添加所需元件。本程序中可以使用DS18B20温度传感器,上面有“+”“-”可以模拟外界温度变化。芯片选取74LS137,74LS373。在原理图编辑窗口中放置元件,再单击工具箱中的“原件终端”图标,在对象选择中单击POWER和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置好相应参数,完成电路设计。设计的软件部分在Keil中完成,具体操作步骤在后面仿真步骤中有详细介绍,在此就不一一列出。.. .2系统分析2.1系统总体设计本系统采用AT89C51单片机、DS18B20温度采集模块和LED显示器共同实现。AT89C51集合了温度传感器、放大器、A/D转换器三者的作用。其中AT89C51通过P1.0和DS18B20进行单总线通信,启动DS18B20温度采集功能并取出转化后的体温数值,最后将体温值显示在外接在P0口与P2口的四位共阴LED上。设计思路如图2.1所示。DS18B20单片机LED显示器蜂鸣器图2.1设计思路示意图2.2DS18B20基础知识DS18B20是Dallas公司继DS1820后推出的一种改进型智能数字温度传感器,与传统热敏电阻相比,只需一根线就能直接读出被测温度,并可根据实际需求编程实现9~12位数字值的读数方式。2.2.1DS18B20的封装形式及引脚功能DS18B20有三种封装形式:(1)采用3引脚TO-92的封装形式。(2)采用6引脚TSOC封装形式。(3)采用8引脚SOIC封装形式。DS18B20芯片的引脚功能如下:(1)GND:电源地。(2)DQ:数字信号输入/输出端。(3)VDD:外接供电电源输入端。采用寄生电源方式时,该引脚接地。.. .2.2.2DS18B20的内部结构温度传感器DS18B20的内部结构如图所示,主要由64位ROM、温度传感器及高速缓存器配置寄存器等部分组成,如图2.2所示。VDDDQ64位ROM和单线接口高速缓存器温度传感器高温触发器TH低温触发器TL配置寄存器存储与控制逻辑电源检测8位CRC发生器C图2.2DS18B20内部结构示意图下面对DS18B20的相关部分进行简单的描述。(1)64位ROM。64位ROM是由厂家用激光刻录一个64位的二进制ROM代码,是该芯片的标志号,如图2.3所示。8位循环冗余检验48位序列号8位分类编号(10H)图2.364位ROM示意图MSBLSBMSBLSBMSBLSB8位分类编号表示产品分类编号,DS18B20的分类编号为10H;48号序列号是一个大于281x1012的十进数编码,作为该芯片的唯一标志代码;8位循环冗余检验为前56位的CRC循环冗余校验码(CRC=X8+X5+X4+1)。由于每个芯片的64位ROM代码不同,因此在单总线上能够并挂多个DS18B20进行多点温度实时检测。(2)温度传感器。温度传感器是DS18B20的核心部分,该功能部件可完成对温度的测量。通过软件编程可将-55~+125摄氏度范围内的温度值按9位、10位、11位、12位的转换精度进行量化,以上的转换精度都包括一个符号位,因此对应的温度量化值分别为0.5、0.25、0.125、0.0625摄氏度,即最高转换精度为0.0625摄氏度.. .。芯片出厂时默认为12位的转换精度。当接收到温度转换指令(44H)后,开始转换,转换完成后的温度以16位带符号扩展的二进制补码形式表示,存储在高速缓存器RAM的第0、1字节中,二进制数的前5位是符号位。如果测得的温度大于0,这5位为0,只要将测到的数值乘上0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘上0.0625即可得到实际温度。(3)高速缓存器。高速缓存器包括一个高速暂存器RAM和一个非易失性可电擦除E2PROM。非易失性可电擦除E2PROM用于存放高温触发器TH、低温触发器TL和配置寄存器中的信息。高速暂存器RAM是一个连续8字节的存储器,前两个字节是测得的温度信息,第1个字节的内容是温度的低8位,第2个字节是温度的高8位。第3个和第4个字节是高温触发器TH、低温触发器TL的易失性复制,第5个字节是配置寄存器的易失性复制,以上字节的内容在每一次上电复位时被刷新。第6、7、8个字节用于暂时保留为1。(4)配置寄存器。配置寄存器的内容用于确定温度值的数字转换分辨率。DS18B20工作时按此寄存器的分辨率将温度转换为相应精度的数值,它是高速缓存器的第5个字节,该字节定义如图2.4所示。图2.4高速缓存器的第5个字节示意图TMR0R111111TM是测试模块位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时,该位被设置为0,用户不必改动;R1和R0用来设置分辨率;其余5位均固定为1。DS18B20的分辨率设置如表2.1所示。表2.1DS18B20的分辨率设置R1R0分辨率最大转换时间(ms)009位93.750110位187.51011位3751112位7502.2.3DS18B20的测温原理.. .DS18B20主要由斜率累加器、温度系数振荡器、减法计数器、温度寄存器等部分组成。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值。温度系数振荡器用于产生减法计数脉冲信号,其中低温度系数振荡器受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数振荡器受温度的影响较大,随温度的变化,其振荡频率明显改变,产生的信号作为减法计数器2的输入脉冲。减法计数器对脉冲信号进行减法计数。温度寄存器暂存温度数值。在图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,从而完成温度测量。计数门的开启时间由高温度系数振荡器决定,每次测量前,首先将-55摄氏度多对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55摄氏度所对应的一个基数值。减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1。之后,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数振荡器产生的脉冲信号进行计数,如此循环,直到减法计数器2计数到0时,停止温度寄存器的值的累加。此时,温度寄存器中的数值即为所测温度。斜率累加器不断补偿和修正测温过程中的非线性,只要计数门未关闭就重复上述过程,直至温度寄存器的值达到被测温度值。由于DS18B20是单总线芯片,在系统中若有多个单总线芯片,每个芯片的信息交换则是分时完成的,均有严格的读/写时序要求。系统对DS18B20的操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。2.2.4DS18B20的ROM命令(1)ReadROM命令代码33H,允许主设备读出DS18B20的64位二进制ROM代码。该命令只适用于总线上存在单只DS18B20。(2)MatchROM命令代码55H,若主线上有多个从设备,使用该命令可以选中某一制定的DS18B20,即可与64位二进制ROM代码完全匹配的DS18B20才能响应其操作。(3)SkipROM命令代码CCH,在启动所有DS18B20转换之前或系统只有一个DS18B20时,该命令将允许主设备不提供64位二进制ROM代码就使用寄存器操作命令。(4)SearchROM命令代码F0H,.. .当系统初次启动时,主设备可能不知总线上有多少个从设备或者它们的ROM代码,使用该命令可确定系统中的从设备个数及ROM代码。(5)AlarmROM命令代码ECH,该命令用于鉴别和定位系统中超出程序设定的报警温度值。(6)WriteScratchpad命令代码4EH,允许主设备向DS18B20的寄存器写入两个字节的数据,其中第一个字节写入TH中,第二个字节写入TL中。可以在任何时刻发出复位命令中止数据的写入。(7)ReadScratchpad命令代码BEH,允许主设备读取暂存器中的内容。从第一个字节开始,直到CRC读完第九个字节。也可以在任何时刻发出复位命令中止数据的读取操作。(8)CopyScratchpad命令代码48H,将高温触发器TH和低温触发器TL中的字节复制到非易失性E2PROM。若主机在该命令之后又发出读操作,而DS18B20又忙于将暂存器的内容复制到E2PROM时,DS18B20就会输出一个“0”。若复制结束,则DS18B20输出一个“1”。如果使用寄生电源,则主设备发出该命令后,立即发出强上拉并至少保持10ms以上的时间。(9)ConvertT命令代码44H,启动一次温度转换。若主机在该命令之后又发出其他操作,而DS18B20又忙于温度转换,DS18B20就会输出一个“0”。若转换结束,则DS18B20输出一个“1”。如果使用寄生电源,则主设备发出该命令之后,立即发出强上拉并至少保持500ms以上的时间。(10)RecallE2命令代码B8H,将高温触发器TH和低温触发器TL中的字节从E2ROM中复制回到暂存器中。该操作是在DS18B20上电时自动执行,若执行该命令后又发出读操作,DS18B20会输出温度转换忙标志:0为忙,1完成。(11)ReadPowerSupply命令代码B4H,主设备将该命令发给DS18B20后发出读操作,DS18B20会返回它的电源使用模式:0为寄生电源,1为外部电源。2.374LS137基础知识74LS137是一种3线—.. .8线译码器/解调器,在三个地址输入端都加有地址锁存器。当锁存使能输入是低电平时,电路就具有译码器/解调器的功能。当锁存使能输入从低电平转换到高电平时,选择输入A、B和C中的地址便存储在锁存器中。只要锁存使能输入保持高电平,则可不再考虑地址的变化。输出使能控制控制着输出状态,而不管选择或锁存使能状态如何,除非一个输出是高一个输出是低,则所有输出全是高。2.474LS373基础知识引脚功能:(1)1D~8D:8位数据输入端(2)OE:三态允许控制端(低电平有效)(3)LE:锁存允许端(4)1Q~8Q:8位数据输出锁存端74LS373的输出端D0~D7可直接与总线相连。当三态允许控制端/OE为低电平时,Q0~Q7为正常逻辑状态,可用来驱动负载或总线。当OE为高电平时,Q0~Q7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。当锁存器允许端LE为高电平时,Q随数据D而变;当LE为低电平时,D被锁存在已建立的数据电平。LE端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善400mv。2.5原理图设计本设计以AT89C51单片机为核心,温度传感器给出相应的温度值,通过总线发送到芯片上,在LED显示屏上显示温度传感器上的温度。当温度高于38摄氏度时,在显示出温度的同时,蜂鸣器发出警报声。所需原件如表5.1所示。表2.2电子体温计所用的元件单片机AT89C51瓷片电容CAP30PF麦克风SOUNDER电解电容CAP-ELEC晶振CRYSTAL12MHz三极管2N2905电阻RES滑动变阻器POT-LIN温度传感器DS18B20芯片74LS373芯片74LS137显示屏7SEG-MPX4-CC.. .原理图如图2.5所示图2.5原理图示意图.. .3软件设计3.1流程图设计通过对系统的分析,我们可以对本设计有个大体的了解。如想得到温度,必须得先对DS18B20进行初始化处理。启动定时器,设置延时,并开中断,判断经过多长时间。若是没经过1.112ms,要对其继续判断是否是第一次采集温度,如果是的话那就返回继续判断经过1.112ms;如果不是那就将上次采集的温度返回判断经过1.112ms。以上判断是采集温度并判断延时时间。如果经过1.112ms,那么程序继续执行,关中断并令TR0=0,采集刚才的温度,保存并在LED显示屏上显示出来。此时再判断如果温度高于38摄氏度,那么蜂鸣器报警;如果低于这个温度程序则不报警,等待下次测量或者结束测量。根据以上分析,我们可以画出流程图如图6.1所示。.. .开始Y是否第一次采集DS18B20温度是否经过1.112ms初始化跳过读DS18B20启动定时器DS18B20启动定时器0延时1.112ms开中断N结束Y关中断并使TR0为0显示温度值采集DS18B20温度值并保存是否超过38度蜂鸣器报警显示上次所采集的温度NYN图6.1流程图示意图.. .3.2源程序设计根据以上的分析,我们可以写出程序如下:/****************************************************************//*显示内容:利用18B20单线温度检测的应用程序然后在数码管可以显示XX.XC,C表示摄氏度*//****************************************************************/#include#include#include#defineucharunsignedchar#defineuintunsignedint/****************************************************************//*定义端口*//****************************************************************/sbitseg1=P0^0;sbitseg2=P0^1;sbitseg3=P0^2;sbitDQ=P3^6;//DS18B20端口sbitbeep=P2^0;//警报sfrdataled=0x90;//显示数据端口P1/****************************************************************//*全局变量*//****************************************************************/uinttemp;ucharflag_get,count,num,minute,second;ucharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//七段数码管共阴ucharstr[6];.. ./****************************************************************//*函数声明*//****************************************************************/voiddelay1(ucharMS);unsignedintReadTemperature(void);voidInit_DS18B20(void);unsignedcharReadOneChar(void);voidWriteOneChar(unsignedchardat);voiddelay(unsignedinti);/****************************************************************//*主函数*//****************************************************************/voidmain(){unsignedcharTempH,TempL;TMOD|=0x01;//定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;P0=0x00;count=0;while(1){str[5]=0x39;//显示C符号str[1]=tab[TempH/100];//百位温度str[2]=tab[(TempH%100)/10];//十位温度str[3]=tab[(TempH%100)%10]|0x80;//个位温度,带小数点.. .str[4]=tab[TempL];if((TempH%100)/10==3&&(TempH%100)%10>=5&&TempL>0||(TempH%100)/10==3&&(TempH%100)%10<8){beep=1;}elsebeep=0;//温度高于38摄氏度就报警if(flag_get==1)//定时读取当前温度{temp=ReadTemperature();if(temp&0x8000){str[0]=0x40;//符号标志temp=~temp;//取反加1temp+=1;}elsestr[0]=0;TempH=temp>>4;TempL=temp&0x0f;TempL=TempL*6/10;//小数近似处理flag_get=0;}}}/****************************************************************//*定时器中断*//****************************************************************/voidtim(void)interrupt1using1//中断,用于数码管扫描和温度检测间隔.. .{TH0=0xef;//定时器重装值TL0=0xf0;num++;if(num==50){num=0;flag_get=1;//标志位有效second++;if(second>=60){second=0;minute++;}}count++;if(count==1){P0=0;dataled=str[0];}//数码管扫描if(count==2){P0=1;dataled=str[1];}if(count==3){P0=2;dataled=str[2];}if(count==4){P0=3;dataled=str[3];}if(count==5){P0=4;.. .dataled=str[4];}if(count==6){P0=5;dataled=str[5];count=0;}}/****************************************************************//*延时函数*//****************************************************************/voiddelay(unsignedinti)//延时函数{while(i--);}/****************************************************************//*初始化*//****************************************************************/voidInit_DS18B20(void){unsignedcharx=0;DQ=1;//DQ复位delay(8);//稍作延时DQ=0;//单片机将DQ拉低delay(80);//大于480usDQ=1;//拉高总线delay(10);x=DQ;//稍作延时后,如果x=0,则初始化成功;如果x=1,则初始化失败delay(5);}.. ./****************************************************************//*读一个字节*//****************************************************************/unsignedcharReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i--){DQ=0;//给脉冲信号dat>>=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay(5);}return(dat);}/****************************************************************//*写一个字节*//****************************************************************/voidWriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;.. .delay(5);DQ=1;dat>>=1;}delay(5);}/****************************************************************//*读取温度*//****************************************************************/unsignedintReadTemperature(void){unsignedchara=0;unsignedintb=0;unsignedintt=0;Init_DS18B20();WriteOneChar(0xcc);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xcc);//跳过读序号列号的操作WriteOneChar(0xbe);//读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();//低位b=ReadOneChar();//高位b<<=8;t=a+b;return(t);}.. .4系统仿真调试4.1程序调试与运行打开keil程序,执行菜单命令project——newproject创建“基于AT89C51单片机电子体温计设计”项目,并选择单片机型号为AT89C51。执行菜单命令file——new创建文件,输入上述C程序,保存为“基于AT89C51单片机电子体温计设计.C”。在project栏的file管理窗口中右击文件组,选择“addfiletogroup‘sourcegroup1’”,将源程序添加到项目中。执行菜单命令project——opinionsfortarget‘target1’,在弹出的对话框中选择output选项卡,选中createhexfile。在debug选项卡中,选中use:proteusVSMsimulator。执行菜单命令project——buildtarget,编译源程序,如果编译成功,则在outputwindow窗口中显示没有错误,并创建了“基于AT89C51单片机电子体温计设计.HEX”文件。在已绘制好的原理图proteusisis菜单栏中,执行菜单命令debug——useremotedebugmonitor将该项选中,是proteus与keil真正连接起来,使它们联合调试。在keil中执行菜单命令debug——start/stopdebugsession,进行keil调试环境。同时在proteusisis窗口中可以看出proteus也进入了程序调试状态。在keil中按F5键运行程序。4.2结果分析调整DS18B20上的“+”“-”符号,可以看到在显示屏上显示相应的温度。当温度在35~38(不含38)摄氏度时,只显示温度不报警,说明被测者体温正常,如图4.1a、4.1b所示;温度超过38摄氏度时,蜂鸣器会发出报警声,说明被测者发烧了,如图4.2a、4.2b所示。.. .4.3存在问题虽然仿真通过了,但是每次一开机时系统都会显示85度,然后报警,过一会儿后才显示DS18B20上的温度图4.1a37摄氏度显示屏示意图图4.1b37摄氏度DS18B20示意图图4.2a38摄氏度显示屏示意图图4.2b38摄氏度DS18B20示意图.. .5收获与展望通过对“基于AT89C51单片机电子体温计设计”程序的设计与仿真,让我在教材温度测量的设计的基础上更加深入地了解了定时/计数器、中断、总线、A/D转换器等等的应用以及单片机C程序的编写与单片机软件的简单操作和应用。一开始编写程序时总是运行不了,系统一直报错。但是经过本人不断地去改变运行,程序终于得以通过。但是在仿真时又出现了问题,系统的报警总是没有规律地报。仔细查看程序后也终于仿真成功。这让我信心增加了很多,对单片机产生了浓厚的兴趣。虽然可能存在很多问题,比如说对于汇编语言的掌握不是很好以及对软件的操作不是很熟练,但是我相信,随着学习的深入以及我对单片机知识的渴望,不久后一定会克服这些问题的。.. .6对本课程改革意见时光荏苒,岁月如歌,时间如白驹过隙,转眼间一学期就过去了。这学期可谓是一个非常充实的学期,我不仅仅学到了很多知识,更主要的是掌握了很多的应用技能。在此特别感谢张老师,您的精心指导和谆谆教诲让我没齿难忘。您独到的教学方法和耐心的讲解以及创新的教学模式让我受益匪浅,对将来踏入社会将会有极大的帮助。自我感觉本课程的改革很好,方式新颖,学生可以接收地更快,学得更加扎实。唯一不暇之处在于开设的课时有限,不能很好地去完成更深入的学习,尤其是实物操作部分,现在还不具备设计一个产品的能力,希望相关部门以后能多加课时,把实际操作加进去,相信这种方式对大家都会有很大的帮助,与此同时,大家的积极性也会大大地提高。最后衷心的感谢张老师,道一句:“老师,您辛苦了!”7期望成绩A..

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭