|
100黑币
就是我想要在高温报警的时候继电器吸合 不报警的时候继电器不吸合 但是不知道出现了什么问题
程序代码如下
TIMER_L DATA 23H
TIMER_H DATA 24H
TIMER_COUN DATA 25H
TEMPL DATA 26H
TEMPH DATA 27H
TEMP_TH DATA 28H
TEMP_TL DATA 29H
TEMPHC DATA 2AH
TEMPLC DATA 2BH
TEMP_ZH DATA 2CH
BEEP EQU P3.7
DATA_LINE EQU P3.3
RELAY EQU P1.3
FLAG1 EQU 20H.0
FLAG2 EQU 20H.1
K1 EQU P1.4
K2 EQU P1.5
K3 EQU P1.6
K4 EQU P1.7
ORG 0000H
JMP MAIN
ORG 000BH
AJMP INT_T0
MAIN: MOV SP,#30H
MOV TMOD,#01H ;T0,方式1
MOV TIMER_L,#00H ;50ms定时值
MOV TIMER_H,#4CH
MOV TIMER_COUN,#00H ;中断计数
MOV IE,#82H ;EA=1,ET0=1
LCALL READ_E2
;LCALL RE_18B20
MOV 20H,#00H
SETB BEEP
SETB RELAY
MOV 7FH,#0AH ;熄灭符
CALL RESET ;复位与检测DS18B20
JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在
JMP START
MAIN1: CALL RESET
JB FLAG1,START
CLR BEEP
;LCALL BEEP_BL ;DS18B20错误,报警
JMP MAIN1
START:
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#044H ; 发出温度转换命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#0BEH ; 发出读温度命令
CALL WRITE
CALL READ ;读温度数据
CALL CONVTEMP ;温度转换
CALL DISPBCD ;获取显示值的BCD码
CALL DISP1 ;显示当前温度
CALL SCANKEY ;扫描按键
LCALL TEMP_COMP ;温度比较上下限
JMP MAIN1 ;跳回开始
RESET:
SETB DATA_LINE
NOP
CLR DATA_LINE
MOV R0,#64H ;主机发出延时600微秒的复位低脉冲
MOV R1,#03H
RESET1: DJNZ R0,$
MOV R0,#64H
DJNZ R1,RESET1
SETB DATA_LINE ;然后拉高数据线
NOP
MOV R0,#25H
RESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回应
DJNZ R0,RESET2
JMP RESET4 ; 延时
RESET3: SETB FLAG1 ; 置标志位,表示DS1820存在
JMP RESET5
RESET4: CLR FLAG1 ; 清标志位,表示DS1820不存在
JMP RESET6
RESET5: MOV R0,#064H
DJNZ R0,$ ; 时序要求延时一段时间
RESET6: SETB DATA_LINE
RET
WRITE: MOV R2,#8 ;一共8位数据
CLR CY
WR1:
CLR DATA_LINE ;开始写入DS18B20总线要处于复位(低)状态
MOV R3,#09
DJNZ R3,$ ;总线复位保持18微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C
MOV DATA_LINE,C ;写入一个BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
SETB DATA_LINE ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个BIT
SETB DATA_LINE
RET
READ: MOV R4,#4 ; 将温度高位和低位从DS18B20中读出
MOV R1,#26H ; 存入26H、27H、28H、29H
RE00: MOV R2,#8
RE01: CLR C
SETB DATA_LINE
NOP
NOP
CLR DATA_LINE ;读前总线保持为低
NOP
NOP
NOP
SETB DATA_LINE ;开始读总线释放
MOV R3,#09 ;延时18微妙
DJNZ R3,$
MOV C,DATA_LINE ;从DS18B20总线读得一个BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
RRC A ;把读得的位值环移给A
DJNZ R2,RE01 ;读下一个BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
INT_T0:
PUSH ACC
PUSH PSW
MOV TL0,TIMER_L
MOV TH0,TIMER_H
INC TIMER_COUN
MOV A,TIMER_COUN
CJNE A,#04H,INT_END
MOV TIMER_COUN,#00H
CPL FLAG2
INT_END:
POP PSW
POP ACC
RETI
RE_18B20:
JB FLAG1,RE_18B20A
RET
RE_18B20A:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#4EH ;写暂存寄存器
LCALL WRITE
MOV A,TEMP_TH ;TH(报警上限)
LCALL WRITE
MOV A,TEMP_TL ;TL(报警下限)
LCALL WRITE
MOV A,#7FH ;12位精确度
LCALL WRITE
RET
SCANKEY:
MOV P1,#0F0H
JB K1,SCAN_K2
;CALL BEEP_BL
SCAN_K1: CALL ALERT_TL
CALL ALERT_PLAY
JB K1,SCAN_K1
;CALL BEEP_BL
SCAN_K11: CALL ALERT_TH
CALL ALERT_PLAY
JB K1,SCAN_K11
;CALL BEEP_BL
SCAN_K2: JB K2,SCAN_K3
;CALL BEEP_BL
SCAN_K3: JB K3,SCAN_K4
;CALL BEEP_BL
LCALL RESET_ALERT
LCALL RE_18B20
LCALL WRITE_E2
SCAN_K4: JB K4,SCAN_END
;CALL BEEP_BL
SCAN_END: RET
RESET_ALERT:
CALL ALERT_TL
CALL ALERT_PLAY
JNB K3,$ ;K3为位移键
SETB TR0
RESET_TL:
CALL ALERT_PLAY
JNB FLAG2,R_TL01
mov 75H,7fh ;送入熄灭符
mov 76H,7fh
CALL ALERT_PLAY
JMP R_TL02
R_TL01: CALL ALERT_TL
mov 75h,7Eh ;送设定值
mov 76h,7Dh
CALL ALERT_PLAY ;显示设定值
R_TL02: JNB K1,K011A
JNB K2,K011B
JNB K3,RESET_TH
JMP RESET_TL
K011A:
INC TEMP_TL
MOV A,TEMP_TL
CJNE A,#120,K012A ;没有到设定上限值,转
MOV TEMP_TL,#0
K012A: CALL TL_DEL
JMP RESET_TL
K011B:
DEC TEMP_TL
MOV A,TEMP_TL
CJNE A,#00H,K012B ;没有到设定下限值,转
MOV TEMP_TL,#119
K012B: CALL TL_DEL
JMP RESET_TL
RESET_TH:
;CALL BEEP_BL
JNB K3,$
RESET_TH1:
CALL ALERT_PLAY
JNB FLAG2,R_TH01
mov 75H,7fh ;送入熄灭符
mov 76H,7fh
CALL ALERT_PLAY
JMP R_TH02
R_TH01: CALL ALERT_TH
mov 75h,7Eh ;
mov 76h,7Dh
CALL ALERT_PLAY
R_TH02: JNB K1,K021A
JNB K2,K021B
JNB K3,K002
JMP RESET_TH1
K021A:
INC TEMP_TH
MOV A,TEMP_TH
CJNE A,#120,K022A ;没有到设定上限值,转
MOV TEMP_TH,#0
K022A: CALL TH_DEL
JMP RESET_TH1
K021B:
DEC TEMP_TH ;减1
MOV A,TEMP_TH
CJNE A,#00H,K022B ;没有到设定下限值,转
MOV TEMP_TH,#119
K022B: CALL TH_DEL
JMP RESET_TH1
K002: CALL TH_DEL
JNB K3,K002;CALL BEEP_BL
;K00x: JNB K3,K00x
CLR TR0 ;关闭中断
RET
TL_DEL: ;报警低值延时
MOV R2,#2AH
TL_DEL1: CALL ALERT_TL
CALL ALERT_PLAY
DJNZ R2,TL_DEL1
RET
TH_DEL: ;报警高值延时
MOV R2,#2AH
TH_DEL1: CALL ALERT_TH
CALL ALERT_PLAY
DJNZ R2,TH_DEL1
RET
TEMP_COMP:
SETB TR0 ;启动中断
MOV A,TEMP_TH
SUBB A,TEMP_ZH ;减数>被减数,则
JC CHULI1 ;借位标志位C=1,转
MOV A,TEMP_ZH
SUBB A,TEMP_TL ;减数>被减数,则
JC CHULI2 ;借位标志位C=1,转
JNB FLAG2,T_COMP1 ;FLAG2=0,显示标记字符
MOV 74H,#0AH ;熄灭符
LCALL DISP1
JMP T_COMP2
T_COMP1: MOV 74H,#00H
LCALL DISP1 ;显示"O"
SETB BEEP
T_COMP2: LCALL REALYDEL ;继电器吸合
CLR TR0 ;关闭中断
RET
CHULI1:
;SETB RELAY ;继电器关闭
JNB FLAG2,CHULI10
MOV 74H,#0AH ;熄灭符
LCALL DISP1
JMP CHULI11
CHULI10: MOV 74H,#0DH
LCALL DISP1 ;显示"H"
CLR BEEP
SETB RELAY ;继电器吸合
;CALL BEEP_BL ;蜂鸣器响
CHULI11:
CLR TR0 ;关闭中断
RET
CHULI2: ;欠温处理
JNB FLAG2,CHULI20
MOV 74H,#0AH ;熄灭符
LCALL DISP1
JMP CHULI21
CHULI20: MOV 74H,#0CH
LCALL DISP1 ;显示"L"
CLR BEEP;CALL BEEP_BL ;蜂鸣器响
LCALL REALYDEL ;继电器吸合
CHULI21: CLR TR0 ;关闭中断
RET
WRITE_E2:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#48H ;温度报警值拷贝到EEROM
LCALL WRITE
RET
READ_E2:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#0B8H ;温度报警值拷贝回暂存器
CALL WRITE
RET
CONVTEMP: MOV A,TEMPH ;判温度是否零下
ANL A,#80H
JZ TEMPC1 ;温度零上转
CLR C
MOV A,TEMPL ;二进制数求补(双字节)
CPL A ;取反加1
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
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
MOV TEMP_ZH,A ;组合后的值存入TEMP_ZH
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
MOV R7,A
MOV A,TEMPHC ;TEMPHC HI = 百位数 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A ;小数位
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 71H,A ;个位
MOV A,TEMPHC
ANL A,#0FH
MOV 72H,A ;十位
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,A ;百位
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DISPBCD0
SJMP DISPBCD2
DISPBCD0: MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2 ;十位数是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符号位不显示
MOV 72H,A ;十位数显示符号
DISPBCD2: RET
DISP1: MOV R1,#70H ;指向显示数据首址
MOV R5,#7FH ;扫描控制字初值
PLAY: MOV P0,#0FFH
MOV A,R5 ;扫描字放入A
MOV P2,A
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P0口
MOV A,R5
JB ACC.6,LOOP5 ;小数点处理
CLR P0.7
LOOP5: LCALL DL_MS ;显示2MS
INC R1 ;指向下一个地址
MOV A,R5 ;放回 R5 内
JNB ACC.3,ENDOUT ;ACC.3=0时一次显示结束
RR A ;A 中数据循环左移
MOV R5,A ;放入 R5 中
AJMP PLAY ;跳回 PLAY 循环
ENDOUT: MOV P0,#0FFH ;一次显示结束,P0口复位
MOV P2,#0FFH ;P2口复位
RET
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H
; “0" “1" “2" “3" “4"“5"“6"“7"“8"“9"“灭" “-" “L”“H"
DL_MS: MOV R6,#0AH ;2MS延时程序,LED 显示程序用
DL1: MOV R7,#64H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
ALERT_TL:
MOV 79H,#0CH
MOV 78H,#0BH
MOV A,TEMP_TL
MOV R0,#77H
MOV B,#064H
DIV AB
CJNE A,#01H,ALERT_TL1
MOV @R0,A
JMP ALERT_TL2
ALERT_TL1: MOV A,#0BH ;显示“-”
MOV @R0,A
ALERT_TL2: MOV A,#0AH
XCH A,B
DIV AB
DEC R0
MOV @R0,A
MOV 7DH,A
DEC R0
MOV @R0,B
MOV 7EH,B
RET
;-----------------------------------------------
ALERT_TH:
MOV 79H,#0DH
MOV 78H,#0BH
MOV A,TEMP_TH
MOV R0,#77H
MOV B,#064H
DIV AB
CJNE A,#01H,ALERT_TH1
MOV @R0,A
JMP ALERT_TH2
ALERT_TH1: MOV A,#0BH ;显示“-”
MOV @R0,A
ALERT_TH2: MOV A,#0AH
XCH A,B
DIV AB
DEC R0
MOV @R0,A
MOV 7DH,A
DEC R0
MOV @R0,B
MOV 7EH,B
RET
ALERT_PLAY:
MOV R1,#75H ;指向显示数据首址
MOV R5,#7FH ;扫描控制字初值
A_PLAY: MOV P0,#0FFH
MOV A,R5 ;扫描字放入A
MOV P2,A
MOV A,@R1 ;取显示数据到A
MOV DPTR,#ALERT_TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P0口
LCALL DL_MS1 ;显示2MS
INC R1 ;指向下一个地址
MOV A,R5
JNB ACC.3,ENDOUT1
RR A ;A 中数据循环左移
MOV R5,A ;放入 R5 中
AJMP A_PLAY ;跳回 PLAY 循环
ENDOUT1: MOV P0,#0FFH ;一次显示结束,P0口复位
MOV P2,#0FFH ;P2口复位
RET
ALERT_TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H
;共阳段码表 “0" “1" “2" “3" “4"“5"“6"“7"“8"“9"“灭" “-"
DL_MS1: MOV R6,#0AH ;2MS延时程序,LED 显示程序用
ADL1: MOV R7,#64H
ADL2: DJNZ R7,ADL2
DJNZ R6,ADL1
RET
BEEP_BL:
MOV R6,#100
BL2: CALL DEX1
CPL BEEP ;对 P3.7 取反
DJNZ R6,BL2
MOV R5,#10
CALL DELAY
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
DELAY: ;(R5)*延时10MS
MOV R6,#50
DEL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
DJNZ R5,DELAY
RET
;---------继电器-------------
REALYDEL:CLR RELAY
MOV R6,#10
REALYDEL1:MOV R5,#10
REALYDEL2:DJNZ R5,REALYDEL1
DJNZ R6,REALYDEL
RET
END
|
最佳答案
查看完整内容
1:DATA伪指令的地址全部改成030H往上增加,看数据手册就知道为什么了
2:MAIN标号前加一条 ORG 0100H伪指令,你没有这个伪指令的话,程序启动之后是直接进入中断的
其它的东西就不看,指令太多了
如果你的是实际问题就参照我上面的方法先改一下
如果是仿真的问题,就当我什么也没有说,汇编仿真没有一点意义
|