📄 加狗9.8main.asm
字号:
;*******************************************
;************* 主程序 ******************
;*******************************************
ORG 0000H
AJMP MAIN
ORG 0003H
LJMP INT0REC ;INT0中断
ORG 000BH
LJMP TIMEREC ;定时中断
ORG 0023H
LJMP CHUANKOU ;串口中断
ORG 0100H
MAIN: NOP
CPL P1.2
NOP
LCALL KAISHI
NOP
LCALL TIME
NOP
CPL P1.2
NOP
MAIN00: NOP
JNB 00H,MAIN01 ;00H位为 0 表示无自检 则跳转
NOP
LCALL ZIJIAN ;自检
NOP
SJMP MAIN00
MAIN01: NOP
JB 05H,MAIN03 ;05H 为 1 表示CAN报警 则跳转
JB 01H,MAIN02 ;01H 为 1 表示报警 则跳转
JNB 04H,MAIN001 ;04H 为 0 表示为无数据接收到
NOP
CPL P1.2 ;看门狗
NOP
CLR P1.0
LCALL DELAY10
SETB P1.0
CLR 04H
NOP
SJMP MAIN00
MAIN001: NOP
CPL P1.2
LCALL DELAY ;正常 无报警 循环
NOP
SJMP MAIN00
MAIN02: NOP
LCALL BAOJING ;报警 直到消除报警
NOP
SJMP MAIN00
MAIN03: NOP
LCALL BJCAN ;CAN报警 直到报警消除
NOP
SJMP MAIN00
;********************************************************
;*********************** TIME **************************
;********************************************************
TIME: NOP
NOP
MOV TMOD,#21H ;T1 方式 2 为 波特率方式
MOV TL1,#0FAH ;T0 方式 1 为 定时方式
MOV TH1,#0FAH
MOV SCON,#50H
MOV PCON,#80H ;波特率:9600
MOV TL0,#00H
MOV TH0,#4CH ;50MS
SETB TR1 ;开始定时
SETB TR0
SETB ET0 ;开定时T0中断
SETB ES ;开串口中断
SETB EX0 ;开外部INT0中断
SETB EA ;开总中断允许位
NOP
RET
;************************************************************
;************** 定时中断 **********************************
;************************************************************
TIMEREC: CLR EA
NOP
PUSH ACC
MOV TL0,#00H ;定时50毫秒
MOV TH0,#4CH
NOP
INC R5
CJNE R5,#14H,RECERET ;20次即一秒
NOP
MOV R5,#00H
INC R6
CJNE R6,#40H,RECERET ;120次即两分钟
MOV R6,#00H
SETB 03H ;对03H位 置位视为了给主程序判别
NOP
RECERET: NOP
POP ACC
SETB EA
RETI
;******************************************************************************
;****************** INT0中断服务程序 ************************************
;******************************************************************************
INT0REC: CLR EA
NOP
JNB P1.5,JINGYIN ;P1.5为0表示静音
NOP
JB P1.7,INT0RET ;P1.7为0表示自检
NOP
SETB 00H ;00H位 置位表示 自检
NOP
SJMP INT0RET
JINGYIN: NOP
SETB 02H ;02位 置位表示 静音
NOP
INT0RET: NOP
SETB P1.5
SETB P1.7
CLR P1.6
NOP
SETB EA
RETI
;**************************************************************************
;****************** 串口中断 **********************************
;**************************************************************************
CHUANKOU: CLR EA
PUSH A ;保护断点
NOP
CLR RI ;清除 接收中断标志
MOV A,SBUF ;接收数据
NOP
ANL A,#7FH ;删去校验位
NOP
CJNE R2,#00H,CHUAN01 ;R2位串口接收专用 用来计数
NOP
CJNE A,#24H,CHUANRET0 ;24H为 $ 符 为第一个接收字符
INC R2 ;只有对了才能接收第二个字符
LJMP CHUANRET1
CHUAN01: NOP
CJNE R2,#01H,CHUAN02 ;正常标志为$OK<CR><LF> 24H 4FH 4BH 0DH 0AH
NOP ;报警标志为$ALARM<CR><LF>$24H A41H L4CH A41H R52H M4DH 0DH 0AH
NOP ;无数据报警$NODATA<CR><LF>$24H N4EH O4FH D44H A41H T57H A41H 0DH 0AH 9个
CJNE A,#4FH,CHUAN10 ;4FH为 O 符 为 正常 的 第二个字符
INC R2
NOP
LJMP CHUANRET1 ;不清除R2
CHUAN10: NOP
CJNE A,#41H,CHUAN100 ;41H为 A 符 为 报警 的第二个字符
MOV R2,#12H
NOP
LJMP CHUANRET1
CHUAN100: NOP
CJNE A,#4EH,CHUANRET0 ;4EH为 N 符 为 无数据报警 的第二个字符
MOV R2,#22H
NOP
LJMP CHUANRET1
CHUAN02: NOP
CJNE R2,#02H,CHUAN03
NOP
CJNE A,#4BH,CHUANRET0 ;4BH为 K 符 为 正常 的 第3个字符
INC R2
NOP
LJMP CHUANRET1
CHUANRET0: NOP
LJMP CHUANRET ;带有清除R2
CHUAN03: NOP
CJNE R2,#03H,CHUAN04
NOP
CJNE A,#0DH,CHUANRET0 ;0DH为 <CR> 符 为 正常 的 第4个字符
INC R2
NOP
LJMP CHUANRET1
CHUAN04: NOP
CJNE R2,#04H,CHUAN20
NOP
CJNE A,#0AH,CHUANRET0 ;0AH为 <LF> 符 为 正常 的 第5个字符
MOV R2,#00H
NOP
CLR 05H ;05H位为 0 表示为CAN正常 给主程序判断
CLR 01H ;01H位为 0 表示为正常 给主程序判断
SETB 04H ;04H位为 1 为了给主程序判断说明接收到数据
NOP
LJMP CHUANRET
CHUAN20: NOP
CJNE R2,#12H,CHUAN30
NOP
CJNE A,#4CH,CHUANRET0 ;4CH为 L 符 为 报警 的第3个字符
INC R2
NOP
LJMP CHUANRET1
CHUAN30: NOP
CJNE R2,#13H,CHUAN40
NOP
CJNE A,#41H,CHUANRET0 ;41H为 A 符 为 报警 的第4个字符
INC R2
NOP
LJMP CHUANRET1
CHUAN40: NOP
CJNE R2,#14H,CHUAN50
NOP
CJNE A,#52H,CHUANRET ;52H为 R 符 为 报警 的第5个字符
INC R2
NOP
LJMP CHUANRET1
CHUAN50: NOP
CJNE R2,#15H,CHUAN60
NOP
CJNE A,#4DH,CHUANRET ;52H为 M 符 为 报警 的第6个字符
INC R2
NOP
LJMP CHUANRET1
CHUAN60: NOP
CJNE R2,#16H,CHUAN70
NOP
CJNE A,#0DH,CHUANRET ;0DH为 <CR> 符 为 报警 的第7个字符
INC R2
NOP
LJMP CHUANRET1
CHUAN70: NOP
CJNE R2,#17H,CHUAN101
NOP
CJNE A,#0AH,CHUANRET ;0AH为 <LF> 符 为 报警 的第8个字符
NOP
CLR 05H ;05H位为 0 表示为CAN正常 给主程序判断
SETB 01H ;01H位为 1 表示为报警 给主程序判断
SETB 04H ;04H位为 1 为了给主程序判断说明接收到数据
NOP
LJMP CHUANRET
CHUAN101: NOP
CJNE R2,#22H,CHUAN102
NOP
CJNE A,#4FH,CHUANRET ;4FH为 N 符 为了给CAN报警的第3个字符
NOP
INC R2
NOP
LJMP CHUANRET1
CHUAN102: NOP
CJNE R2,#23H,CHUAN103
NOP
CJNE A,#44H,CHUANRET ;44H为 D 符 为了给CAN报警的第4个字符
NOP
INC R2
NOP
LJMP CHUANRET1
CHUAN103: NOP
CJNE R2,#24H,CHUAN104
NOP
CJNE A,#41H,CHUANRET ;41H为 A 符 为了给CAN报警的第5个字符
NOP
INC R2
NOP
LJMP CHUANRET1
CHUAN104: NOP
CJNE R2,#25H,CHUAN105
NOP
CJNE A,#57H,CHUANRET ;57H为 T 符 为了给CAN报警的第6个字符
NOP
INC R2
NOP
LJMP CHUANRET1
CHUAN105: NOP
CJNE R2,#26H,CHUAN106
NOP
CJNE A,#41H,CHUANRET ;41H为 A 符 为了给CAN报警的第7个字符
NOP
INC R2
NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -