51单片机定时器和串口通讯冲突怎么办?

我做控制电机的PWM波用了定时器0,串口接收用了定时器1,没加上串口的时候PWM波还能用,但是加上串口中断PWM就不能用了。电机转得好快。不方便控制,用的直流电机。发个中断部分程序你们帮看下,谢谢了。
void init_t0() //定时器0,PWM产生
{
TMOD=0x01;
TH0=0xfc; //1ms延时常数
TL0=0xff; //频率调节
EA=1;
ET0=1;
TR0=1;
}
void init_int() //串口、定时器初始化
{
TMOD=0x20; //定时器T1,方式二
TH1=0xfd; //波特率2400
TL1=0xfd;
TR1=1; //启动T1
SM0=0; //串口,工作方式一
SM1=1;
REN=1; //允许接收
ES=1; //串口中断允许
EA=1; //开总中断
}
然后中断里面是这样写的:
void timer0() interrupt 1
{
TH0=0xfc;
TL0=0xff ;
A1++;
if(A1==100)A1=0;
if(A1<B1)PWM=1; //启动输出
else PWM=0 ;
}
void chuank () interrupt 4
{
RI=0;
if(SBUF==0x01)
{ num=2;}
else if(num==2)
{kz=SBUF;num=0;}
}
当我删掉串口部分时PWM波就很正常,加上就不行了,我也试过设置优先级,PT0=1,PS=1,PT1=1都不行
刚刚想到了,自己犯2,谁说出来分就给谁了

void init_t0() //定时器0,PWM产生
{
TMOD|=0x01;
TH0=0xfc; //1ms延时常数
TL0=0xff; //频率调节
PT0=1;
EA=1;
ET0=1;
TR0=1;
}
void init_int() //串口、定时器初始化
{
TMOD|=0x20; //定时器T1,方式二
TH1=0xfd; //波特率2400
TL1=0xfd;
TR1=1; //启动T1
SM0=0; //串口,工作方式一
SM1=1;
REN=1; //允许接收
ES=1; //串口中断允许
EA=1; //开总中断
}
然后中断里面是这样写的:
void timer0() interrupt 1
{
TH0=0xfc;
TL0=0xff ;
A1++;
if(A1==100)A1=0;
if(A1<B1)PWM=1; //启动输出
else PWM=0 ;
}
void chuank () interrupt 4
{
RI=0;
if(SBUF==0x01)
{ num=2;}
else if(num==2)
{kz=SBUF;num=0;}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-20
两次初始化,TMOD,有两个不同的数值,互相干扰。

合并为一次初始化:

void init() //定时器0,PWM产生
{
TMOD = 0x21;
TH0 = 0xfc; //1ms延时常数
TL0 = 0xff; //频率调节
ET0 = 1;
TR0 = 1;

TH1 = 0xfd; //波特率2400
TL1 = 0xfd;
TR1 = 1; //启动T1
SM0 = 0; //串口,工作方式一
SM1 = 1;
REN = 1; //允许接收
ES = 1; //串口中断允许
EA = 1; //开总中断
}
第2个回答  2013-08-20
我看出来了,你在设置串口的时候把定时器0给关了“TMOD=0x20; //定时器T1,方式二
”,不过你定时器0采用方式1不如方式2自动装载好,给你我的PWM代码你看看我用的T1
u8 TIME;
sbit PWMO = P1^5;
u8 PWM = 30;

void Timer1(void) interrupt 3
{
TIME++;
if(TIME==99)
{
TIME=0;
PWMO=1;
}
if (TIME == PWM)
{
PWMO=0;
}
}
//定时器设置
TIME=0;
TMOD=0x20;
TH1=156;
TL1=156;
EA=1;
ET1=1;
TR1=1;本回答被提问者和网友采纳