51 单片机 定时器1 是做串口通信用的, 定时器0是输出脉冲, 为什么我的程序 进入中断0 之后只运行一遍?

全部程序如下

void Uart_Printf()
{
SBUF=0;
printf("串口初始化完毕\n");
}
void init_rs232()
{
ES=0;
TR1=0;

TMOD=0x21;
PCON=0x80;//SMOD=1
SCON=0x50;//工作方式1,波特率9600,允许接收
TH1=0xfA; //设置波特率 9600
TL1=0xfA;
TR1=1; // 定时器1启动
TI=0; //发送中断标志位清零
RI=0; //接收中断标志位清零

PS=1;
IE|=0x90; // 开串行中断 及 总中断

Uart_Printf();
}

void main()
{
P0=1;
init_rs232();

Command= &CommandBuff[0];
while (1)
{
if (CommandCome==1) //下面是命令解析
{
CommandCome=0;

else if (strncmp(Command,"RS",2)==0) // 设置 slew 速度 "#:RS#"
{
slewspeed = 6000;
printf("maxslow",slewspeed);
ET0=1;//计时器0允许
TR0=1;//启动计时器0
TH0= (65535-slewspeed)/256;
TL0=(65535-slewspeed)%256;
}

}
}

}

void UartInt(void) interrupt 4 using 3
{
if (RI==1)
{
ES=0;
sdata=SBUF;
RI=0;
if ((sdata==':')&&(CommandCome==0)&&(InRec==0)) //收到冒号 并且 命令缓冲区为空
{
InRec=1; //命令接收中
}
else if ((InRec>0)&&(sdata!='#')) // 如果命了接收中 并且没有收到 #
{
CommandBuff[InRec-1]=sdata;
//if (isprint(sdata)==1 )
InRec=InRec+1;
}
else if ((sdata=='#')&&(InRec>0)) //收到命了结束表示
{
CommandBuff[InRec-1]=0;
InRec=0; //接收空闲中
CommandCome=1; //收到命了
}

else if (InRec>4) //命了长度超过4 还没有收到命了结束符号
{
InRec=0 ; //接收为空
CommandCome=0; //忽略命令
}
ES=1;
}
}

void Timer0(void) interrupt 1 using 1
{

TH0=(65536- 6000)/256;
TL0=(65536- 6000)%256;
P0=!P0;
}

你既然使用 printf("串口初始化完毕\n"); 这样的语句,就是说串口,被系统占用了。

你还想用串口输入,就应该用 SCAN 函数。追问

您好! 不是串口通信现在有问题, 而是 我能够顺利进入 定时器0 的中断,但是中断内的代码只执行一次

是不是 中断 优先级设置 有问题?

追答

看你的程序结构,中间,好像有些不足:

void main()
{
P0=1;
init_rs232();
Command= &CommandBuff[0];
while (1) {
if (CommandCome==1) //下面是命令解析
{
CommandCome=0;

//这里缺少一些

else if (strncmp(Command,"RS",2)==0) // 设置 slew 速度 "#:RS#"
{
slewspeed = 6000;
printf("maxslow",slewspeed);
ET0=1;//计时器0允许
TR0=1;//启动计时器0
TH0=(65535-slewspeed)/256;
TL0=(65535-slewspeed)%256;
}
}
}
}

这样的程序,难说毛病出在什么地方。

追问

应为 命令 太多 所以直接删除掉了, 删除的代码中 跟 设置 开 定时器0 中断 没有关系,
我把初始化中 PS=1 删除掉,就可以了!

PS=1 是设置 串口中断优先级为最高 ,为什么会这样呢

追答

这样的语句:printf("串口初始化完毕\n"); ,是使用串口的库函数。

谁也不知道,在这里面,都闹了些什么怪。
也许,是它长期占用中断,别的中断就进不来?

既然好用了,表示祝贺。

温馨提示:内容为网友见解,仅供参考
无其他回答

51单片机的 串口 和 定时器0?
定时器中断和串口中断是相互独立的互不影响,并且定时器中断比串口中断的级别高;我没遇到过你这样的问题,应该是你哪里出错了,仔细检查,也可能是出现在你调试过程中;

51单片机程序,为什么我的程序开了定时器1就会影响到定时器0的定时...
当然 程序 产生 中断T1 后程序就跑飞了。加上 T1 中断函数 就能正常。

51单片机定时器0和定时器1使用冲突
SM1=1;当 REN=1; 执行完后,单片机完全符合串口方式0,同步移位方式,如果你这时板子接在电脑串口上,不管你电脑有没有发串口数据,单片机RXD脚已经在接收了,而且你没写串口中断,RI不清0,那就在串口中断里出不来了,下面的程序都做不到,所以你定时器0不动,关了T1就等于关了串口,也就正常...

51单片机串口通信问题
1、是在一个字节接收成功或一个字节发送成功以后进入中断程序(不过,一般在发送时是将中断关闭的,也就不进入中断了)。此时,定时器的作用就是为了设定串口速率,因为单片机的速度和串口的速度不是一个数量级的,所以一定要有个变速箱。2、数据的接收是由硬件控制的,其实,数据的接收发送都是有一个...

STC51单片机同时使用定时器0定时器1和串口
用 T1 控制波特率,此期间,T1 就不能用来中断了。其实,想要实现定时,有一个 T0 足以满足各种需求。T1,就不应该用来做定时用。T2,是有的。

关于51单片机的串口和定时器共用冲突
串口需要定时器1或定时器2作为波特率发生器哦,这个定时器要工作在方式2,不能中断。按照你说的,应该没有这个问题,串口不会影响T0的。代码不完全,看不出来呢

51单片机 串口中断用T1定时器设定波特率,ET1=0,ES=1;在不发送任何信息的...
进入中断后中断请求标志位RI没有清零,另外中断进去为什么不读取缓冲器内的信息?

51单片机Keil C51下使用printf输出到串口,为何初始化了串口之后就可以使...
因为是这样的,在Keil\\C51\\LIB目录下有个putchar.c文件,printf函数会调用该文件中的 putchar函数,putchar里面的使用的寄存器都是标准51的(如TI,SBUF),它 们的地址是固定的,由此可知printf函数只针对串口0。如果想让printf函数支持串口1或串口2。。。那么修改putchar函数的寄存器即可,比如SBUF改为...

51单片机串口中断能优先定时器中断吗?
可以的 51单片机的默认(此时的IP寄存器不做设置)中断优先级为: 外部中断0 > 定时\/计数器0 > 外部中断1 > 定时\/计数器1 > 串行中断; 但这种优先级只是逻辑上的优先级,当同时有几种中断到达时,高优先级中断会先得到服务。这种优先级实际上是中断同时到达的情况下,谁先得到服务的优先级,而不...

为什么我c51单片机定时器数码管显示和串口不能同时实现?
注意c51单片机串口要用到定时器1作为波特率发生器。如果数码管显示也用定时器1就会冲突。

相似回答