;*********************************************************************** ; 常数定义
;*********************************************************************** ;
;************************************************************* ; 工作内存定义
;************************************************************* BITST DATA 20H TIME1SOK TEMPONEOK ; ;
;************************************************************* ; 引脚定义
;************************************************************* ;
TEMPDIN BIT P3.7 ; ;
;************************************************************* ; 中断向量区
;************************************************************* ORG 0000H LJMP START ;
ORG 00BH LJMP T0IT ;
;****************************************************************** ; 系统初始化
;******************************************************************* ORG 100H
TEMPL TEMPH TEMPHC TEMPLC
BIT BIT DATA DATA DATA DATA
BITST.1 BITST.2 26H 27H 28H 29H
TIMEL TIMEH
EQU EQU EQU
0E0H 0B1H 36H
;20MS,定时器 0 时间常数 ; ;
TEMPHEAD
START: MOV SP, #60H
CLSMEM: MOV R0, #20H ; MOV R1, #60H ; CLSMEM1: MOV @R0, #00H ; INC R0 ; DJNZ R1, CLSMEM1 ; ; ;
ERROR: NOP
LJMP START ;
NOP INIT: NOP
SETB SETB
; ; ; ; ; ; ;
;
;
MOV MOV MOV
TMOD, #00100001B ; 定时器 0 作方式1 (16BIT) TH0, #TIMEL TL0, #TIMEH
; ; 20ms
SJMP INIT
ET0 TR0
SETB EA
MOV CLR ;
PSW, #00H TEMPONEOK
LJMP MAIN
;********************************************************** ; 定时器0中断服务程序
;********************************************************** T0IT: ; ; ;
;********************************************************** ;
主程序
LCALL
DISP1
;调用显示子程序
;********************************************************** MAIN:
PUSH MOV MOV MOV INC CJNE MOV SETB POP RETI
PSW
; ;
; ;
;
PSW, #10H
TH0, #TIMEH TL0, #TIMEL R7
; ;
R7, #32H, T0IT1 R7, #00H TIME1SOK PSW
;
;1S定时到标志 ;
T0IT1:
JNB CLR
TIME1SOK, MAIN TIME1SOK READTEMP1 CONVTEMP
;
;测温每1S一次 ;读出温度值子程序
;温度BCD 码计算处理子程序
JNB LCALL LCALL
TEMPONEOK, MAIN2;上电时先温度转换一次
LCALL DISPBCD ;显示区BCD码温度值涮新子程序 LCALL DISP1 ;消闪烁,显示一次 MAIN2:
LCALL
READTEMP TEMPONEOK MAIN
;温度转换开始 ; ;
SETB LJMP ;
;********************************************************** ;********************************************************** ;子程序区
;********************************************************** ; RESET DS18B20
;********************************************************** INITDS1820:
SETB NOP NOP CLR MOV DJNZ
TEMPDIN
; ;
; ; DELAY 480us
;
TEMPDIN R6, #0A0H R6, $ R6, #0A0H R6, $
MOV DJNZ
SETB MOV DJNZ
; ; ; ; ;
TEMPDIN R6, #32H R6, $
; DELAY 70us
MOV R6,#3CH
C, TEMPDIN
JC MOV DJNZ SJMP RET SETB RET
INITDS1820OUT R6, #0H R6, $
;
;
INITDS1820
LOOP1820: MOV
DJNZ R6,LOOP1820 ;
INITDS1820OUT: ; ;
;********************************************************** ; 读DS18B20的程序, 从DS18B20中读出一个字节的数据 ;**********************************************************
TEMPDIN
;
; DELAY 200us
; ;
READDS1820: MOV
; ;
SETB NOP NOP CLR NOP NOP NOP SETB
R7, #08H TEMPDIN
; ;
;
;
READDS1820LOOP: TEMPDIN
; ; ;
;
TEMPDIN
; ; ; ; ;
MOV R6, #07H DJNZ R6, $ MOV RRC SETB MOV DJNZ RET
; DELAY 15us
MOV C, TEMPDIN
R6, #3CH
A
DJNZ R6, $
;
; DELAY 120us
TEMPDIN R6, #3CH R6, $
;
DJNZ R7, READDS1820LOOP ;
; DELAY 120us
;
;********************************************************** ; 写DS18B20的程序, 从DS18B20中写一个字节的数据 ;********************************************************** WRITEDS1820: MOV ; ;
;********************************************************** ; READ TEMP
;**********************************************************
SETB NOP NOP CLR
R7, #08H TEMPDIN
; ;
;
; ; ; ; DELAY 104us
; ; ; DELAY 15us ;
;
WRITEDS1820LOP:
TEMPDIN
MOV R6, #07H DJNZ R6, $ RRC MOV MOV DJNZ SETB RET
A
TEMPDIN, C R6, #34H R6, $
TEMPDIN
;
DJNZ R7, WRITEDS1820LOP ;
READTEMP:
;
READTEMP1:
LCALL MOV LCALL MOV DJNZ MOV LCALL MOV DJNZ RET LCALL MOV LCALL MOV DJNZ MOV LCALL MOV DJNZ MOV MOV LCALL MOV INC DJNZ MOV JNZ MOV MOV MOV MOV
INITDS1820 A, #0CCH R6, #34H R6, $
A, #44H R6, #34H R6, $
;
;
;
; SKIP ROM ; ;
; START CONVERSION
WRITEDS1820
; DELAY 104us
WRITEDS1820
;
; DELAY 104us
INITDS1820 A, #0CCH R6, #34H R6, $
A, #0BEH R6, #34H R6, $
R5, #09H
;
;
; SKIP ROM ;
; SCRATCHPAD ; ; ; ; ; ; ;
; ;
WRITEDS1820
;
; DELAY 104us
WRITEDS1820
;
; DELAY 104us
R0, #TEMPHEAD READDS1820 @R0, A R0
; ;
MOV B,#00H READTEMP2:
; ;
;********************************************************** ;
处理温度 BCD 码子程序
MOV ANL JZ CLR
A, TEMPH A, #80H TEMPC1 C
; ;
; ;
;********************************************************** CONVTEMP:
READTEMP21: LCALL CRC8CAL A, B
R5, READTEMP2 READTEMPOUT A, TEMPHEAD + 0 TEMPL, A TEMPH, A
;
; ;
A, TEMPHEAD + 1
READTEMPOUT: RET
;
TEMPC1: TEMPC11:
;
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
; MOV
TEMPHC, #0AH
; +
MOV A,TEMPHC 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 ; 整数部分 ANL A, #0F0H ; SWAP A
;
MOV TEMPL, A ; MOV A, TEMPH ; ANL A, #0FH ; SWAP A
; ORL A, TEMPL ; LCALL HEX2BCD1 ; 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 TEMPC12 ; ANL A, #0FH ; SWAP
A
;
TEMPC12: ;
MOV MOV ANL ORL MOV RET
R7, A ;
; ; ; ;
A, TEMPHC A, #0FH A, R7
TEMPHC, A
; TEMPHC HI = 百位数 BCD
;********************************************************** ;
小数部分码表
;********************************************************** TEMPDOTTAB: DB 00H, 01H, 01H, 02H, 03H, 03H, 04H, 04H, 05H, 06H ; ;
;********************************************************** ; ;
DISPBCD: MOV
;
DISPBCD0:
MOV ANL JNZ MOV SWAP ANL MOV
A, TEMPHC A, #0FH DISPBCD2 A, TEMPHC A
A, #0FH
; ; ;
; ; ; 十位数是零
ANL MOV MOV SWAP ANL MOV MOV ANL MOV MOV SWAP ANL MOV MOV ANL CJNE SJMP
A, TEMPLC A, #0FH 70H, A A
A, TEMPLC A, #0FH 71H, A A, TEMPHC A, #0FH 72H, A A
A, TEMPHC A, #0FH 73H, A A, TEMPHC A, #0F0H DISPBCD2
; ; ; ; ; ; ; ; ;
; ;
; ;
; ;
; ;
显示区BCD码温度值涮新子程序
;**********************************************************
DB 06H, 07H, 08H, 08H, 09H, 09H
A, #010H, DISPBCD0 ;
73H, #0AH ; 符号位不显示
;
MOV RET
72H, A
;
; 十位数显示符号
DISPBCD2:
;********************************************************** ;
显示子程序
;**********************************************************
; 显示数据在70H-73H单元内,用4位LED共阳数码管显示,P1口输出段码数据, ; P3口作扫描控制,每个LED数码管亮1MS时间再逐位循环。 ;
DISP1: MOV MOV MOV MOV MOV MOV MOVC MOV
R1,#70H ;指向显示数据首址 R5,#0FEH ;扫描控制字初值 A,R5 ;扫描字放入A P3,A ;从P3口输出 A,@R1 ;取显示数据到A DPTR,#TAB ;取段码表地址 A,@A+DPTR ;查显示数据对应段码 P1,A ;段码放入P1口
PLAY: MOV P1,#0FFH
MOV A,R5 ;
JB ACC.1,LOOP5 ;小数点处理 CLR P1.7 ; LOOP5: LCALL DL1MS ;显示1MS INC MOV JNB RL MOV AJMP MOV
R1 ;指向下一地址 A,R5 ;扫描控制字放入A ACC.3,ENDOUT ;ACC.3=0时一次显示结束 A ;A中数据循环左移 R5,A ;放回R5内 PLAY ;跳回PLAY循环 P3,#0FFH ;P3口复位
ENDOUT: MOV P1,#0FFH ;一次显示结束,P1口复位 RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;共阳段码表 \"0\"\" 1\"\" 2\" \"3\" \"4\"\" 5\" \"6\"\" 7\" \"8\" \"9\"\"不亮\"“-” ;
DL1MS: DL1: DL2:
MOV MOV DJNZ
R6,#14H ;1MS延时程序,LED显示程序用 R7,#19H R7,DL2 R6,DL1
DJNZ RET ;
;********************************************************** ;
单字节 16 进制转 BCD
MOV
B, #0H
; 16 进制 -> BCD
;********************************************************** HEX2BCD1:
;
DIV MOV MOV XCH DIV SWAP ORL RET
AB R7, A A, B AB A
A, B
; B = A % 100 ; ;
;
; B = A % B ;
; R7 = 百位数 ;
A, #0AH
;**************************************************************************** ; ;
Calculate CRC-8 Values. Uses The CCITT-8 Polynomial, Expressed As X^8 + X^5 + X^4 + 1
PUSH ACC MOV XRL RRC MOV JNC XRL RRC MOV POP RR PUSH DJNZ POP RET END
;
; Number Bits In Byte ; Calculate CRC ; Move To Carry
; Get The Last CRC Value ; Skip If Data == 0
; Update The CRC Value ; Position The New CRC ; Store The New CRC ; Get The Remaining Bits ; Position The Next Bit ; Save The Remaining Bits
; Repeat For 8 Bits ;
;**************************************************************************** CRC8CAL: ;
CRC8LOOP1:
R7, #08H A, B A
A, B
CRC8LOOP2 A, #18H A
;
B, A ACC A
ACC ACC
CRC8LOOP2:
R7, CRC8LOOP1
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务