关于51系列单片机利用定时器生成频率占空比可调的PWM利用51单片机(无PWM模块)的软件模拟生成PWM,其频率和占空比都是可调的,在去年电子竞赛的时候一直没有自己尝试过,现在到了13的五月,要准备电子竞赛了,想把一些比较基础的东西自己亲手调一调。在刘海波老师的单片机课,听过老师的方法生成PWM,当时就是一惊!自己从来没有这么做过。原理比较简单,下面分别阐述:自己的想法,要用到两个定时器,一个用于控制占空比,一个用于控制周期,即频率例如:t0控制高电平(或者)维持的时间,t1控制低电平(或者高电平)维持的时间,两者的时间的之和就是该PWM的周期,考虑到单片机上电引脚的电平的问题,此时生成的PWm的最好是先高后低。往往第一个周期是不对的。以下下就详细说明:单片机上电为高电平,开始t0定时器和相关中断设置,等到t0定时时间T0到了,进入中断程序,变为低电平,同时关掉t0和开启t1,即是TR0=0,TR1=1;同理t1定时时间T1到了,进入中断程序,变为低电平,同时关掉t1和开启t0,即是TR0=1,TR1=0;即是即是采用定时器t0、t1轮流定时,一个定时器控制一种电平的时间,t0为高电平定时的时间,t1为低电平定时的时间。注意:这个方法在系统的初始化的时候,必须将t0的定时器开启,否则,全部无法进行还有一种方法是开始t0定时器、t1定时器同时开启,其中t0定时的时间T0是高电平的时间,t1定时的时间T1是整个PWM的周期。开始t0定时器、t1定时器同时开启,当然,T0的时间肯定要比T1的大,当t0定时的时间T0到了,进入t0中断程序,引脚又高电平变到低电平,同时将t0定时器关掉;当t1定时的时间T1到了,进入t1中断程序,引脚又低电平变到高电平,同时将t0定时器开启。以上两种方法都是利用两个定时器分别控制不同电平的时间,占用了51的几乎全部定时器,并且计算起来比较麻烦,要计算两个定时器的值,占空比的计算也相对困难。老师的方法是利用一个定时来模拟生成其频率和占空比都是可调的PWM,主要思想为:例如模拟生成频率1KHZ和占空比是50%的PWM,首先将它分成的100分(也可以是更高的精度),控制这单独的每一份,来组成整个周期的PWM,1KHZ的T是1MS,分成100份,每一份的时间是0.01ms(10us),采用t0的16位工作方式,我们可以知道10us的数值C是10(12M晶振),初始值TH0=(65536-(C=10))/256,TL0=(65536-(C=10))%256,在此时,我们设置一个变量i,来表示份数.50%占空比,我们就让前面的50份为高,即是i=50,后50份为低。50i=100,.当I100时,为0.上面的就完成的频率1KHZ和占空比是50%的PWM,我们可以总结为定时器的C确定PWM的周期,q为占空比。