实验六:温度传感DS18B20实验(数码管显示)
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mazhijing.blog.51cto.com/215535/39704 |
一、实验目的:
1) 以AT89S52X单片机为核心器件,组成一个数字式温度计。
2) 了解DS18B20的工作原理及使用方法。
3) 掌握DS18B20读写时序的编程方法。
4) 锻炼单片机综合应用和开发的能力
1)显示当前温度:在数码管显示模块上前四个数码管显示当前温度(整数小数各两位)。
2)编程要求:用汇编语言编写此程序,写出各个子程序的功能并在主要的指令后加上必要地文字说明增加程序的可读性。
(1)硬件电路原理图:
如图-1所示,
![]() ![]() ![]() 图-1中温度测量使用P1.3端口,使用DS18B20器件,显示使用4位数码管。
(2)工作原理:本实验通过DS18B20采集环境温度,当单片机检测到DSl820的存在便可以发出ROM操作命令之一,Read ROM(读ROM) Match ROM(匹配ROM) Skip ROM(跳过ROM) Search ROM(搜索ROM) Alarm search(告警搜索) 然后对发存储器操作命令对DS18B20进行读写数据转换等操作。单片机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位,然后将读到的数据转换BCD码在数码管显示出来(DS18B20的详细资料详见附录)。
四.软件流程设计:
该系统采用的方法,根据初始化温度传感器,再就是显示温度数值。测量出来温度软件系统基本流程如图所示:
![]() ![]() 五.参考程序:
/*------------------------------内存分配声明--------------------------*/
TEMPER_L EQU 31H ;用于保存读出温度的低字节
TEMPER_H EQU 30H ;用于保存读出温度的高字节
T_DF EQU 33H ;FORMAT后的小数部分(decimal fraction),半字节的温度小数(存在低四位)
T_INTEGER EQU 32H ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节
FLAG BIT 20H ;标志位
DAT BIT P1.3 ;DS18B20数据线
/*------------------------------主函数开始-----------------------------*/
ORG 0000H ;函数入口地址
AJMP MAIN ;跳转指令
ORG 0030H
CLR EA ;使用DS18B20一定要禁止中断
MOV SP,#60H
MOV T_DF,#00H ;赋初始温度为30度
MOV T_INTEGER,#30H
START: LCALL GET_TEMPER ;调用读温度子程序
LCALL T_FORMAT ;将读出的2字节温度格式化,并转换为压缩BCD码
LCALL DISPLAY ;显示温度
AJMP START
/*-----------------------DS18B20的温度转换子程序-----------------------*/
GET_TEMPER:
LCALL Set_18B20 ;调用DS18B20初始化程序
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;调用写DS18B20的子程序
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;用显示温度(持续1s左右)来等待AD转换结束,12位的话要转换750ms
LCALL Set_18B20 ;准备读温度前先初始化
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820 ;读DS18B20的程序
RET
/*--------------------------DS18B20初始化程序--------------------------*/
Set_18B20:
SETB DAT ;置位
NOP ;空操作
CLR DAT ;清零
MOV R2,#250 ;主机发出延时500微秒的复位低脉冲
DJNZ R2,$ ;自减(-1)循环
SETB DAT ;然后拉高数据线
MOV R2,#30
DJNZ R2,$ ;延时60us等待DS18B20回应
JNB DAT,INIT1
JMP Set_18B20 ;超时而没有响应,重新初始化
INIT1: MOV R2,#120
DJNZ R2,$ ;延时240us
JB DAT,INIT2 ;数据变高,初始化成功
JMP Set_18B20
INIT2: MOV R2,#240
DJNZ R2,$
RET
/*-----------------写DS18B20的子程序(有具体的时序要求)-----------------*/
WRITE_1820:
MOV R2,#8 ;共8位数据
WR0: CLR DAT
MOV R3,#6
DJNZ R3,$
RRC A
MOV DAT,C
MOV R3,#20
DJNZ R3,$
SETB DAT
NOP
NOP
DJNZ R2,WR0
SETB DAT
RET
/*------读DS18B20的程序,从DS18B20中读出两个字节的温度数据----------------*/
READ_1820:
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ;低位存入31H(TEMPER_L)
RE0: MOV R2,#8
RE1: SETB DAT
NOP
NOP
CLR DAT
NOP
NOP
SETB DAT
MOV R3,#4
DJNZ R3,$
MOV C,DAT
RRC A
MOV R3,#30
DJNZ R3,$
DJNZ R2,RE1
MOV @R1,A
DEC R1 ;高位存入30H(TEMPER_H)
DJNZ R4,RE0
RET
/*------整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)-----*/
T_FORMAT:
MOV A,#0FH
ANL A,TEMPER_L
MOV T_DF,A ;获得小数部分(4位)
MOV A,TEMPER_L
SWAP A
MOV @R0,A
MOV A,TEMPER_H
SWAP A
XCHD A,@R0
MOV T_INTEGER,A ;获得整数部分(1字节)
TO_BCD: MOV A,T_INTEGER
MOV B,#10
DIV AB
SWAP A
ADD A,B
MOV T_INTEGER,A ;整数部分压缩BCD码送T_INTEGER
MOV A,T_DF
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV R2,A ;暂存R2
MOV A, B
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV B,A
MOV A,R2
SWAP A
ADD A,B
MOV T_DF,A ;小数部分压缩BCD码送T_DF
RET
/*---------------------------显示温度子程序----------------------------*/
DISPLAY:MOV R1,#250
DISP1: MOV A,T_INTEGER
MOV R3,#0FEH
MOV R4,#0FDH
SETB FLAG
DISP2: CPL FLAG
MOV B,#10H
DIV AB
MOV R2,A ;高位送R2暂存
MOV DPTR,#2000H ;字位口
MOV A,R3
MOVX @DPTR,A ;送字位
MOV A,R2 ;字型R2送A
MOV DPTR,#TAB ;表首地址送DPTR
MOVC A,@A+DPTR ;查表
MOV DPTR,#6000H ;字型口
MOVX @DPTR,A ;送字型
CALL D1MS ;延时
MOV A,#0FFH
MOVX @DPTR,A ;关闭字型显示
MOV R2,B ;低位送R2暂存
MOV DPTR,#2000H ;字位口
MOV A,R4
MOVX @DPTR,A ;送字位
MOV A,R2 ;字型R2送A
MOV DPTR,#TAB ;表首地址送DPTR
MOVC A,@A+DPTR ;查表
JNB FLAG,D1 ;FLAG 为零,跳到D1
JMP D2 ;否则,跳到D2
D1: ANL A,#7FH ;相与
D2: MOV DPTR,#6000H ;字型口
MOVX @DPTR,A ;送字型
CALL D1MS ;延时
MOV A,#0FFH
MOVX @DPTR,A ;关闭字型显示
MOV A,T_DF
MOV R3,#0FBH
MOV R4,#
JNB FLAG,DISP2
DJNZ R1,DISP1
RET
/*-------------------------1mS延时(按12MHZ算)--------------------------*/
D1MS: MOV R7,#250
LOOP0: NOP
NOP
DJNZ R7,LOOP0
RET
/*-------------------------共阳数码管对应字型表-------------------------*/
TAB: DB
; 0 1 2 3 4 5 6 7 对应内容
DB 80H,90H,88H,83H,
; 8
END
六.实验步骤:
1.读DS18B20的数据手册,弄明白其时序及编程思路。
2.看实验开发板的连线手册,分析计算出显示模块数码管的物理地址。
3.画出程序流程图编写相应的程序。
4.将程序下载到开发板上并调试程序,使程序达到预定功能。
1.写出项目方案,包括硬件设计方案和软件设计方案。
2.给出电路原理图和程序流程图的设计。
3.提供程序清单,并加以注释。
4.在调试过程中发现了哪些问题?你是怎么解决的?
5.总结项目开发的经验
八.思考题:
本实验实现了单点的温度采集,你能否在本实验的基础上设计实验实现多点温度采集的系统。
附录
数字温度传感器DS1820(DS18B20)的应用
一 单线数字温度计DSl820介绍
DSl820数字温度计提供9位(二进制)温度读数指示器件的温度信息经过单线接口送入DSl820或从DSl820送出因此从主机CPU到DSl820仅需一条线(和地线)DSl820的电源可以由数据线本身提供而不需要外部电源因为每一个DSl820在出厂时已经给定了唯一的序号因此任意多个DSl820可以存放在同一条单线总线上这允许在许多不同的地方放置温度敏感器件DSl820的测量范围从-55到+125增量值为0.5 |






