?? 2.asm
字號:
; 如讀數據成功P1.3會由高電平變成低電平幾秒,LED發光管亮,;后再變高電平 ,然后又開始讀數據
; 讀到的數據通過串口送到電腦顯示,波特率是9600
;;;;MCU:89S51 COLCK:11.0592MHZ
DATA0 BIT p3.2; WG26的D0接外部中斷0
DATA1 BIT P3.3; WG26的D1接外部中斷1
WG26OK BIT 30H; WG26OK=1表示讀完26位數據
WG26ST BIT 31H; WG26ST=1表示開始讀WG26位數據
ORG 0000H
AJMP MAA
ORG 0003H; ;INT0中斷程序
AJMP INT00 ;
ORG 0013H; ;INT1中斷程序
AJMP INT01 ;
MAA: CLR P1.3 ;
ACALL DL
MOV P3,#0FFH ;程序開始
MOV P1,#0FFH
CLR WG26ST ;清WG26的標志位
CLR WG26OK
SETB IT1; ;允許中斷
SETB IT0
SETB EX0
SETB EX1;
SETB EA
MOV R5,#00
MOV B,#00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;WG26的數據初始化,就是清0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
YS: MOV 37H,#00
MOV 38H,#00H
MOV 39H,#0H
MOV 3AH,#00H
MOV 3BH,#00H
MOV 3CH,#00H
MOV 3DH,#00
MOV R7,#00
MOV R1,#00
;;;;;;
MAIN: JNB WG26ST,$ ;開始讀WG26?不是繼續等待
MOV R4,#3;5 ;讀WG26信號的時間限制,只有在63ms管定的時間
YS300MS: MOV R3,#254 ;內讀到26個信號才算是有效的數據,否則就是非法數據
YS300MS1: ACALL A250US
JB WG26OK,YS1
DJNZ R3,YS300MS1
DJNZ R4,YS300MS
CLR WG26ST ;超時數據出錯,清WG26的標志
CLR WG26OK
clr p2.3
ACALL DL
ACALL DL
setb p2.3
AJMP YS ;返回從新讀數據
YS1: CLR WG26ST
CLR WG26OK
NOP
NOP
;校驗
MOV R3,#00
MOV A,39H
MOV C,P
CLR A
RLC A
XRL A,R3
MOV R3,A
MOV A,3AH
ANL A,#0F0H
MOV C,P
CLR A
RLC A
XRL A,R3
JZ WG262
MOV 37H,#0FFH ;偶校驗位,FFH表示1,00H表示0
AJMP WG263
WG262: MOV 37H,#00 ;偶校驗位,FFH表示1,00H表示0
WG263: MOV R3,#00
MOV A,3AH
ANL A,#0FH
MOV C,P
CLR A
RLC A
XRL A,R3
MOV R3,A
MOV A,3BH
MOV C,P
CLR A
RLC A
XRL A,R3
JZ WG265
MOV 3DH,#00 ;奇校驗位,FFH表示1,00H表示0
AJMP FSWG
WG265: MOV 3DH,#0FFH ;奇校驗位,FFH表示1,00H表示0
FSWG: MOV A,37H
XRL A,38H ;判斷數據的偶校驗位是否相等?
JNZ MAINN ;不等轉MAINN
MOV A,3CH
XRL A,3DH ;判斷數據的奇校驗位是否相等?
JNZ MAINN ;不等轉MAINN
AJMP D2D0 ;校驗相等
MAINN: AJMP MAIN ;校驗出錯返回
D2D0: CLR P1.3 ;提示成功
ACALL DL
acall AS1MS
acall AS1MS
;setb p1.3
acall AS1MS
clr IT1; ;允許中斷
acall AS1MS
acall AS1MS
acall AS1MS
acall AS1MS
acall AS1MS
acall AS1MS
acall AS1MS
acall AS1MS
acall AS1MS
acall AS1MS
;;;;;;;把卡號通過串行口發送波特率為9600
MOV TMOD,#20H;設定T1為定時方式2
MOV TH1,#0FDH;定時初值
MOV TL1,#0FDH;
MOV PCON,#00;波特率為9600
SETB TR1;;;;;啟動定時器
MOV SCON,#50H;串口方式1
MOV R0,#39h;;數據地址指針
MOV R7,#3;;;數據長度
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AAA0: MOV A,@R0
SWAP A
ANL A,#0FH
MOV DPTR,#CARDASCII
MOVC A,@A+DPTR
MOV SBUF,A;@R0;發送一個數據
JNB TI,$;;;
CLR TI
MOV A,@R0
ANL A,#0FH
MOV DPTR,#CARDASCII
MOVC A,@A+DPTR
MOV SBUF,A;@R0;發送一個數據
JNB TI,$;;;
CLR TI
INC R0
AAA2: DJNZ R7,AAA0;;數據發送完了嗎?
SETB IT1; ;允許中斷
MOV A,#" "
MOV SBUF,A;@R0;發送一個數據
JNB TI,$;;;
CLR TI
MOV A,#" "
MOV SBUF,A;@R0;發送一個數據
JNB TI,$;;;
CLR TI
AJMP MAA
CARDASCII :DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
;HEX:00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
;;;;;讀WG26信號的子程序
;;;注意:R1,R7和B在這里已設為專用,且r7初始時清零.如果在
;;主程序中要用到r1及r7,則在子程序中要加入退出時保存
;;進入時恢復的指令。以免再次進入中斷時不能正常工作。
; WG26ST=1表示開始讀WG26位數據
; WG26OK=1表示讀完26位數據
;;;;;38H存放第一位數據,是2-13位的偶校驗位,FFH表示1,00H表示0
;;;;;39H存放第2-9位數據
;;;;;3AH存放第10-17位數據
;;;;;3BH存放第18-25位數據
;;;;;3CH存放第26位數據,是14-25位的奇校驗位,FFH表示1,00H表示0
INT00: PUSH ACC
PUSH PSW
SETB WG26ST
SETB DATA0
NOP
NOP
MOV C,DATA0 ;讀WG26的數據
MOV B.0,C ;保存C值
INC R7 ;位數加一
CJNE R7,#1H,NE1;不是第一位轉
MOV R1,#38H ;是第一位
EVENODD: MOV C,B.0 ;存奇偶校驗位
JNC DY0
MOV @R1,#0FFH
AJMP RET0
DY0: MOV @R1,#00H
AJMP RET0
NE1: CJNE R7,#02H,NE2;不是第二位轉
INC R1 ;產生新地址
SJMP NE19
NE2: CJNE R7,#0AH,NE0A;不是第10位轉
INC R1 ;產生新地址
SJMP NE19
NE0A: CJNE R7,#012H,NE12;不是第18位轉
INC R1 ;產生新地址
SJMP NE19
NE12: CJNE R7,#01AH,NE19;不是第26位轉
MOV R7,#0H ; 是第26位清R7
INC R1 ;產生新地址
SETB WG26OK ;讀完26位,WG26標志位置1
SJMP EVENODD
NE19: MOV A,@R1 ;處理數據
RL A ;左移一位
MOV C,B.0
MOV ACC.0,C ;新數據存入低位
MOV @R1,A
RET0: POP PSW
POP ACC
RETI ;退出中斷
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;
INT01: PUSH ACC
PUSH PSW
SETB WG26ST
SETB DATA1
NOP
NOP
MOV C,DATA1 ;讀WG26的數據
CPL C
MOV B.0,C ;保存C值
INC R7 ;位數加一
CJNE R7,#1H,NE11;不是第一位轉
MOV R1,#38H ;是第一位
EVENODD1: MOV C,B.0 ;存奇偶校驗位
JNC DY0
MOV @R1,#0FFH
AJMP RET0
MOV @R1,#00H
AJMP RET01
NE11: CJNE R7,#02H,NE21;不是第二位轉
INC R1 ;產生新地址
SJMP NE19
NE21: CJNE R7,#0AH,NE0A1;不是第10位轉
INC R1 ;產生新地址
SJMP NE19
NE0A1: CJNE R7,#012H,NE121;不是第18位轉
INC R1 ;產生新地址
SJMP NE19
NE121: CJNE R7,#01AH,NE191;不是第26位轉
MOV R7,#0H ; 是第26位清R7
INC R1 ;產生新地址
SETB WG26OK ;讀完26位,WG26標志位置1
SJMP EVENODD1
NE191: MOV A,@R1 ;處理數據
RL A ;左移一位
MOV C,B.0
MOV ACC.0,C ;新數據存入低位
MOV @R1,A
RET01: POP PSW
POP ACC
RETI ;退出中斷
;延時程序
A250US: MOV R5,#6EH
DJNZ R5,$
DL: ;延時程序
MOV 25H , #01H
MOV 24H , #050
DL0:
MOV R6 , 24H ;2
MOV A , 25H ;1
DEC 25H ;1
JNZ DL1 ;2
DEC 24H ;1
DL1:
ORL A , R6 ;1
JZ DL2 ;2
SJMP DL0 ;2
DL2:
RET
AS1MS: MOV R6,#0E5H
AS1MS1: NOP
NOP
DJNZ R6,AS1MS1
RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -