我的目的是用定时器0控制pwm的周期,固定它。然后定时器1控制pwm的占空比,可是问题是定时器1根本不工作啊,还有一大部分程序运行时间都浪费到了定时器0里面
/*定时器赋初值----------------*/
unsigned char pwm_on;
sbit pwm_out=P2^4;//pwm输出端口
void TimerInit(void)
{
TMOD=0x11;//定时器0和定时器1工作于模式一
TH0=(65536-50)/256;//初值50us,pwm频率为20khz
TL0=(65536-50)%256;
ET0=1;//打开定时器中断
TR0=1;//启动定时器0
PT0=0;//定时器0优先级低
TR1=0;
ET1=1;
PT1=1;
EA=1;//开总中断
}
void main()
{
pwm_on=25;//占空比设置
pwm_out=0;
Lcd_Init();//LCD初始化
TimerInit();
while(1)
{
DataProcessing ();//数据处理
Display();
}
}
//中断控制pwm
void Timer0irp (void) interrupt 1
{
pwm_out=1;
TH0=(65536-50)/256;
TL0=(65536-50)%256;//定时器0设置为50ms的周期
TH1=(65536-pwm_on)/256;
TL1=(65536-pwm_on)%256;;//由定时器1设置占空比
TR1=1;
// CLK=~CLK;
}
void Timer1irp (void) interrupt 3
{
TR1=0;
pwm_out=0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我是觉得2个定时器简单方便,一个不好调,所以就用来2个,问题出在哪了呢
看lz的程序,定时器0是输出1,定时器1中断是输出0,只是lz没想好,定时器是同时工作的,其实lz只要让定时器轮流工作就可以了。在定时器0中断时关0开1中断,在定时器1中断时关1开0中断,只是这样浪费了个定时器而已
好的,我试试这个方法,谢谢
lz你的0和1 是同时工作的,如果0的时间比1少,那1永远也不能中断,因为0会重新刷新1的时间,即使比他多也会让1时间刷新,你不仅要在0中断控制1中断开还要关0中断,同样1中断时也如此,同时0中断时刷1时间。1中断也要刷0时间,其实用1个定时器还可以输出任意多组pwm,只要把定时器当个时基就可以办到,比如1个中断时为1us,那你累加到10个时基输出高电平,然后在累加到10个时基输出低电平,就可输出20us的占空50%的pwm,
一周热门 更多>