标题:
汇编51单片机DS18B20数码管显示温度时间
[打印本页]
作者:
YH66
时间:
2020-5-28 15:50
标题:
汇编51单片机DS18B20数码管显示温度时间
本文为通过51单片机进行DS18B20的温度采集,在6位数码管上显示时间与温度,并通过扫描方式输入9位按键,已封装好了各个按键的功能区。
1.jpg
(99.75 KB, 下载次数: 25)
下载附件
2020-5-28 15:46 上传
右侧为设定温度,可通过按键进行设置,左侧27为检测温度,为DS18B20实测数据
23.jpg
(96.37 KB, 下载次数: 27)
下载附件
2020-5-28 15:49 上传
时间显示,为2时3分13秒,各个时间也可通过按键设置
程序内有详细注释
单片机源程序如下:
;*************************************************
;***************温度时间显示模板.HUI**************
;*************************************************
KEY EQU 40H ;存放键值
SECOND EQU 37H
MINUTE EQU 38H
HOUR EQU 32H
TCNT EQU 34H ;时间计数
FLAG1 BIT 00H ; FLAG1:标志位,为"1"时表示检测到DS18B20
TEMPER_NUM EQU 50H ; TEMPER_NUM:保存读出的温度数据
TEMPER_L EQU 36H ;温度的低位
TEMPER_H EQU 35H ;温度的高位
TEMP EQU 34H ;临时存放温度数据的单元
SJGW EQU 30H ;存放显示温度的个位数
SJSW EQU 31H ;存放显示温度的十位数
DQ BIT P1.3 ;DQ:DS18B20的数据总线接脚
DIS_FLAG BIT 01H ;显示标志,为1时显示温度
ORG 00H
AJMP MAIN
ORG 0BH
LJMP INT_T0
;*********************子程序*********************
;**************中断子程序************************
INT_T0: PUSH ACC
PUSH PSW
MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000);MOD 256
INC TCNT
MOV A,TCNT
CJNE A,#20,RETUNE ;计时1秒
INC SECOND
MOV TCNT,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#24,RETUNE
MOV HOUR,#0
RETUNE: POP PSW
POP ACC
RETI
;*****************显示子程序*********************
DISPLAY1: MOV A,SECOND ;显示秒
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,#00000100B
MOV P0,A
LCALL DELAY1
MOV A,B
MOVC A,@A+DPTR
MOV P1,#00000101B
MOV P0,A
LCALL DELAY1
MOV A,MINUTE ;显示分钟
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,#00000010B
MOV P0,A
LCALL DELAY1
MOV A,B
MOVC A,@A+DPTR
MOV P1,#00000011B
MOV P0,A
LCALL DELAY1
MOV A,HOUR ;显示小时
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P0,A
MOV P1,#00000000B
LCALL DELAY1
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
MOV P1,#00000001B
LCALL DELAY1
RET
TABLE: DB 3FH,06H,5BH,4FH
DB 66H,6DH,7DH,07H
DB 7FH,6FH
;*****************DS18B20***********************
;*****************DS18B20***********************
;*****************DS18B20***********************
DS18B20: MOV TEMPER_NUM,A
MOV TEMPER_L,#00
MOV TEMPER_H,#00
ACALL INIT_1820
ACALL TEMPER
RET
TEMPER: ACALL RE_CONFIG
ACALL GET_TEMPER
ACALL TEMPER_COV
ACALL DISPLAY
RET
INIT_1820: SETB DQ ;初始化程序
NOP
CLR DQ ;主机发出延时540us的复位低脉冲
MOV R0,#36
LCALL DELAY
SETB DQ ;然后拉高数据线
NOP
NOP
MOV R0,#36
TSR2: JNB DQ,TSR3 ;等待DS18B20的回应
DJNZ R0,TSR2
LJMP TSR4; 延时
TSR3: SETB FLAG1; 置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#06BH; 200us
TSR6: DJNZ R0,TSR6; 复位成功!时序要求延时一段时间
TSR7: SETB DQ
RET
; 重新写DS18B20暂存存储器设定值
RE_CONFIG: JB FLAG1,RE_CONFIG1; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:MOV A,#0CCH; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H; 不 TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#1FH; 选择9位温度分辨率
LCALL WRITE_1820
RET
; 读出转换后的温度值
GET_TEMPER: SETB DQ; 定时入口
LCALL INIT_1820
JB FLAG1,TSS2
RET; 若DS18B20不存在则返回
TSS2: MOV A,#0CCH; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H; 发出温度转换命令
LCALL WRITE_1820
MOV R0,#50;等待A/D转换结束,12位的话750us
LCALL DELAY
LCALL INIT_1820
MOV A,#0CCH; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200
MOV TEMPER_NUM,A; 将读出的温度数据保存
RET
; 读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820: MOV R2,#8
RE1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
; 写DS18B20的程序
WRITE_1820: MOV R2,#8
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200: MOV R4,#2; 将温度高位和低位从DS18B20中读出
MOV R1,#36H; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00: MOV R2,#8
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
; 将从DS18B20中读出的温度数据进行转换
TEMPER_COV: MOV A,#0F0H
ANL A,TEMPER_L; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A; 保存变换后的温度数据
LCALL BIN_BCD
RET
; 将16进制的温度数据转换成压缩BCD码
BIN_BCD: MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET
TEMP_TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
T2_10: MOV B,#16
DIV AB
MOV SJSW,A;SJSW中存放温度的十位数
MOV SJGW,B;SJGW中存放温度的个位数
RET
DISPLAY:PUSH ACC ;保存ACC
PUSH PSW
MOV A, TEMPER_NUM
LCALL T2_10
MOV A, SJGW
MOV DPTR,# XSTAB ;取得数据
MOVC A, @A+DPTR ;提取字模
MOV P0,A ;显示温度的个位数
SETB P1.0
CLR P1.1
CLR P1.2
ACALL DS1MS ;调用显示1ms延时程序
MOV A,SJSW
MOVC A, @A+DPTR ;提取字模
MOV P0,A ;显示温度的十位数
CLR P1.0
CLR P1.1
CLR P1.2
CALL DS1MS ;显示1ms
POP PSW
POP ACC ;出栈
RET ;返回调用
XSTAB: DB 3FH,06H,5BH,4FH
DB 66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H
;//*****************************************//
SCAN_KEY:
MOV P2,#0EH
MOV A,P2
ANL A,#0EH
XRL A,#0EH
JZ NO_KEY
ACALL DELAY1
MOV P2,#0EH
MOV A,P2
ANL A,#0EH
XRL A,#0EH
JZ NO_KEY
MOV R2,#11011111B
SCAN: MOV A,R2
MOV P2,A
MOV A,P2
ANL A,#00001110B
MOV R3,A
CJNE A,#0EH,KEY_PRSD
MOV A,R2
RL A
MOV R2,A
XRL A,#11111110B
JNZ SCAN
NO_KEY: MOV KEY,#0FFH
RET
KEY_PRSD: MOV A,R2
ANL A,#11100000B
ORL A,R3
MOV R4,A
MOV KEY,#00H
MOV DPTR,#KEY_TAB
CAL_VAL: MOV A,KEY
MOVC A,@A+DPTR
XRL A,R4
JZ FIXED
INC KEY
SJMP CAL_VAL
FIXED: MOV A,P2
ANL A,#0EH
XRL A,#0EH
JNZ FIXED
ACALL DELAY1
MOV A,P2
ANL A,#0EH
XRL A,#0EH
JNZ FIXED
KEY_TAB: DB 66H,6AH,6CH,0A6H,0AAH,0ACH,0C6H,0CAH,0CCH
;延时1ms
DELAY1: MOV R6,#10
D10: MOV R7,#100
DJNZ R7,$
DJNZ R6,D10
RET
DS1MS: MOV R1,#10
DSLLO: MOV R2,#100
DJNZ R2,$
DJNZ R1,DSLLO
RET ;延时返回
DELAY:
LOOP: MOV R1,#06H
LOOP1: DJNZ R1,LOOP1
DJNZ R0,LOOP
RET
;500毫秒延时子程序
DELAY500: MOV R4,#248
DA222: MOV R5,#248
DJNZ R5,$
DJNZ R4,DA222
RET
;显示程序
;*********************主函数*********************
MAIN: CLR DIS_FLAG
MOV DPTR,#TABLE
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV TMOD,#01H
MOV TH0,#(65536-50000)/256 ;定时50毫秒
MOV TL0,#(65536-50000);MOD 256
MOV IE,#82H
SETB TR0
ACALL DS18B20
MAIN_LOOP: ACALL SCAN_KEY
MOV R0,KEY
;按键处理程序,所有的都加载这下面
CJNE R0,#0FFH,NEXT0
AJMP NEXT10
NEXT0: CJNE R0,#0,NEXT1
CPL DIS_FLAG
AJMP NEXT10
NEXT1: CJNE R0,#1,NEXT2
INC HOUR
MOV A,HOUR
CJNE A,#24,BACK1
MOV HOUR,#0
BACK1: AJMP NEXT10
NEXT2: CJNE R0,#2,NEXT3
INC MINUTE
MOV A,MINUTE
CJNE A,#60,BACK2
MOV MINUTE,#0
BACK2: AJMP NEXT10
NEXT3: CJNE R0,#3,NEXT4
NEXT4: CJNE R0,#4,NEXT5
NEXT5: CJNE R0,#5,NEXT6
NEXT6: CJNE R0,#6,NEXT7
NEXT7: CJNE R0,#7,NEXT8
NEXT8: CJNE R0,#8,NEXT9
NEXT9: CJNE R0,#9,NEXT10
NEXT10: JB DIS_FLAG,TEM;什么都没按下
ACALL DISPLAY1;显示时间
AJMP MAIN_LOOP
TEM: ACALL TEMPER ;显示温度
AJMP MAIN_LOOP
END
复制代码
程序51hei提供下载:
温度+时间程序模板.zip
(33.57 KB, 下载次数: 23)
2020-5-28 15:50 上传
点击文件名下载附件
注意:汇编
下载积分: 黑币 -5
作者:
YH66
时间:
2020-5-28 15:51
这相当于一个框架,只需要在框架内加入自己的程序就可以,有较好的扩展性
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1