51单片机串口接收多字节的中断程序如何写 请大虾赐教 小弟先行谢过了

如题所述

第1个回答  2012-09-14
void sys_init(void)//UART TIMER0初始化
{
TH0 = 0xB8; TL0 = 0x00; //20ms的时钟基准
//串口中断
TI=0;
RI=0;
SCON=0x50; //选用方式1
TMOD=0x20;
TMOD = (TMOD & 0xf0) | 1;//MODE 1
TH1=0xfd; //波特率为9600
TL1=0xfd;
PCON=0x00; //倍频0x80
IE = 0x90; // EA ELVD EADC ES ET1 EX1 ET0 EX0
// IE = 0xb0; // EA XX ET2 ES ET0 EX0 ET1 EX1
TR1=1; //enable TIMER1
ES=1; //开串口开断
TR0=1; //串口接收中断
ET0=0; //T0 中断
ET1=0; // T1 中断

IT0=1;EX0=1;
EA=1;
timer_1S_cnt=0;
IGT=1;
}

void receive(void) interrupt 4 using 1
{
if(RI)
{
// if(Rx<RxIn)
{*pBuf=SBUF;pBuf++;
// *(SystemBuf+Rx)=SBUF;
// SystemBuf[Rx]=SBUF;
Rx++;
}
RI=0;
}
}
有开定时器和AD的,你自己去掉吧追问

你说我这么写对不
void ser() interrupt 4
{
RI=0;
b[i]=SBUF;
i++;
if(i==1)
{
IAP_SectorErase(0);
IAP_Program(0,b[1]);
i=0;
}
}

追答

在中断中不要长时间占用CPU,否则,会丢数据或者死机。不知道你这两个函数是否时间很长,如果时间长,就不行

追问

大概在100us左右 请问这么写对吗
void ser() interrupt 4
{
if(RI)
{
b[i]=SBUF;
if(i==1)
{
IAP_SectorErase(0);
IAP_Program(0,b[1]);
}
i++;
if(i==2)
{
i=0;
}
RI=0;
}
}
我只想把连续发送的两个字节的第二个字节存下来 你说我这么写对吗

追答

看程序应该是没问题了

追问

问题出在
IAP_SectorErase(0);
IAP_Program(0,b[1]);
这两个函数的时间太长了 所以中断不好使了

本回答被提问者采纳
第2个回答  2012-09-14
#include<reg51.h>
unsigned char buf[16],num;
void uart_isr() interrupt 4
{
if(RI)
{
RI=0;
buf[num]=SBUF;
num++; //注意num,buf[16]一定要设为全局变量
num&=0x0f; //开辟16个字节的缓冲区
}
}
main()
{
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
ES=1;
EA=1;
TR=1;
while(1)
{
//加入你自己的处理程序码
}
}追问

请问 你这个中断函数是不是只能接收两个字节的数据
num&=0x0f; //开辟16个字节的缓冲区

这句话有什么作用 请赐教

追答

这个缓冲区可以保存16个字节的数据,num&=0x0f的意思是当指针加到15时,再往上又变为0了

追问

你那个中断函数是不是可以连续接收16个字节的数据啊??是这样吗
那你说我想连续接收两个字节的数据应该怎么写

追答

#include
unsigned char buf[2],num;
void uart_isr() interrupt 4
{
if(RI)
{
RI=0;
buf[num]=SBUF;
num++;
}
}
main()
{
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
ES=1;
EA=1;
TR=1;
num=0;
while(1)
{
if(num>=2) //如果接受了两个数据
{
num=0;
//插入你的处理程序
}
}
}

本回答被网友采纳
相似回答