我只要转一段串口中断程序就行了
下面是汇编语句
;************串口中断程序*************
RECIV: CLR ES
setb led
PUSH PSW
PUSH ACC
PUSH 00H
PUSH 01H
CLR RI
MOV A,SBUF
MOV 30H,A ;进入中断后收 帧头#55H
MOV R0,#31H ;初始化数据区
MOV R1,#05H
MOV A,#00H
REC1: MOV @R0,A
INC R0
DJNZ R1,REC1
MOV R0,#31H
MOV R1,#5
RECIV1:
JNB RI,$
CLR RI
MOV A,SBUF
MOV @R0,A
clr c
SUBB A,#0AAH
JZ BJY1
INC R0
DJNZ R1,RECIV1
BJY1 : MOV A,30H ;校验头字节是否是#55H,即桢头
CLR C
SUBB A,#55H
JNZ RECIVERR
MOV A,35H ;校验最后一个字节是否是#0AAH,即桢尾
CLR C
SUBB A,#0AAH
JNZ RECIVERR
MOV A,31H
CLR C
SUBB A,#58H ;校验是否是读命令#58H
JNZ RECIVERR
MOV A,#00H ;校验34H字节的校验码
MOV R0,#31H
MOV R1,#3
RECIV2: ADD A,@R0
INC R0
DJNZ R1,RECIV2
CJNE A,34H,RECIVERR
SETB 78H
AJMP RECIVO
RECIVERR:
SETB 79H
RECIVO: POP 01H
POP 00H
POP ACC
POP PSW
RETI
这是我自己转的C语言
# include <REG51F.h>
#define uint unsigned int
#define INBUF_LEN 6 //数据长度
sfr Addr =0x30;
uint i=0 ,sum,num;
num=INBUF_LEN;
void main(void)
{
while(1);
}
//串口中断处理
void serial () interrupt 4
{
ES=0;
LED=1;
if (RI)
{
if(num)
{
RI = 0;
*(Addr+i)= SBUF; //放入数据
i++; // 地址+1
num--; //6个数
if(num==0)
{
sum=(*(Addr+1))+(*(Addr+2))+(*(Addr+3));
if((*Addr)!=0x55 ||(*(Addr+5))!=0xAA || sum!=(*(Addr+4))) //校验
RECDELAY=1;
else
ROVER=1;
}
}
if (i==INBUF_LEN-1) i=0;//地址到顶部回到底部
}
}
不知道对不对,现在还有个问题,c语言中断时是怎样保护现场的,是否也要像汇编那样需要写堆栈语句? |