请教串口中断的问题,通信正常中断无法返回,试过将发送程序移动到主程序,但时间问题无法处理,急盼!

//功能:控制p1.0高电平的时间,时间由串口接收的数据决定,剩余时间可通过串口发送,晶振频率11.0592MHz,串行口工作于方式1,波特率为9600#include<... //功能: 控制p1.0高电平的时间,时间由串口接收的数据决定,剩余时间可通过串口发送,晶振频率11.0592MHz,串行口工作于方式1,波特率为9600
#include<reg51.h>
sbit P10=P1^0 ;
unsigned int receive=0;
unsigned char temp[4],temp1[4];
//void delay(unsigned int k) //延时一分钟
void delay() //延时一分钟
{
unsigned int i,j;
//for(j=0;j<k;j++)
//{
for(i=0;i<2;i++) // 设置10次循环次数
{
TH0=0x3c; // 设置定时器初值
TL0=0xb0;
TR0=1; // 启动T0
while(!TF0); // 查询计数是否溢出,即定时50ms时间到,TF0=0
TF0=0; // 50ms定时时间到,将定时器溢出标志位TF0清零
}
// }
}

void main() //主函数
{
TMOD=0x21; //设定定时器1的工作方式为方式2
TH1=0xfd; //设置串行口波特率为9600
TL1=0xfd;
SCON=0x50; //设置串行口的工作方式为方式1,允许接收
PCON=0x00;
TR1=1;
EA=1;
ES=1;
P10=1;
for(;receive>0;receive--)
{delay() ; }
//delay(receive);
P10=0;
while(1);

}

void comm(void) interrupt 4
{

// EA= 0;
unsigned char p,q;
/* do{
while(RI!=1);

temp[p++]=SBUF;

RI=0; }while(SBUF!=0x00);
p--;
for(q=0;q<p;q++)
{
receive=(temp[q]-0x30)+receive*10;
SBUF=temp[q];
while(!TI); //查询发送是否完毕
TI=0; //发送完毕,TI由软件清0
} */
for(q=0;q<4;q++)
{
while(RI!=1);
temp[q]=SBUF;
RI=0;
for(p=0;p<100;p++); //延时
if(temp[q]!='a')
receive=(temp[q]-0x30)+receive*10; //接收字符转换成数字
}
// for(q=0;q<100;q++); //延时
//receive=1234;
//delay(400);
if(temp[0]=='a') //收到查询剩余时间的命令
{
temp1[0]=receive/1000;
temp1[1]=receive%1000/100;
temp1[2]=receive%100/10;
temp1[3]=receive%10;
for(p=0;p<4;p++)
{

SBUF=temp1[p];
while(!TI); //查询发送是否完毕
TI=0; //发送完毕,TI由软件清0
}
/* SBUF=5;
while(!TI); //查询发送是否完毕
TI=0; //发送完毕,TI由软件清0
SBUF=5;
while(!TI); //查询发送是否完毕
TI=0; //发送完毕,TI由软件清0
*/
}

// EA = 1;

}
展开
 我来答
做而论道
高能答主

2012-02-20 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:8318万
展开全部
串口中断函数,写了这老长,都是干什么的?
主函数,好像一直在空闲。
更多追问追答
追问
有些是写错了的暂时屏蔽了,我也发现了这个问题,目前的修改方法是在主程序开中断前把串口接收程序再写一遍,把设定的时间收进来,请问是否有更好的方法?比如把中断里的发送程序移动到主程序,这样可以避免中断无法返回,时间(receive变量)无法处理,多谢!
另:中断程序里有段do-while语句是被屏蔽了的,本来是想能够接收任意长度的字符串,但运行的时候什么都收不到,不得已设定数据长度为4,可有解法?qq:54296901
追答
串口中断函数,每当收到一个字节,就会被激活。
函数中,把收到的字符,送到某个数组里面,数组的指针再加上一,这个函数,就应该结束了。

主函数中,发现指针变化了,就进行数据处理。

大活,让主函数来干,中断函数,仅仅是站岗放哨的,怎么能让它老也不退出?
意法半导体(中国)投资有限公司
2023-06-12 广告
51单片机中的工作寄存器是一种特殊的寄存器,它存储的数据可以在单片机的工作时钟周期内被修改。工作寄存器通常用于存储操作数、传输数据或执行其他常规操作。由于51单片机具有许多指令可以直接访问内部的工作寄存器,因此工作寄存器在单片机编程中具有重... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式