单片机+STC89C52++温度传感器.docx
《单片机+STC89C52++温度传感器.docx》由会员分享,可在线阅读,更多相关《单片机+STC89C52++温度传感器.docx(28页珍藏版)》请在冰豆网上搜索。
单片机+STC89C52++温度传感器
单片机数字温度计
摘要:
本设计单片机采用AT89C52芯片,数字温度传感器采用美国DALASS公司的1–Wire器件DS18B20,即单总线器件DS18B20,与单片机组成一个测温系统,当系统上电时,温度传感器就会读出当前环境的温度,并在三位LED数模显示管上显示出当前的温度,该测温仪的测温范围为0℃~110℃,按此要求设计硬件和软件以实现这一功能。
关键词:
单片机STC89C52温度传感器DS18B20;温度测量电子线路单片机汇编语言温度
1引言:
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
单片机在检测和控制系统中得到广泛的应用,温度则是系统常需要测量、控制和保持的一个量。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,该设计控制器使用单片机STC89C52,测温传感器使用DS18B20,用4位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
2总体设计方案:
2.1设计思路:
(1)本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
(2)从中考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案
(2),电路比较简单,软件设计也比较简单,故采用了方案
(2)。
图1 总体设计方框图
2.2设计方框图
根据设计的所需要求分析单片机的工作原理,可得出来温度计电路设计总体设计方框图如图1所示,控制器采用单片机STC89S52,温度传感器采用DS18B20,用4位LED数码管以串口传送数据实现温度显示。
2.3设计主元件电气性能:
1.STC89C52的主要性能:
●与MCS-51单片机产品兼容
●8KFlash字节闪速存储器
●1000次擦写周期
●全静态操作:
0Hz~88Hz
●32个可编程I/O口线
●三个16位定时器/计数器
●八个中断源
●全双工UART串行通道
●低功耗空闲和掉电模式
●掉电后中断可唤醒
●看门狗定时器
●双数据指针
VCC:
电源
GND:
地
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1口:
是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表1所示。
在flash编程和校验时,P1口接收低8位地址字节。
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
表1P1口功能
表2P3口功能
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如上表2所示。
在flash编程和校验时,P3口也接收一些控制信号。
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/PROG:
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在flash编程时,此引脚(PROG)也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。
这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。
否则,ALE将被微弱拉高。
这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:
外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
当STC89C52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接收12伏VPP电压。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
存储器结构
MCS-51器件有单独的程序存储器和数据存储器。
外部程序存储器和数据存储器都可以64K寻址。
程序存储器:
如果EA引脚接地,程序读取只从外部存储器开始。
对于89S52,如果EA接VCC,程序读写先从内部存储器(地址为0000H~1FFFH)开始,接着从外部寻址,寻址地址为:
2000H~FFFFH。
数据存储器:
STC89C52有256字节片内数据存储器。
高128字节与特殊功能寄存器重叠。
也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。
当一条指令访问高于7FH的地址时,寻址方式决定CPU访问高128字节RAM还是特殊功能寄存器空间。
直接寻址方式访问特殊功能寄存器(SFR)
晶振特性
如图2所示,STC89C52单片机有一个用于构成内部振荡器的反相放大器,XTAL1和XTAL2分别是放大器的输入、输出端。
石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器
图2自激振荡器原理图
定时器0和定时器1
在STC89C52中,定时器0和定时器1的操作与89C51一样。
定时器2
定时器2是一个16位定时/计数器,它既可以做定时器,又可以做事件计数器。
其工作方式由特殊寄存器T2CON中的C/T2位选择(如表2所示)。
定时器2有三种工作模式:
捕捉方式、自动重载(向下或向上计数)和波特率发生器。
工作模式由T2CON中的相关位选择。
定时器2有2个8位寄存器:
TH2和TL2。
在定时工作方式中,每个机器周期,TL2寄存器都会加1。
由于一个机器周期由12个晶振周期构成,因此,计数频率就是晶振频率的1/12。
中断
STC89C52有6个中断源:
两个外部中断(INT0和INT1),三个定时中断(定时器0、1、2)和一个串行中断每个中断源都可以通过置位或清除特殊寄存器IE中的相关中断允许控制位分别使得中断源有效或无效。
IE还包括一个中断允许总控制位EA,它能一次禁止所有中断。
定时器2可以被寄存器T2CON中的TF2和EXF2的或逻辑触发。
程序进入中断服务后,这些标志位都可以由硬件清0。
实际上,中断服务程序必须判定是否是TF2或EXF2激活中断,标志位也必须由软件清0。
下表2为中断允许控制寄存器功能。
表3中断允许控制寄存器
2.DS18B20的主要性能
本次设计使用到了由dallas半导体公司生产的ds18b20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。
它具有体积小,接口方便,因而设计中采用了此元器件。
DS1820数字温度计提供9位温度读数,指示器件的温度
特性:
●独特的单线接口只需1个接口引脚即可通信
●多点multidrop能力使分布式温度检测应用得以简化
●不需要外部元件
●可用数据线供电
●不需备份电源
●测量范围从-55至+125增量值为0.5等效的华氏温度范围是-67F至257F
●增量值为0.9F
●以9位数字值方式读出温度
●在1秒典型值内把温度变换为数字
●用户可定义的非易失性的温度告警设置
●告警搜索命令识别和寻址温度在编定的极限之外的器件温度告警情况
●应用范围包括恒温控制工业系统消费类产品温度计或任何热敏系统
图3的方框图表示DS1820的主要部件DS1820有三个主要的数据部件164位激光laseredROM;2温度灵敏元件和3非易失性温度告警触发器TH和TL
图3DS18B20内部结构
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
在单线接口情况下在ROM操作未定建立之前不能使用存贮器和控制操作主机必须首先提供五种ROM操作命令之一1ReadROM(读ROM)2MatchROM(符合ROM),3)SearchROM(搜索ROM),4)SkipROM(跳过ROM),或5AlarmSearch(告警搜索)这些命令对每一器件的64位激光ROM部分进行操作如果在单线上有许多器件那么可以挑选出一个特定的器件并给总线上的主机指示存在多少器件及其类型在成功地执行了ROM操作序列之后可使用存贮器和控制操作然后主机可以提供六种存贮器和控制操作命令之一.
一个控制操作命令指示DS1820完成温度测量该测量的结果将放入DS1820的高速暂存便笺式存贮器Scratchpadmemory通过发出读暂存存储器内容的存储器操作命令可以读出此结果每一温度告警触发器TH和TL构成一个字节的EEPROM如果不对DS1820施加告警搜索命令这些寄存器可用作通用用户存储器使用存储器操作命令可以写TH和TL对这些寄存器的读访问通过便笺存储器所有数据均以最低有效位在前的方式被读写.
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
表4DS18B2012位温度数据
表4是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
如下表为18B20的温度/数据关系
表5DS18B20的温度/数据关系
每一DS1820包括一个唯一的64位长的ROM编码开绐的8位是单线产品系列编码DS1820编码是10h接着的48位是唯一的系列号最后的8位是开始56位CRC见表6,64位ROM和ROM操作控制部分允许DS1820作为一个单线器件工作并遵循单线总线系统一节中所详述的单线协议直到ROM操作协议被满足DS1820控制部分的功能是不可访问的此协议在ROM操作协议流程图中叙述单线总线主机必须首先操作五种ROM操作命令之一1ReadROM(读ROM),2)MatchROM(匹配ROM),3)SearchROM(搜索ROM),4)SkipROM(跳过ROM),或5)AlarmSearch告警搜索在成功地执行了ROM操作序列之后DS1820特定的功能便可访问然后总线上主机可提供六个存贮器和控制功能命令之一.
表664位激光ROM
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。
第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。
第六、七、八个字节用于内部计算。
第九个字节是冗余检验字节。
表7DS18B20暂存寄存器分布
该字节各位的意义如下:
TMR1R011111
R1
R0
分辨率
温度最大转换时间
0
0
9位
93.75ms
0
1
10位
187.5ms
1
0
11位
375ms
1
1
12位
750ms
表8分辨率设置表
低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如上表8所示:
(DS18B20出厂时被设置为12位)
由表9可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表9DS18B20温度转换时间表
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。
因此,可用多只DS18B20同时测量温度并进行报警搜索。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。
主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
ROM操作命令
一旦总线主机检测到从属器件的存在它便可以发出器件ROM操作命令之一所有ROM操
作命令均为8位长这些命令列表如下参见图6的流程图
ReadROM(读ROM)[33h]
此命令允许总线主机读DS1820的8位产品系列编码唯一的48位序列号以及8位的CRC
此命令只能在总线上仅有一个DS1820的情况下可以使用如果总线上存在多于一个的从属器件那么当所有从片企图同时发送时将发生数据冲突的现象漏极开路会产生线与的结果
MatchROM(符合ROM)[55h]
符合ROM命令后继以64位的ROM数据序列允许总线主机对多点总线上特定的DS1820
寻址只有与64位ROM序列严格相符的DS1820才能对后继的存贮器操作命令作出响应所有与64位ROM序列不符的从片将等待复位脉冲此命令在总线上有单个或多个器件的情况下均可使用SkipROM(跳过ROM)[CCh]
在单点总线系统中此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间如果在总线上存在多于一个的从属器件而且在SkipROM命令之后发出读命令那么由于多个从片同时发送数据会在总线上发生数据冲突漏极开路下拉会产生线与的效果
earchROM(搜索ROM)[F0h]
当系统开始工作时总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码
搜索ROM命令允许总线主机使用一种消去elimination处理来识别总线上所有从片的64位
表10DS1820命令集
AlarmSearch(告警搜索)[ECh]
此命令的流程与搜索ROM命令相同但是仅在最近一次温度测量出现告警的情况下DS1820才对此命令作出响应告警的条件定义为温度高于TH或低于TL只要DS1820一上电告警条件DS1820就保持在设置状态直到另一次温度测量显示出非告警值或者改变TH或TL的设置使得测量值再一次位于允许的范围之内贮存在EEPROM内的触发器值用于告警
表10为DS1820命令集:
3系统整体硬件电路
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主板电路等,通过利用电路CAD工具pretelDXP可画出如图4所示的电路图。
图4电路原理图
因为此次制作的电路为自制的PCB板,再经过电路CAD工具ProtelDXP的电路板PCB绘出电路所需PCB版图制作出自制的PCB板.
3设计原理分析:
3.1时钟电路的设计:
通过设置T2CON(见表2)中的TCLK或RCLK可选择定时器2作为波特率发生器。
如果定时器2作为发送或接收波特率发生器,定时器1可用作它用,发送和接收的波特率可以不同。
设置RCLK和(或)TCLK可以使定时器2工作于波特率产生模式。
波特率产生工作模式与自动重载模式相似,因此,TH2的翻转使得定时器2寄存器重载被软件预置16位值的RCAP2H和RCAP2L中的值。
模式1和模式3的波特率由定时器2溢出速率决定,定时器可设置成定时器,也可为计数器。
在多数应用情况下,一般配置成定时方式(CP/T2=0)。
定时器2用于定时器操作与波特率发生器有所不同,它在每一机器周期(1/12晶振周期)都会增加;然而,作为波特率发生器,它在每一机器状态(1/2晶振周期)都会增加。
波特率计算公式如下:
模式1和模式3的波特率=晶振频率/32⨯[65536-(RCAP2H,RCAP2L)]
3.2控制电路的设计:
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图5所示。
图5主程序流程图
图6读温度流程图
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
图7温度转换流程图
3.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图8所示。
图8 计算温度流程图 图9 显示数据刷新流程图
所编写的程序如下:
;******************************************************************************
;说明:
程序预定义
;******************************************************************************
LED7A_CTRLEQUP1.7;数码管第一位控制引脚(0为有效,1为无效)
LED7B_CTRLEQUP1.6;数码管第二位控制引脚
LED7C_CTRLEQUP1.5;数码管第三位控制引脚
LED7D_CTRLEQUP1.4;数码管第四位控制引脚
LED7_STATUSEQUP0;数码管状态引脚(0为有效,1为无效)
LED7A_DATAEQU70H;数码管第一位显示值(千位)
LED7B_DATAEQU71H;数码管第二位显示值(百位)
LED7C_DATAEQU72H;数码管第三位显示值(十位)
LED7D_DATAEQU73H;数码管第四位显示值(个位)
LED7_NUMEQU74H;数码管动态扫描值(值为从0到3)
DQEQUP3.2;温度芯片数据端
TEMLEQU76H;温度数据低位
TEMHEQU77H;温度数据高位
;******************************************************************************
;说明:
程序开始
;******************************************************************************
ORG0000H;程序首地址PC=0000H
JMPSTART;程序跳转到STARTPC=0030H
ORG000BH;T0中断程序入口
JMPLED7SCAN;跳到数码管动态扫描处理程序
ORG0030H;程序开始
START:
MOVDPTR,#LED7TAB;数码管显示码表地址送DPTR
MOVLED7_NUM,#0;数码管动态扫描值至0,扫描第一位
;T0中断设定
MOVTMOD,#00000001B;使用T0:
GATE=0,C/T=0(定时),M1M0=01(工作方式1)
MOVTH0,#0ECH;中断时间为5毫秒
MOVTL0,#078H
SETBET0;允许T0中断
SETBTR0;使T0工作
SETBEA;总中断开启
L1:
MOVLED7A_DATA,#16;数码管第一位初始值
MOVLED7B_DATA,#16;数码管第二位初始值
MOVLED7C_DATA,#0;数码管第三位初始值
MOVLED7D_DATA,#0;数码管第四位初始值
L2:
CLRTR0
SETBDQ
CALLINIT;初始化
MOVA,