知部朮噺0
INT1(P33):
外部屮慚
T(XP34)=定时黑0外部樹入
T1(P35):
应:
时詰1冷卜部眉入
WR(F3◎:
产紳竝谢fr诽婕J|;忙专
RD(P37)外祁敌.抓存蛀曙i•:
;打
RST
9
10
斗
I
貝何:
呷晶撮rr运和,只豐冥何悴脚出现2个机器周期烏电屮LU珂亘位.内部带屯阻连接到VssdKH理一牛外部ife容接HVcefl.
ALE
30
33
27
O
地址镇存愷龍:
在访问外部存储时》・出關冲用束镇存低地址的字节■在正常皓况下,綸出1A5的振鵲频率可以当作外BE时懈或定时.谊童毎抉苗问外部和•ALE以冲羁被
.',U^.AJJE可L乩通.:
设讥SFR竹aiixliLarvO设时V||AUE.煌背WUE几適白MOVX卅9削城薄満
PSEN
29
32
27
O
程序存備ttfife:
凄外部程序存储一当从外部读取程序时.PSEN超亍机器周期被滋活曲按“狂访问外部數碾器PSEN冇效,防列内部秽序旳PEEM匕散
EAVpp
31
35
29
I
外部訂址便龍/呵和电用:
EA•鱼颈置低“訪间整亍艸苦;程序存條罄时.如畢EA为面时.棉执材内部程序.障非程序计数1K可器人于0EFFFH可纠訪何4KHSNnlFFFH可朝访创SK3FFFH叫以讪何】<5K:
竺f牛”7FFFH厲昉|'呵
强K黠件一這引幅在编机时接12V編和止屮CWpp).
XIAL1
19
21
15
2
-眸1:
品艇和内部时钟小上:
输
XTAL2
IS
2u
14
O
品怦K品抓谕出
3.2数字温度传感器DS18B20321DS18B20的主要特性:
1、适应电压范围更宽,电压范围:
3.0〜5.5V,在寄生电源方式下可由数据线供电;
2、独特的单线接口方式,DS18B2在与微处理器连接时仅需要一条口线即可实现
微处理器与DS18B2的双向通讯;
3、DS18B2支持多点组网功能,多个DS18B2可以并联在唯一的三线上,实现组网多点测温;
4、DS18B2在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;
5、温范围—55E〜+125C,在-10〜+85C时精度为土0.5C;
6可编程的分辨率为9〜12位,对应的可分辨温度分别为0.5C、0.25C、0.125C和0.0625C,可实现高精度测温;
7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750mS内把温度值转换为数字,速度更快;
8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU同时可传送CR校验码,具有极强的抗干扰纠错能力;
9、负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
3.2.2DS18B20工作原理:
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因
分辨率不同而不同,且温度转换时的延时时间由2s减为750msDS18B20测温
原理如图3-2所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生
固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55C所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3-2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图3-2
3.2.3DS18B20的外形和内部结构:
1、外形及引脚(见图3-3)
图3-3
(1)GND为电源地;
(2)DQ为数字信号输入/输出端;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)
2、DS18B2C内部结构:
图3-4
由图3-4可知,内部结构主要由四部分组成:
64位激光ROM温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
3.2.4DS18B20主要的数据部件:
1、64bit激光ROM
激光ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位激光ROM勺排列是:
开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码
(CRC=X8+X5+X4+1,如图3-5。
光刻ROM勺作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
苦仪匚知.代眄葩咋惋廿■卢禺枣蚁峠
64医雜尢川
图3-5
2、DS18B2C中的温度传感器
DS18B2冲的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625C/LSB形式表达,其中S为符号位。
具体见图3-6:
bill
bit5
bit4
hrt3
btiI
bitI
bitO
LS
2l
F1
也]左
Mtu
Mli.
biiLL
hit】0
tilb
bis
MS
s
s
S
s
24
图3-6:
DS18B20温度值格式表
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例:
+125C的数字输出为07D0H+25.0625C为0191H,-25.0625C的数字输
出为FF6FH-55C的数字输出为FC90H常见温度数据见图3-7。
TEMPURA1ILU】
DIGITALOUTPUT
IHtrlLAJ(>l1Pl1
〔氏“
4]23aC
oouooi
07D0U
低C*
i:
HJ.-:
;■'!
?
l'-l
0550b
r2506257C
OOtoOOOl1001W01
C191h
+10125C
OCGU0(i):
ilUHlOOlO
OOA2h
-0.5C
1X)0000000000i000
OCOSh
化
0000W00001-:
'I;-'-;;'
OOOOh
-0.5(
HUmjmilooo
FHlSh
-10125匚
MIL111】(H01111[i
rr?
iii
二伽2、「
]HE]110OHOMH
1;列h
55C
HitH00100]0000
FC90I1
■丁hepo认reset耐【ueofIhetemp即萌ur亡叱回Herj$榻〒I
图3-7DS18B20温度数据表
3、DS18B20温度传感器的高速RAM存储器
高速暂存存储器由9个字节组成,其分配如图3-8所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
第九个字节是冗余检验字节。
寄存器内容
字节地址
温度值低位(LSByte)
0
温度值高位(MSByte)
1
高温限值(TH)
2
低温限值(TL)
3
配置寄存器
4
保留
5
保留
6
保留
7
CRC校验值
8
图3-8DS18B20暂存寄存器分布
4、DS18B2C配置寄存器
该字节各位的意义如图3-9:
TM
R1
R0
1
1
1
1
1
图3-9:
配置寄存器结构
低五位一直都是"1",TM是测试模式位,用于设置DS18B2C在工作模式还是在测试模式。
在DS18B2C出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如图3-10:
(DS18B20出厂时分辨率被设置为12位)
R1
R0
分辨率
温度最大转换时间
0
0
9位
93.75ms
0
1
10位
187.5ms
1
0
11位
375ms
1
1
12位
750ms
图3-10
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM旨令,最后发送RAM旨令,这样才能对DS18B20进行预定的操作。
复位要求主CPU各数据线下拉500微秒,然后释放,当DS18B20攵到信号后等待16〜60微秒左右,后发出60〜240微秒的存在低脉冲,主CPU攵到此信号表示复位成功。
表6:
ROM指令表
指令
约定代码
功能
读ROM
符合
ROM
33H
55H
读DS1820温度传感器ROM中的编码(即64位地址)
发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。
搜索
ROM
0FOH
用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。
为操作各器件作好准备。
跳过
ROM
0CCH
忽略64位ROM地址,直接向DS1820发温度变换命令。
适用于单片工作。
告警^搜索命令
0ECH
执行后只有温度超过设定值上限或下限的片子才做出响应。
表6:
RAM指令表
指令
约定代码
功能
温度变换
44H
启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。
结果存入内部9字节RAM中0
读暂存器
0BEH
读内部RAM中9字节的内容
写暂存器
4EH
发出向内部RAM勺3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。
复制暂存器
48H
将RAM中第3、4字节的内容复制到EEPROI中o
重调
EEPROM
0B8H
将EEPROI中内容恢复到RAM中的第3、4字节。
读供电方式
1
0B4H
读DS1820的供电模式。
寄生供电时DS1820发送“0”,夕卜接电源供电DS1820发送“1”。
325DS18B20初始化及读写时序:
1•初始化序列:
复位和应答脉冲
单总线上的所有通信都是以初始化序列开始,包括主机发出复位脉冲及从机
的应答脉冲。
如图3-11所示当从机发出响应主机的应答脉冲时,即向主机表明它
处于总线上且工作准备就绪,在主机初始化过程主机通过拉低单总线至少480s
以产生Tx复位脉冲,接着主机释放总线并进入接收模式Rx,当总线被释放后,5k上拉电阻将单总线拉高在单总线器件检测到上升沿后延时15-60s,接着通
过拉低总线60-240s以产生应答脉冲脉冲。
"主机拉丘总线
—从机检低总址
电阻上拉
图3-11
2.读/写时隙
在写时隙期间主机向单总线器件写入数据而在读时隙期间主机读入来自从机的数据,在每一个时隙总线只能传输一位数据。
2.1写时隙
存在两种写时隙写1和写0,主机采用写1时隙向从机写入1,而采用写0时隙向从机写入0,所有写时隙至少需要60s,且在两次独立的写时隙之间至少需要1s的恢复时间,两种写时隙均起始于主机拉低总线,如图3-12所示,产生
写1时隙的方式:
主机在拉低总线后接着必须在15s之内释放总线,由5k上拉电阻将总线拉至高电平而产生。
写0时隙的方式:
在主机拉低总线后只需在整个时隙期间保持低电平即可,至少60s,在写时隙起始后15-60s期间单总线器件采样总线电平状态。
如果在此期间采样为高电平则逻辑1被写入该器件;如果为0则写入逻辑0。
2.2读时隙
单总线器件仅在主机发出读时隙时才向主机传输数据,所以在主机发出读数据命令后必须马上产生读时隙以便从机能够传输数据。
所有读时隙至少需要60
s,且在两次独立的读时隙之间至少需要1s的恢复时间,每个读时隙都由主机发起至少拉低总线1s,如图3-13所示,在主机发起读时隙之后,单总线器件才开始在总线上发送0或1,若从机发送1则保持总线为高电平;若发送0,则拉低总线。
当发送0时,从机在该时隙结束后释放总线,由上拉电阻将总线拉回至空闲高电平状态,从机发出的数据在起始时隙之后保持有效时间15s。
因而主机
在读时隙期间必须释放总线,并且在时隙起始后的15s之内采样总线状态。
图3-13图3-14
3.3设计电路图及功能说明
见下页图3-14
功能说明:
(1)DS18B20接在P3.7口上,采集温度数据,输入单片机
(2)数码管动态显示部分:
8位数据线接在P1口;4位控制线接在P2.0~P2.3,并使用与非门驱动。
(3)
发光二极管:
单片机判断温度高于50°C时红灯亮,否则绿灯亮
图3-14
四.系统程序的设计
4.1主程序
通过主程序调用各个子程序,实现温度实时显示,读出并处理温度值,利用中断计时,每隔1s测量一次温度。
程序框图如图4-1
4.2读出温度子程序
读出温度子程序就是读出RAM中LSM和MSB两个字节,框图入图4-2所示。
4.3温度转换命令子程序温度转换子程序就是向传感器发温度转换命令,由于本程序中使用的分辨率位12位,转换时间为750ms,因此程序采用中断计时,每过1s才去转化一次温度。
具体过程见图4-3
4.4计算温度子程序
计算温度子程序将RAM中读取的温度值进行BCD码转换,并标记正负号,如图4.4所示
4.5显示数据刷新子程序
显示子程序是从RAM对应单元中读出处理好的小数位,十位,个位,符号位,查对应的表可得对应数码管所要显示的字型码。
图4-2读取温度子程序流程图
图4-1DS18B20温度计主程序框图
图4-3温度转化命令子程序流程图
图4.4计算温度子程序流程图
4.6程序源代码
FLAG
BIT
24H
SIGN
BIT
FLAG.1
ABOVE1OO
BIT
FLAG.2
REDLIGHT
EQU
P3.O
GREENLIGHT
EQU
P3.1
BITST
DATA
2OH
TIMEH
EQU
OD8H
;T0中断计时,方式一,1s初值
TIMEL
EQU
OFOH
TEMPHEAD
EQU
36H
TIME1SOK
BIT
BITST.1
INTFIRST
BIT
BITST.2
PORT
EQU
P3.7
TEMPL
DATA
26H
TEMPH
DATA
27H
TEMPHC
DATA
28H
TEMPLC
DATA
29H
ORG0000H
LJMPSTART
ORG000BH
LJMPINT_START
ORG100H
;主函数开始处
START:
MOVSP,#60H;堆栈指针初始化
CLRRAM:
;清空RAM数据子程序:
数据较多需使用RAM中单元作为标志位
MOVR0,#20H
CLRRAM_LOOP:
MOV@R0,#00H
INCR0
CJNER0,#80H,CLRRAM_LOOP
INT_CONFIG:
;中断配置:
开启内部定时中断TO,每过1s刷新一次数据
MOVTMOD,#21H
MOVTHO,#TIMEH
MOVTLO,#TIMEL
SETBETO
SETBTRO
SETBEA
MOVPSW,#OOH
CLRINTFIRST
SJMPMAIN
INT_START:
PUSHPSW
MOVPSW,#1OH
MOVTHO,#TIMEH
MOVTL0,#TIMEL
INCR7
CJNER7,#64H,INT
MOVR7,#00H
SETBTIME1SOK
INT:
POPPSW
RETI
MAIN:
;TIME1SOK=0,表示中断开启,计时进;行中,将循环刷新LED
;单片机内部进行温度转换
LCALLDISP
JNBTIME1SOK,MAINCLRTIME1SOK
JNBINTFIRST,MAIN2
LCALLREAD_TEMP
LCALLCONVTEMP
LCALLDISPBCD
LCALLDISP
MAIN2:
LCALLCONVER_TEMPSETBINTFIRSTLJMPMAIN
・************************************************************J
;DS18B20底层功能子函数定义:
;INIT_DS:
初始化DB0832
;READ_BYTE:
:
读取DS18B20一字节数据
;WRITE_BYTE:
写入DS18B20一字节数据,即写入ROM命令
・********************************************