想问各位,利用51单片机如何产生占空比可调的pwm波,占空比要通过程序自动调节,用于实现彩灯的七种颜色

想问各位,利用51单片机如何产生占空比可调的pwm波,占空比要通过程序自动调节,不能手动,另外为什么我用proteus仿真时,尽管定时器定时是1s,可是彩灯的变化频率却还是非常快,感觉pwm的效果根本没有,求各位指导 。

用定时器做的,改变m_num的数值就会改变占空比

void timer1() interrupt 3
{

m_count++;

if(m_count==m_num)
PWM=0;
if(m_count==200)
{
m_count=0;
PWM=1;
}

TH1=(65536-1000)/256;
TL1=(65536-1000)%256;

}追问

我感觉你写的我不是很懂,你这个
if(m_count==m_num)
PWM=0;
if(m_count==200)
{
m_count=0;
PWM=1;
}
那要是m_count两个都不满足那就没下文了啊!

追答

m_count加到200就会清零,不会没下文,每进一次中断只加1;m_num是小于200;
m_num 数控制高电平的时间就是占空比控制,在0到m_num期间是高电平;在m_num到200之间是低电平,到200后又变高电平, 改变m_num的数值就改变了占空比。

这样应该比较明白了吧

追问

不好意思哈,在下面程序中
if(m_count==m_num)
PWM=0;
只有当m_count==m_num这个条件是才会输出低电平,但是这个就是一个点位而已,是不是这中间不太应该==号,而应该是大于号或者小于号类的

追答

这个中断里只有PWM=0和PWM=1两周情况,当满足 if(m_count==m_num)时,PWM=0,然后就没有改变PWM的数值,他就会一直保持低电平。知道满足if(m_count==200)时变为高电平,然后一直保持。PWM是一个变量,在你没有改变它的数值之前,他是一直保持原来的数值。

如果还没看懂,就看一下谭浩强 《C程序设计》 面的if 语句;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-17
举个例子吧。先用定时器0定时Ts,再用定时器1定时ts。定时器1中断触发后,输出低电平,关闭定时器1,这样就能保证输出tms的正波形,;定时器0中断触发时,输出高电平,重置定时器0、1。占空比 = t/T,频率 = 1/T。注意T一定要大于t。追问

占空比要能通过程序改变,不是手动改变的

追答

那也好办啊。你输出一个周期的波形后,按照一定的规律改变定时器1的计时时间(设定定时器1的初值是和某个变量有关的)就可以了。

第2个回答  2013-05-17
用两个定时器来做就行了