ORG 0000H SJMP START ORG 0023H ;串行口中断入口地址 SJMP RECEIVE ;串行口中断接收程序 ORG 0030H START:MOV R0,#0 ;接收数据计数初值 MOV R1,#30H ;接收数据反冲区的起始地址 MOV R2,#96 ;预设数据反冲区的长度 ;波特率设置:波特率位9600 一个起始位,8个数据位和一个结束位 MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H MOV SCON,#50H MOV PCON,#80H SETB TR1 ;启动定时器1 SETB EA ;中断总允许位 SETB ES ;串行口中断允许位 HERE: SJMP HERE ;等待串行口接收中断 ;串行口接收中断子程序 RECEIVE:CLR C WAIT_R:MOV A,SBUF MOV @R1,A INC R1 INC R0 MOV A,R0 SUBB A,R2 JNC LOOP_SEND RETI ;串行口循环发送子程序 LOOP_SEND:CLR EA ;清除中断 MOV R1,#30H ;循环一次发送两个字节,所以循环次数初值设位R2=R2/2=96/2=48 MOV R2,#48 LOOP_T:MOV A,@R1 MOV DPTR,#7FFFH MOVX @DPTR,A MOV SBUF,A WAIT1_T:JNB TI,WAIT1_T CLR TI INC R1 MOV A,@R1 MOV DPTR,#0BFFFH MOVX @DPTR,A MOV SBUF,A WAIT2_T:JNB TI,WAIT2_T CLR TI LCALL DELAY INC R1 DJNZ R2,LOOP_T MOV R2,#48 ;恢复发送数据反冲区的长度 MOV R1,#30H ;恢复发送数据反冲区的起始位置 AJMP LOOP_T DELAY: MOV R5,#50 DELAY_2:MOV R6,#50 DELAY_1:MOV R7,#50 DJNZ R7,$ DJNZ R6,DELAY_1 DJNZ R5,DELAY_2 RET
|