51 单片机 定时器1 是做串口通信用的, 定时器0是输出脉冲, 为什么我的程序 进入中断0 之后只运行一遍?
全部程序如下voidUart_Printf(){SBUF=0;printf("串口初始化完毕\n");}voidinit_rs232(){ES=0;TR1=0;TMOD=...
全部程序如下
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;
} 展开
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;
} 展开
1个回答
展开全部
你既然使用 printf("串口初始化完毕\n"); 这样的语句,就是说串口,被系统占用了。
你还想用串口输入,就应该用 SCAN 函数。
你还想用串口输入,就应该用 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;
}
}
}
}
这样的程序,难说毛病出在什么地方。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询