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
}
void chuank () interrupt 4
{
RI=0;
if(SBUF==0x01)
{ num=2;}
else if(num==2)
{kz=SBUF;num=0;}
}
两次初始化,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; //开总中断
}
我看出来了,你在设置串口的时候把定时器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;