别客气,我不是老师,我们相互学习罢了
;该程序采用串口中断来接收单个字符,并进行判断处理的例子,作为参考
;如果以后熟练了,可以开BUFF区,
;严格控制中断处理时间,串口中断来接收单个字符,定时修正,
;并由主程序判断对接收信息的处理
;00H-07H分别用R0-R7表示,作通用工作寄存器
; ;串口数据缓冲区
WORD2 EQU 09H ;接收区1-8
WORD3 EQU 0AH
WORD4 EQU 0BH
WORD5 EQU 0CH
WORD6 EQU 0DH
WORD7 EQU 0EH
WORD8 EQU 0FH
;以下是立即数定义
STX EQU 02H ;start of text
ETX EQU 03H ;end of text
;以下是主程序开始
ORG 0000H
AJMP MAIN ;转主程序
ORG 0023H
LJMP SCINT ;转串行口通信中断服务子程序
ORG 0030H
;-------------------------------------------
;以下是程序运行初使化
MAIN: MOV SP,#30H
CLR PSW.3 ;选定第0组工作寄存器
CLR PSW.4
CLR A
MOV R0,#08H ;inside ram initialize
MOV R7,#30
INITIA: MOV @R0,A
INC R0
DJNZ R7,INITIA
;----------------------
;---------------------
MOV PCON,#00H
MOV SCON,#01010000B ;MODE=1 SM2=0 REN=1
MOV TMOD,#00100000B ;T1:波特率发生器 模式2
MOV TL1,#0F4H ;晶振=11.0592M
MOV TH1,#0F4H
CLR ET1
SETB TR1 ;启动波特率 =2400Bps
;---------------------------
SETB EA
SETB ES ;串行口接收数据开
LOOP: ..... ;程序循环体
.....
LJMP LOOP
;-------------------串口接收-----------
SCINT: PUSH ACC
PUSH PSW
CLR ES
CLR RI
MOV A,SBUF
CJNE R2,#00H,BYTE1 ;接收WORD1 起始码
CJNE A,#STX,REFUSE
MOV R2,#01H
LJMP SCEXIT
BYTE1: CJNE R2,#01H,BYTE2 ;接收WORD2 地址
;CJNE A,#3CH,REFUSE ;与' <'比较
MOV WORD2,A
MOV R2,#02H
LJMP SCEXIT
BYTE2: CJNE R2,#02H,BYTE3 ;接收WORD3 DATA1
;CJNE A,#43H,REFUSE ;与'C'比较
MOV WORD3,A
MOV R2,#03H
LJMP SCEXIT
BYTE3: CJNE R2,#03H,BYTE4 ;接收WORD4 DATA2
;CJNE A,#X1H,REFUSE ;与X1H比较
MOV WORD4,A
MOV R2,#04H
LJMP SCEXIT
BYTE4: CJNE R2,#04H,BYTE5 ;接收WORD5 DATA3
;CJNE A,#X2H,REFUSE ;与X2比较
MOV WORD5,A
SJMP DEALDT
LJMP SCEXIT
BYTE5: CJNE R2,#05H,BYTE6 ;接收WORD6 DATA4
;CJNE A,#3EH,REFUSE ;与' <'比较
CJNE A,ETX,REFUSE
LJMP SCEXIT
REFUSE: LJMP SCRETI ;数据非法返回区
DEALDT: ........ ;中断处理段
SCRETI: MOV R2,#00H
SCEXIT: SETB ES
POP PSW
POP ACC
RETI
END
发表时间:2003年1月24日15:51:00