📄 mainend.asm
字号:
FLAG EQU 20H
BUFFER EQU 21H ;DEBUG BUFFER
MODE EQU 0X08
HTEMP EQU 23H
LTEMP EQU 24H
BUFF EQU 25H
;
BUZZER BIT P3.4
LED BIT P3.7
TEMP BIT P3.2
SDA BIT P1.6
SCL BIT P1.7
;
ORG 0x00
LJMP MAIN
ORG 0X03 ;INT0 INTERRUPT
RETI
ORG 0X0B ;TIMER0 INTERRUPT
LJMP TIMER0
ORG 0X13 ;INT1 INTERRUPT
RETI
ORG 0X1B ;TIMER1 INTERRUPT
RETI
ORG 0X23 ;SERIAL INTERRUPT
LJMP UART
ORG 0X30
MAIN: MOV R0,0X00
DJNZ R0,$
CLR LED
CLR BUZZER
MOV FLAG,#0X00
MOV SP,#0X40
;串口初始化
MOV TMOD,#0X20 ;TIMER 1 MODE 2
MOV TH1,#0XFA ;BAUD RATE=4800 BIT/S
SETB TR1 ;START TIMER
MOV SCON,#0XD0 ;SIO MODE 3,HAVE A ODD PARITY BIT (有一位效验位,在后面传送时通过TB8设置成奇效验)
;TIMER0初始化
MOV A,TMOD
ANL A,#0XF0
CLR ACC.3 ;gate=0
CLR ACC.2 ;c/t=0
SETB ACC.1
CLR ACC.0 ;MODE 2 自动载入方式
MOV TMOD,A
MOV TH0,#0XC0 ;#0XC0 ;70US TIMER
MOV TL0,#0XC0 ;#0XC0
CLR TR0
;interrupt初始化
CLR PT0
SETB PS ;串口中断优先
SETB ES ;ENABLE UART INTERRUPT
SETB ET0
SETB EA ;ENABLE SYSTEM INTERRUPT
;标志位清零
CLR RI
CLR TI
CLR TF0
MOV R1,#BUFF
MOV R7,#0X00
STO: JNB FLAG.7,NTLS ;设置最新温度限
ACALL THLSET
CLR FLAG.7
NTLS: MOV A,R7
CJNE A,#0X00,HDAT
ACALL CONVERT ;温度转化
ACALL SALARM ;警情查询
ACALL DIS ;温度显示 JNB
SJMP STO
HDAT: MOV A,R1
CLR C
SUBB A,R7
MOV R0,A
MOV A,@R0
JNB FLAG.2,NHS
MOV HTEMP,A ;读入最高温度??????/应该对数值做判断
SETB FLAG.7
CLR FLAG.2
SJMP ENDD
NHS: JNB FLAG.3,NLS
MOV LTEMP,A ;读入最低温度
SETB FLAG.7
CLR FLAG.3
SJMP ENDD
NLS: CJNE A,#0XA5,COM ;a
SETB FLAG.1 ;IF RECEIVED COMMAND
SJMP ENDD
COM: JNB FLAG.1,NCOM ;后面改成0X00/01根据模块号决定
CJNE A,#0X08,COMM ;b
SETB FLAG.1
SJMP ENDD
COMM: JNB FLAG.1,NCOM
CJNE A,#0X11,TL
SETB FLAG.2 ;SET H TEMP ELDGE;CLR WHEN RE_SET
CLR FLAG.1
SJMP ENDD
TL: CJNE A,#0X12,NCOM
SETB FLAG.3 ;SET L TEMP ELDGE
CLR FLAG.1
SJMP ENDD
NCOM: CLR FLAG.1
MOV B,#0X02
DIV AB
MOV A,B
CJNE A,#0X00,ENDD ;收到的是偶数,可以由MODE来计算奇偶
JNB FLAG.0,ENDD ;有警情传送
SETB TR0 ;START TIMER0
SETB FLAG.4 ;开始准备传送数据
ENDD: INC R0
DJNZ R7,HDAT
SJMP STO
;DS18B20 BEGIN
SALARM: LCALL STARTD
MOV A,#0XEC ;ALARM SEARCH
LCALL WRITED
MOV A,#0X00
CLR C
LCALL READB
LCALL READB
CJNE A,#0X80,NAL ;
SETB BUZZER
SETB FLAG.0
SJMP LOP
NAL: CLR BUZZER
CLR FLAG.0
LOP: RET
;READ BIT
READB: SETB TEMP
NOP
CLR TEMP ;START READ SLOT
NOP ;DELAY >1US
NOP
SETB TEMP ;设P3.2为输入口
MOV R0,#4 ;延时
DJNZ R0,$
MOV C,TEMP ;读数据(在下降沿15US内)
RRC A
RET
CONVERT: LCALL STARTD
MOV A,#0XCC
LCALL WRITED
MOV A,#0X44 ;CONVERT COMMAND
LCALL WRITED
LCALL STARTD
MOV A,#0XCC
LCALL WRITED
MOV A,#0XBE ;READ DS18B20 SCRAPAD
LCALL WRITED
LCALL READD
MOV BUFFER,A ;THE LOW BYTE CONVERT TEMP
LCALL READD
MOV BUFFER+1,A ;THE H BYTE CONVERT TEMP
JNB FLAG.5,NALA ;向UART传送温度????????????????????
MOV A,BUFFER ;THE LOW BYTE OF CONVERT TEMP
ANL A,#0XF0
SWAP A
MOV B,A
MOV A,BUFFER+1 ;THE H BYTE OF CONVERT TEMP
ANL A,#0X0F
SWAP A
ORL A,B ;A中为16进制温度
MOV B,A
MOV A,B
MOV C,P
CPL C
MOV TB8,C
MOV SBUF,A
CPL LED
CLR FLAG.5
NALA: RET
THLSET: LCALL STARTD ;INITIAL DS18B20
MOV A,#0XCC ;SKIP READ ROM
LCALL WRITED
MOV A,#0X4E ;WRITE SCRAPAD COMMAND
LCALL WRITED
MOV A,HTEMP ;WRITE HI ALARM TEMP 33C
LCALL WRITED
MOV A,LTEMP ;WRITE LOW ALARM TEMP 28C
LCALL WRITED
LCALL STARTD
MOV A,#0XCC
LCALL WRITED
MOV A,#0X48 ;COPPPY TH,TL,CONFIGUR TO EEPROM
LCALL WRITED
RET
;INITIAL DS18B20
STARTD: SETB TEMP ;P3.2=1
MOV R0,#0X0F ;DELAY A WHILE
DJNZ R0,$
CLR TEMP ;P3.2=0
MOV R0,#0XDD ;DELAY LARGER THAN 480US
DJNZ R0,$
SETB TEMP ;P3.2=1
MOV R0,#0X0F ;DELAY A WHILE 不可以用一个NOP替代,调试一下。。。。。。
DJNZ R0,$
MOV A,P3 ;READ THE P3.2 看可以用TEMP替代P3。。。。。。
JB ACC.2,OVER
;SETB LED
OVER: MOV R0,#0X77 ;DELAY LARGER THAN 240US
DJNZ R0,$
RET
;WRITE DS18B20 SUBPROGRAM
WRITED: MOV R2,#0X08 ;8 bit
R: CLR TEMP ;write slot start
NOP
JNB ACC.0,LL ;write 1?
SETB TEMP ;write 1
LL: MOV R0,#30 ;DELAY ABOUT 65US FOR DS. SAMPLE
DJNZ R0,$
SETB TEMP ;P3.2=1
RR A ;READ 1 BIT IN A
NOP
DJNZ R2,R
SETB TEMP ;P3.2=1
RET
;READ DS18B20
READD: MOV R2,#0X08 ;READ 8 BIT
SETB TEMP ;看可以省略不
RE: NOP
CLR TEMP ;START READ SLOT
NOP ;DELAY >1US
NOP
SETB TEMP ;设P3.2为输入口
MOV R0,#4 ;延时
DJNZ R0,$
MOV C,TEMP ;读数据(在下降沿15US内)
RRC A ;把读到的数据放到A
MOV R0,#25 ;READ SLOT >60US
DJNZ R0,$
DJNZ R2,RE ;READ 1 BYTE?
SETB TEMP
RET
;DS18B20 END
;DISPLAY THE BUFFER
DIS: MOV A,BUFFER ;THE LOW BYTE OF CONVERT TEMP
ANL A,#0XF0
SWAP A
MOV B,A
MOV A,BUFFER+1 ;THE H BYTE OF CONVERT TEMP
ANL A,#0X0F
SWAP A
ORL A,B ;A中为16进制温度
MOV B,#10
DIV AB ;转换成BCD码显示
ANL A,#0X0F
ORL A,#0X10 ;十位显示
MOV P1,A
MOV R6,#0X032 ;ABOUT 100US
DJNZ R6,$
MOV A,B
ANL A,#0X0F
ORL A,#0X20 ;个位显示
MOV P1,A
MOV R6,#0X032
DJNZ R6,$
MOV P1,#0X00
RET
UART: PUSH PSW
JNB TI,NRCE
CLR TI
SJMP ED
NRCE: CLR RI
CLR FLAG.4
MOV @R1,SBUF
INC R1
MOV A,R1
CJNE A,#BUFF+15,EE
MOV R1,#BUFF
EE: INC R7
ED: POP PSW
RETI
TIMER0: PUSH PSW
CLR EA
PUSH ACC
CLR TF0 ;第一次进来不对FLAG。4做判断且清0。区分正常的返回与数据传送
INC R5 ;等待传送数据的时间段
CJNE R5,#0X01,FIR
SETB FLAG.4 ;第一次进入,由于有其他模块的查询回应所以清零
SJMP RETUR
FIR: JNB FLAG.4,CL ;是否有其他模块传送数据
TFIR: MOV A,R5
CJNE A,#MODE,RETUR
SETB FLAG.5 ;开始传送缓冲区数据
CL: CLR TR0 ;清除TIMER0及R5等待时间段计数,等待下一次巡检
MOV R5,#0X00
MOV TL0,#0XC0 ;#0XC0
RETUR: POP ACC
SETB EA
POP PSW
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -