8051单片机实现PWM的方法

发布者:渤海湾最新更新时间:2017-11-20 来源: eefocus关键字:单片机  PWM 手机看文章 扫描二维码
随时随地手机看文章

PWM 是“脉冲宽度调制”的意思。
PWM 实际上是在单片机的某个引脚输出一系列的矩形波,其周期一般是固定的;而其高电平、低电平所占用的时间,是可以受控调整的。

高电平、低电平所占用的时间之比,称为占空比,其值为0~1之间。

PWM 的应用很广,简单的说,它可以控制灯光的亮度、可以控制直流电机的转速,甚至还可以输出语音信号。
新型的单片机,往往都含有硬件的 PWM 模块,编写程序就很简单;而老式的MCS-51系列,就不具备这个条件。
其实,在没有 PWM 硬件的单片机上实现 PWM,也并不难,只需一个定时器,令其工作在中断方式即可。

下面以网上的一个题目为例,说明实现 PWM 方法。
题目:AT89C52单片机输出可调 PWM 波。
要求:
1。单片机的晶振是12MHz,输出周期为1s。
2。用两个开关控制占空比的增加和减少,分20等级。

针对这个题目,做而论道设计了一个简单的实验电路:
 在 P2 口的 8 条线输出 PWM 波形;
 在 /INT1、/INT0 外接了两个按键,用来调整占空比;
 在 P0 口外接了两个 BCD 数码显示器,用来显示当前的占空比的等级。
 实验的时候,可以使用示波器来观察 P2 口输出的波形。
 如果把 PWM 波形的频率提高,也可以用 LED 观察到渐亮渐暗的效果,目前看,只是闪烁的时间发生变化。

//程序如下:
//==========================================
#include
unsigned int a, b;
//------------------------------------------
void main()
{
         TMOD = 0x01;                 //T0定时方式1
         TH0 = (65536-50000) / 256;   //50ms@12MHz
         TL0 = (65536-50000) % 256;
         TR0 = 1;

         ET0 = 1;
         EX0 = 1; EX1 = 1;
         IT0 = 1; IT1 = 1;
         EA = 1;

         a = 0;
         b = 10;
         while(1);
}
//------------------------------------------
void time0() interrupt 1
{
         TL0 = (65536-50000) % 256;
         TH0 = (65536-50000) / 256;   //50ms@12MHz
         a++;
         if(a == 20) a = 0;           //在这里调整周期.
         if(a < b) P2 = 0xff;        //在这里调整占空比.
         else   P2 = 0x00;
         P0 = ((b / 10) << 4) + b % 10; //显示占空比等级
}
//------------------------------------------ 
void X0_INT() interrupt 0
{
         b++;
         if(b > 19) b = 19;           //占空比等级最大为19
}
//------------------------------------------
void X1_INT() interrupt 2
{
         b--;
         if(b < 1) b = 1;             //占空比等级最小为1.
}
//==========================================
//电路以及仿真效果如下图:


8051单片机实现PWM的方法

这个程序时我在刚学单片机是转来的,今天我想就这个程序说两句。按功能要求来说这个程序是没有问题的,我想说的是——用pwm控制直流电机在你用硬件调试调试这个程序时,你会发现个问题:当你按下按钮减小占空比时直流电机是转一下停一下的用眼睛或者耳朵都是能分辨的。当然用pwm控制直流电机本来就是转下停下的,因为pwm就是有连续的一高一低电平。当他为高电平时电机转低电平时就停。我们现在要做的就是让电机的转动给我们的感觉是连续的,当然这肯定还是要从pwm下手。

要做到电机流畅的转动其实很简单,只要将pwm电平的周期缩短(频率升高)就行了也就是减小产生中断的时间(初值设大点)。

这个程序还是有很大的缺陷的,在protues上仿真有些问题是发现不了的。而这里出现的问题也是典型的——按键消抖。这个程序里是没有消抖的(如果进行了硬件消抖,这是没有问题的)。用按键来产生一个中断肯定是要消抖的,不管是硬件的还是软件的。在protues上两样都不用的话,仿真也是能通过的,所已说仿真通过不一定能在硬件上实现你想要的功能。

以上为转载


如果只是简单的想产生一定占空比的矩形信号可以对定时器这样使用,道理同上

 比如要P3^6产生占空比为30%的1KHZ的矩形波。

void timer() interrupt 1 //产生1khz的占空比为

{

TH0=(65536-100)/256;       //定时产生0.1KHZ的波形

TL0=(65536-100)%6;

a++;

if(a==3) //定时器运行3次指向下一句

P3^6=1;

else if (a==10) //记到10次时执行下一句

P3^6=0;

a=0;

}

也可以将红字设置为变量,用按键控制产生不同占空比、不同频率的矩形波。


关键字:单片机  PWM 引用地址:8051单片机实现PWM的方法

上一篇:详解51单片机的复位电路
下一篇:关于51单片机的P0口上拉电阻取值问题

推荐阅读最新更新时间:2024-03-16 15:46

基于XC886单片机的门控系统LIN总线通信模块设计
0 引言 随着汽车业的飞速发展,汽车电控系统的配置不断升级,使得车辆上的电子元件越来越多,其相互连接的网络结构也越来越复杂。过去所采用的电缆连接方式所带来的庞大布线负担,容易造成车体过重和线路的磨损老化。在这种情况下,就需要引入标准的总线技术,从而降低车身重量,同时提高各个电控元件之间的通信可靠性。上世纪80年代,根据车用通信网络在不同控制层面的不同功能要求,SAE (Societv ofAuto-mobile Engineering)将其分为A,B,C三类。其中A类为低速网,数据传输速率通常为1~10kb/s,LIN总线通信网络就属于此类。LIN总线一般应用于不需要高性能及带宽和复杂性较大的低端系统,如车门控制模块、座椅调节
[单片机]
基于XC886<font color='red'>单片机</font>的门控系统LIN总线通信模块设计
单片机的在线编程技术
  通常进行单片机的实验或开发时,编程器是必不可少的。仿真、调试完的程序需要借助编程器烧到单片机内部或外接的程序存储器中。普通的编程器价格从几百元到几千元不等,对于一般的单片机爱好者来说还是一笔不小的开支。另外,在开发过程中,程序每改动一次就要拔下电路板上的芯片编程后再插上,也比较麻烦。   随着单片机技术的发展,出现了可以在线编程的单片机。这种在线编程目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程,而IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体
[单片机]
单片机晶振五问五答
  1、89c52单片机如果不接晶振会有什么后果?   答:单片机不工作了 程序无法烧入 等等   2、若89c52单片机使用外接晶振,应如何设置?   答:晶振的两个管脚各接一个20~30pf的电容后分别接入单片机的XTAL1和XTAL2,两个电容的另一端并接后接地即可,不再需要任何设置   3、晶振的原理,如何产生正弦信号的,详细一点,从电路方面分析?   答:晶体可以等效为一个电感,与里面的电容形成振荡回路,能量从电感慢慢到电容,再从电容慢慢到电感,周而复始形成振荡。正半周是电容的充放电过程,负半周是电感的充放电过程。   4、11.0952的晶振和单片机哪些引脚连接能起作用?电源和18B20应该和单片机的哪些引脚相连呢?RT
[单片机]
AVR单片机入门系列(25)AVR PWM OC0
系统功能 AVR内部脉宽调制OC0输出实验,用LED指示PWM的频率,在PWM速度较低时,可观察到LED的闪烁。 硬件设计 AVR主控电路原理图 软件设计 //目标系统: 基于AVR单片机 //应用软件: ICC AVR /*01010101010101010101010101010101010101010101010101010101010101010101 ---------------------------------------------------------------------- 实验内容: AVR内部脉宽调制输出实验,用LED指示PWM的频率,在PWM速度较低时,可观察到LED的闪烁
[单片机]
AVR<font color='red'>单片机</font>入门系列(25)AVR <font color='red'>PWM</font> OC0
8051怎样开放和禁止中断,如何设置优先级
8051怎样开放和禁止中断,如何设置优先级 (1)由中断源提出中断请求,由中断控制允许控制决定是否响应中断,如果允许响应中断,则CPU按设定好的优先级的顺序响应中断。如果是同一优先级的中断,则按单片机内部的自然优先级顺序(外部中断0→定时器0中断→外部中断l→定时器1中断→串行接口中断)响应中断。 CPU响应中断请求后,就立即转入执行中断服务程序。保护断点、寻找中断源、中断处理、中断返回,程序返回断点处继续执行。 (2)由中断允许寄存器IE控制开放和禁止中断。欲开放某一中断,则应先开放总中断允许(EA置1),然后开放相应中断的中断允许(相应位置1);若要要禁止中断,则EA置O即可。 (3)由中断优先级控制寄存器IP控制
[单片机]
深层次分析8051单片机存储空间结构
  引言   单片机以它的廉价、体积小、可塑性强、稳定性高的特性,有着广阔的市场前景。 在用开关电源模块单片机开发产品时,虽然许多厂家设计了可编程ISP单片机,但是从安全与便捷方面考虑,单片机仿真器仍然是开发人员不可或缺的工具。单片机仿真器在产品开发阶段可用来替代MTD2002单片机进行软硬件调试,从而迅速发现、纠正程序中的错误,大大缩短开关电源模块单片机开发的周期。但实际中仿真器过于昂贵,因此,设计制作出一款廉价且实用的MTD2002仿真器有着广泛的市场。   传统的开关电源模块单片机仿真器硬件系统一般有三种实现方法。一、采用专用仿真的单片机。二、采用两套单片机,一个单片机用于仿真,并完成诸如通讯,中断等功能;另一个单片机则
[单片机]
深层次分析<font color='red'>8051</font><font color='red'>单片机</font>存储空间结构
51单片机汇编语言带进位加法指令
带进位加法 指令 (4条) 这4条指令除与 功能相同外,在进行加法运算时还需考虑进位问题。 ADDC A,data ;(A)+(data)+(C) (A) 累加器A中的内容与直接地址单元的内容连同进位位相加,结果存在A中 ADDC A,#data ;(A)+#data +(C) (A) 累加器A中的内容与立即数连同进位位相加,结果存在A中 ADDC A,Rn ;(A)+Rn+(C) (A) 累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存在A中 ADDC A,@Ri ;(A)+((Ri))+(C) (A) 累加器A中的内容与工作寄存器Ri指向地址单元中的内容、连同进位位相加,结果存在A中用途:将A中的值和其后
[单片机]
定时器中断是什么意思,定时器中断的工作原理
定时器中断是由单片机中的定时器溢出而申请的中断。51单片机中有两个定时器T0和T1。STM32中共有11个定时器。 一、定时器中断是什么意思 定时器中断是由单片机中的定时器溢出而申请的中断。 51单片机中有两个定时器T0和T1: (1)TF0:定时器T0溢出中断请求。当定时器TO产生溢出时,TO中断请求标志TF0置1,请求中断处理。 (2)TF1:定时器T1溢出中断请求。当定时器Tl产生溢出时,T1中断请求标志TF1置1,请求中断处理。 Stm32共有11个定时器: 1、两个高级定时器:TIM1、TIM8-------------------------APB2 2、四个通用定时器:TIM2~TIM5-------------
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved