📄 yaokongrili.asm
字号:
mov r0,#32h
tsr2:
jnb date_line,tsr3 ;等待DS18B20回应
djnz r0,tsr2
jmp tsr4 ; 延时
tsr3:
setb f1 ; 置标志位,表示DS1820存在
jmp tsr5
tsr4:
clr f1 ; 清标志位,表示DS1820不存在
jmp tsr7
tsr5:
mov r0,#06bh
tsr6:
djnz r0,$ ; 时序要求延时一段时间
tsr7:
setb date_line
ret
;WRITE DS18B20 2007-05-28>>MON
DSWR:
mov r2,#8 ;一共8位数据
CLR C
wr1:
clr date_line ;开始写入DS18B20总线要处于复位(低)状态
mov r3,#07
djnz r3,$ ;总线复位保持16微妙以上
rrc a ;把一个字节DATA 分成8个BIT环移给C
mov date_line,c ;写入一个BIT
mov r3,#3CH
djnz r3,$ ;等待100微妙
setb date_line ;重新释放总线
nop
djnz r2,wr1 ;写入下一个BIT
setb date_line
ret
;READ DS18B20
DSRE:
mov r4,#2 ; 将温度低位、高位、TH、TL从DS18B20中读出
mov r1,#TEMPL ; 存入25H、26H、27H、28H
re00:
mov r2,#8
re01:
clr cy
setb date_line
nop
nop
clr date_line ;读前总线保持为低
nop
nop
nop
setb date_line ;开始读总线释放
mov r3,#09 ;延时18微妙
djnz r3,$
mov c,date_line ;从DS18B20总线读得一个BIT
mov r3,#3CH
djnz r3,$ ;等待100微妙
rrc a ;把读得的位值环移给A
djnz r2,re01 ;读下一个BIT
mov @r1,a
inc r1
djnz r4,re00
LCALL TRAN ;温度转换子程序
RET
TRAN:
mov A,TEMPH
ANL A,#0F0H
CJNE A,#0F0H,ZDATA ;判断温度是零上还是零下
MOV A,TEMPH ;高位取反
CPL A
MOV TEMPH,A
MOV A,TEMPL ;低位取反加1
CPL A
ADD A,#1
MOV TEMPL,A
lJMP ZFDATA
ZDATA:
MOV A,TEMPL ;零上温度处理程序
ANL A,#0F0H
MOV TEMP_BUF,A
MOV A,TEMPH ;30H 存放温度低位数据,31H 存放温度高位数据
ANL A,#07H
ORL A,TEMP_BUF
SWAP A
MOV B,#10
DIV AB
MOV TEMP_UNIT,B ;
CJNE A,#10,TEMP_TH ;判断温度是否大于100摄氏度
TEMP_TH:
JNC TEMP_TH_RE
MOV TEMP_TEN,A ;温度小于100摄氏度,正常显示
AJMP OVER
TEMP_TH_RE:
MOV TEMP_TEN,#9 ;温度大于100摄氏度,显示99.9'C
MOV TEMP_UNIT,#9
MOV TEMP_DEC,#9
AJMP TEMP_OUT
OVER: ;小数点后两位处理程序
MOV DPTR,#TABB
MOV A,TEMPL
ANL A,#0FH
MOVC A,@A+DPTR
MOV TEMP_DEC,A
TEMP_OUT:
MOV A,TEMP_TEN ;消隐,温度十位0
CJNE A,#00H,TEMP_OUT1
MOV TEMP_TEN,#0AH
TEMP_OUT1:
RET
ZFDATA:
MOV A,TEMPL ;零下温度处理程序
ANL A,#0F0H
MOV TEMP_BUF,A
MOV A,TEMPH ;
ANL A,#07H
ORL A,TEMP_BUF
SWAP A
MOV B,#10
DIV AB
CJNE A,#1,TEMP_TL ;判断温度是否低于零下10摄氏度
TEMP_TL:
JNC TEMP_TL_RE
MOV TEMP_TEN,#0BH ;温度高于零下10摄氏度,显示正常温度
MOV A,B
MOV TEMP_UNIT,A
AJMP TEMP_TL_ON
TEMP_TL_RE:
MOV TEMP_TEN,#0BH ;温度低于零下10摄氏度,显示-9.9'C
MOV TEMP_UNIT,#09H
MOV TEMP_DEC,#09H
AJMP TEMP_OUT
TEMP_TL_ON:
LJMP OVER
TABB: DB 0, 0, 1, 1, 2, 3, 3, 4, 5
;小数位数 0 1 2 3 4 5 6 7 8
DB 5, 6, 6, 7, 8, 8, 9,
; 9 A B C D E F
;=================================================
; 遥控器IR 译码子程序
;中断服务程序
;=================================================
INT:
CLR EA ;暂时关闭CPU的所有中断请求
PUSH ACC
PUSH PSW
SETB PSW.4 ;选择工作寄存器组2
CLR PSW.3
MOV R0,#IRCOM
MOV R1,#04H
I1:
JNB IRIN,I2 ;等待 IR 信号出现
DJNZ R1,I1
JMP IR_OUT
I2:
MOV R4,#20
I20:
CALL DEL
DJNZ R4,I20
JB IRIN,I1 ;确认IR信号出现
I21:
JB IRIN,I3 ;等 IR 变为高电平
CALL DEL
JMP I21
I3:
MOV R3,#0 ;8位数清为0
LL:
JNB IRIN,I4 ;等 IR 变为低电平
CALL DEL
JMP LL
I4:
JB IRIN,I5 ;等 IR 变为高电平
CALL DEL
JMP I4
I5:
MOV R2,#0 ;0.14ms 计数
L1:
CALL DEL
JB IRIN, N1 ;等 IR 变为高电平
;IR=0,检查R2中的计数值
MOV A,#8 ;
CLR C
SUBB A,R2 ;判断高低位
;IF C=0 BIT=0
MOV A,@R0
RRC A
MOV @R0,A ;处理完一位
INC R3
CJNE R3,#8,LL ;需处理完8位
MOV R3,#0
INC R0
CJNE R0,#2CH,LL ;收集到4字节了
JMP IR_SHOW
N1:
INC R2
CJNE R2,#30,L1 ;0.14ms 计数过长则时间到自动离开
IR_OUT:
CLR PSW.4
POP PSW
POP ACC
SETB EA
RETI
IR_SHOW:
CLR PSW.4
MOV A,2AH
CPL A ;将22H取反后和23H比较
CJNE A,2BH,IR_SHOW1 ;如果不等表示接收数据发生错误,放弃。
CALL DO
IR_SHOW1:
JMP IR_OUT
; ***************************
; * 遥控器按键处理程序 *
; ***************************
DO:
JB CHOICE_ADJ,DO_EXIT ;
MOV A,2AH ;开启,关闭整机
CJNE A,#16H,DO_A_0
CPL TURNOFF
JB TURNOFF,GOGO
LCALL ON_DISPLAY
SETB LED2
AJMP GOGO1
GOGO:
CLR LED2
GOGO1:
RET
DO_A_0:
CJNE A,#10H,DO_0 ;关闭/开启秒钟闪烁功能
CPL CLOSE_DIS
JNB CLOSE_DIS,TUON_LED
SETB TR0
SETB ET0
AJMP DO_OFLED
TUON_LED:
CLR TR0
CLR ET0
CLR LED1
DO_OFLED:
RET
DO_EXIT:
CLR HOURFLASH
CLR DAYFLASH
CLR MONTHFLASH
CLR YEARFLASH
CLR YEARBIT
CLR MONTHBIT
CLR DAYBIT
CLR HOURBIT
CLR MINUTEBIT
CLR ET1
CLR TR1
RETI
DO_0:
CJNE A,#0FFH,DO_1 ;遥控进入调整状态
CPL CON_ADJ
JNB CON_ADJ,CLOSE_CON
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
SETB ET1 ;打开定时器0中断入口
SETB TR1 ;打开定时器0
AJMP CON_ADJ_OUT
CLOSE_CON:
;MOV DS1302_ADDR,#80H
;MOV DS1302_DATA,#00H ;1302开始振荡
;LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;禁止写1302
LCALL WRITE
AJMP DO_EXIT
CON_ADJ_OUT:
RET
DO_1:
JNB CON_ADJ,DO_EXIT
CJNE A,#12H,SHUNXU
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;1302开始振荡
LCALL WRITE
RET
;-------------------------------------------------
SHUNXU:
CJNE A,#1BH,DO_2
JNB YEARBIT,SHUNXU_1 ;顺序闪烁调整
JNB MONTHBIT,SHUNXU_2
JNB DAYBIT,SHUNXU_3
JNB HOURBIT,SHUNXU_4
AJMP SHUNXU_5
SHUNXU_1:
SETB YEARBIT ;顺序月闪烁
SETB YEARFLASH
CLR MONTHBIT
RET
SHUNXU_2:
SETB MONTHBIT ;顺序日闪烁
SETB MONTHFLASH
CLR DAYBIT
RET
SHUNXU_3:
SETB DAYBIT ;顺序时闪烁
SETB DAYFLASH
CLR HOURBIT
RET
SHUNXU_4:
SETB HOURBIT
SETB HOURFLASH ;顺序分闪烁
CLR MINUTEBIT
RET
SHUNXU_5:
RET
;-------------------------------------------------
DO_2:
CJNE A,#1FH,DO_3 ;逆序闪烁调整
JNB YEARBIT,NIXU_1
JNB MONTHBIT,NIXU_2
JNB DAYBIT,NIXU_3
JNB HOURBIT,NIXU_4
AJMP NIXU_5
NIXU_1:
CLR YEARFLASH ;逆序年闪烁
RET
NIXU_2:
CLR YEARBIT ;逆序年闪烁
CLR YEARFLASH
RET
NIXU_3:
CLR MONTHBIT ;逆序月闪烁
CLR MONTHFLASH
RET
NIXU_4:
CLR DAYBIT ;逆序日闪烁
CLR DAYFLASH
RET
NIXU_5:
CLR HOURBIT ;逆序时闪烁
CLR HOURFLASH
RET
;-------------------------------------------------
DO_3:
CJNE A,#1AH,DO_4 ;加法调整程序
JNB YEARBIT,CON_ADD_YEAR
JNB MONTHBIT,CON_ADD_MONTH
JNB DAYBIT,CON_ADD_DAY
JNB HOURBIT,CON_ADD_HOUR
JNB MINUTEBIT,CON_ADD_MINU
;-------------------------------------------------
DO_4:
CJNE A,#1EH,DO_OUT ;减法调整程序
JNB YEARBIT,CON_DEC_YEAR
JNB MONTHBIT,CON_DEC_MONTH
JNB DAYBIT,CON_DEC_DAY
JNB HOURBIT,CON_DEC_HOUR
JNB MINUTEBIT,CON_DEC_MINU
RET
DO_OUT:
RET
;-------------------------------------------------
CON_ADD_YEAR:
AJMP ADD_YEAR
CON_ADD_MONTH:
AJMP ADD_MONTH
CON_ADD_DAY:
AJMP ADD_DAY
CON_ADD_HOUR:
AJMP ADD_HOUR
CON_ADD_MINU:
AJMP ADD_MINU
;-------------------------------------------------
CON_DEC_YEAR:
AJMP DEC_YEAR
CON_DEC_MONTH:
AJMP DEC_MONTH
CON_DEC_DAY:
AJMP DEC_DAY
CON_DEC_HOUR:
AJMP DEC_HOUR
CON_DEC_MINU:
AJMP DEC_MINU
;--------------遥控器年加调整-----------------------------------
ADD_YEAR:
MOV R7,TIME_YEAR ;年加1
LCALL ADD1
MOV TIME_YEAR,A
MOV DS1302_ADDR,#8CH ;年值送1302
MOV DS1302_DATA,TIME_YEAR
LCALL WRITE
RET
;--------------遥控器月加调整-----------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -