📄 cewen.asm
字号:
;*************************************************
;单片机内存分配申明!
;*************************************************
TEMPER_L EQU 40H ;用于保存读出温度的低8位
TEMPER_H EQU 41H ;用于保存读出温度的高8位
FLAG1 EQU 38H ;是否检测到DS18B20标志位
TEMPL EQU 30H ;用于保存读出温度的低8位
TEMPH EQU 31H ;用于保存读出温度的高8位
TEMPHC EQU 32H ;温度转换寄存器高8位
TEMPLC EQU 33H ;温度转换寄存器低8位
BUF1 EQU 34H ;显示缓冲寄存器小数位
BUF2 EQU 35H ;显示缓冲寄存器个数位
BUF3 EQU 36H ;显示缓冲寄存器十数位
BUF4 EQU 37H ;显示缓冲寄存器百数位
TEMPDIN BIT P1.7 ;数据脚定义
;**********************************************
ORG 0000H ;主程序入口地址
LJMP MAIN ;转主程序
ORG 0100H
MAIN:
MOV SP,#60H
NEXT1:
LCALL GET_TEMPER ;调读温度子程序
JB FLAG1,OK ;判断DS18B20是否存在
LCALL ERR ;不存在就给出出错提示8888
AJMP NEXT1
OK: LCALL CONVTEMP ;温度BCD码计算处理子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
LCALL DISPLAY ;显示子程序
LCALL WARNING ;比较温度看是否超限
AJMP NEXT1
;***************************************
; 读出转换后的温度值
;***************************************
GET_TEMPER:
SETB TEMPDIN ;释放总线
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2 ;判断DS1820是否存在?若DS18B20不存在则返回
LCALL ERR ;出错提示
TSS2:
CLR P3.7 ;DS18B20已经被检测到!!
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
;*****************************************
;通过调延时一段时间,等待AD转换结束
;这里用系统默认的12位,延时750us
;*****************************************
MOV R3,#5
DELAY: LCALL DISPLAY
DJNZ R3,DELAY
;*****************************************
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存到40H/41H
RET
;*******************************************
;写DS18B20的子程序(有具体的时序要求)
;*******************************************
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C
WR1:
CLR TEMPDIN
MOV R3,#6
DJNZ R3,$
RRC A
MOV TEMPDIN,C
MOV R3,#23
DJNZ R3,$
SETB TEMPDIN
NOP
DJNZ R2,WR1
SETB TEMPDIN
RET
;*************************************
; 这是DS18B20复位初始化子程序
;*************************************
INIT_1820:
SETB TEMPDIN
NOP
CLR TEMPDIN ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB TEMPDIN ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB TEMPDIN,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3:
SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ;清标志位,表示DS1820不存在
LCALL ERR
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB TEMPDIN ;
RET
;*************************************
;处理温度BCD码子程序
;*************************************
CONVTEMP: MOV A,TEMPH
ANL A,#80H ;
JZ TEMPC1 ; 判断温度是否在零下?
CLR C ; 温度值补码 变成原码
MOV A,TEMPL
CPL A
ADD A,#01H
MOV TEMPL,A
MOV A, TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A ; TEMPHC HI=符号位
MOV TEMPHC,#0BH ; 置"-"标志
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ; 置"+"标志
;**************************************
TEMPC11: MOV A,TEMPHC ; 计算小数位温度BCD值
SWAP A
MOV TEMPHC,A
MOV A,TEMPL ;
ANL A,#0FH ; 乘0.0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ; TEMPLC LOW= 小数部分 BCD
;**************************************
MOV A,TEMPL ; 计算整数位温度BCD值
ANL A,#0F0H
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH
SWAP A
ORL A,TEMPL
MOV TEMPER_L ,A
LCALL HEX2BCD1 ; 调用单字节十六进制转BCD子程序
;************************************
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ; TEMPHC LOW = 十位数 BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ; TEMPLC HI = 个位数 BCD
ORL A,TEMPLC
MOV TEMPLC,A
MOV A,R7
JZ TEMPOUT
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPHC ; TEMPHC HI = 百位数 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPOUT: RET
;**************************************
;小数部分分码表
;**************************************
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H ;
;**************************************
;显示区 BCD 码温度值刷新子程序
;**************************************
DISPBCD: MOV A,TEMPLC ; 温度数据移入显示寄存器
ANL A,#0FH
MOV BUF1,A ; 显示小数
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV BUF2,A ; 显示个位
MOV A,TEMPHC
ANL A,#0FH
MOV BUF3,A ; 显示十位
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV BUF4,A ; 显示百位
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#10H,DISPBCD0 ; 百位数=0?
SJMP DISPOUT
DISPBCD0:
MOV A, TEMPHC
ANL A, #0FH
JNZ DISPOUT ; 十位数是0?
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV BUF4,0AH ; 符号位不显示
MOV BUF3,A ; 十位数显示符号
DISPOUT: RET
;*************************************
;单字节十六进制转BCD
;*************************************
HEX2BCD1:MOV B,#64H ; 十六进制 ->BCD
DIV AB ; B=A%100
MOV R7,A ; R7=百位数
MOV A,#0AH
XCH A,B
DIV AB ; B=A%B
SWAP A
ORL A,B
RET
;**************************************
;进行8位循环校验
;*************************************
CRC8CAL: PUSH ACC
MOV R7,#08H
CRC8LOOP1:
XRL A,B
RRC A
MOV A,B
JNC CRC8LOOP2
XRL A,#18H
CRC8LOOP2:
RRC A
MOV B,A
POP ACC
RR A
PUSH ACC
DJNZ R7,CRC8LOOP1
POP ACC
RET
;******************************************
;读DS18B20的程序,从DS18B20中读出9个字节数据
;开始的两个字节为温度数据
;******************************************
READ_18200:
MOV R4,#9 ; 将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ; 低位存入40H(TEMPER_L),高位存入41H(TEMPER_H)
MOV B, #00H ;
;************************************
RE00:
MOV R2,#8 ; 数据一共有8位
RE01:
CLR C
SETB TEMPDIN
NOP
NOP
CLR TEMPDIN
NOP
NOP
NOP
SETB TEMPDIN
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,TEMPDIN
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
;************************************
MOV @R1,A
INC R1
LCALL CRC8CAL
DJNZ R4,RE00
MOV A,B
JNZ READ_OUT
MOV TEMPL,TEMPER_L
MOV TEMPH,TEMPER_H
READ_OUT: RET
;*****************************************
;显示子程序
;*****************************************
DISPLAY:
MOV DPTR,#NUMTAB ;指定查表启始地址
MOV R0,#6
DP11: MOV R1,#40 ;显示1000次
DPLP: MOV A,BUF1 ;取小位数
MOVC A,@A+DPTR ;查小位数的7段代码
MOV P0,A ;送出小位的7段代码
CLR P2.3 ;开小位显示
SETB P0.7 ;把小数点去掉
ACALL DL1ms ;显示1ms
SETB P2.3
MOV A,BUF2 ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P2.2 ;开个位显示
CLR P0.7 ;小数点要显示出来
ACALL DL1ms ;显示1ms
SETB P2.2 ;
MOV A,BUF3 ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P2.1 ;开十位显示
SETB P0.7
ACALL DL1ms ;显示1ms
SETB P2.1 ;
MOV A,BUF4 ;取百位数
MOVC A,@A+DPTR ;查百位数的7段代码
MOV P0,A ;送出百位的7段代码
CLR P2.0 ;开百位显示
SETB P0.7
ACALL DL1ms ;显示1ms
SETB P2.0 ;
DJNZ R1,DPLP
DJNZ R0,DP11
RET
;*******************************************
WARNING: MOV A,TEMPL ; 比较当前温度与下限温度值
CJNE A,#20,TEST0 ;=20?
AJMP CLR36 ;相等 c为0
TEST0: JC SET36 ;<20 c为1
TEST1: MOV A,TEMPH
CJNE A,#60,SET36 ;=60?
JNC SET36 ;>60 为0
AJMP CLR36 ;其它为1
CLR36: CLR P3.6
AJMP OUT
SET36: SETB P3.6
AJMP OUT
OUT: RET
;******************************************
;DS1820不存在就出错提示8888
;******************************************
ERR: MOV BUF1,#08H
MOV BUF2,#08H
MOV BUF3,#08H
MOV BUF4,#08H
LCALL DISPLAY
RET
;****************************************
DL1MS: MOV R7,#100
DJNZ R7,$
RET
;****************************************
;7段数码管0~9数字的共阳显示代码
;****************************************
NUMTAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;
; "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
;****************************************
END参
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -