如何用51单片机来产生PWM波

发布者:boyatang最新更新时间:2020-02-02 来源: eefocus关键字:51单片  PWM波  89C51芯片 手机看文章 扫描二维码
随时随地手机看文章

89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。


1 软件延时法

利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。

程序如下:

#include

sbit pwm=P1^0;

main()

while(1)

pwm=1;

delayus(60);//置高电平后延时60us,占空比60%

pwm=0;

delayus(40);

void delayus(uint x)

while(x--);

proteus软件仿真结果如下:

可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显。当程序除了要输出pwm波还要执行其他操作比如键盘扫描、显示等操作时,需要占用CPU一定的机器周期,这样就会影响pwm的准确度。现在很少会用到这种方法,接下来要介绍的是比较常用的方法。


2 定时器产生pwm

这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。


2.1注意事项

2.2.1中断服务程序的内容。

一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。


2.2.2定时器装入初值的问题。

装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。


2.2定时器工作方式

在定时器工作方式的选择上,可以选择定时器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定时器,这样可以获得较宽的调频范围。


2.3定时器初值的计算

设占空比为α,频率为f

产生高电平时装入定时器高8位的值应为

产生高电平时装入定时器低8位的值应为

显然,产生低电平时的公式只要把α换成(1-α)就行了。


然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。关于C51的乘除法问题,可以看以下这篇文章(点击阅读原文直接进入):

http://blog.163.com/ssou_1985/blog/static/295320362010311102232210/

修改后的公式如下:

a为100倍占空比,fr为0.01倍频率

TH0 = (65535-a*100/fr)/256;  //高位初值

TL0 = (65535-a*100/fr)%256;

同样,低电平的公式只需把a换成(100-a)即可。


2.4 例程

本例程采用定时器T0在工作方式1下产生一路PWM,用独立键盘控制频率、占空比的加减,频率可调范围100Hz-10kHz,占空比0-100%(均为理论值,实际值略低)

部分代码如下:

注:T0_H , T0_L , T1_H , T1_L 均用于暂时存储初值,进入中断服务程序后直接给寄存器TH0、TL0赋值,避免了在中断中计算。

注:flag为pwm输出标志,flag=1输出高电平,flag=0输出低电平

完整的代码请到我的网盘下载(已失效)

http://yunpan.cn/QzKaWM8VesFyc


2.5 软件仿真结果

2.5.1 频率为100Hz

a.占空比约15%

b.占空比95%

2.5.2 频率为10KHz

a.占空比15%

b.占空比90%

关键字:51单片  PWM波  89C51芯片 引用地址:如何用51单片机来产生PWM波

上一篇:单片机测量三相电网功率因数的接口电路分析
下一篇:一个X25045的C51读写程序

推荐阅读最新更新时间:2024-11-05 04:59

STM8L051单片机,外部时钟初始化
STM8L051单片机,外部时钟初始化,程序如下 void SYSCLK_Init(void) { CLK_HSEConfig(CLK_HSE_ON);//打开外部时钟 CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//配置分频系数 CLK_SYSCLKSourceSwitchCmd(ENABLE); //外部时钟使能 CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSE);//选择外部时钟 while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSE) //等待外部时钟初始化完成 { } } 大致步骤如
[单片机]
51单片机 8*8点阵贪吃蛇
在学完按键和点阵屏后,其实就可以做这个贪吃蛇了,只要理解了8*8点阵屏,贪吃蛇的显示就不成问题,理解了贪吃蛇的运作机制,做出贪吃蛇就不成问题,在网上也有很多人做出了这个程序,主要思想应该都是差不多的,我自认为我构思的思路还是很清晰的,在构思完后很快就将程序写出来了,这里我将我的思路以及代码分享给大家。 这是我的源码,不过是codeblocks+sdcc的环境编译的,无法用keil直接打开,如果要运行,进行移植一下就可以了,可以用作参考。 链接:https://pan.baidu.com/s/1xw-I-7jr_xupAGmat7nQRw 提取码:p96r 主要实现方法: 一、软件层: 1.地图:用一个8个单元数组来模拟点阵
[单片机]
利用中断结构,编制一个脉冲计数8051单片机程序
在8051单片机的INTO引脚外接脉冲信号,要求每送来一个脉冲,把30H单元值加1,若30H单元记满则进位31H单元。试利用 中断 结构,编制一个脉冲计数程序。 解: ORG 0000H AJMP MAIN ORG 0003H AJMP SUBG MAIN:MOV A,#OOH MOV 30H,A MOV 31H,A MOV SP,#70H SETB INT0 SETB EA SETB EX0 AJMP $ ORG 0200H SUBG:PUSH ACC INC 30H MOV A,30H JNZ BACK INC
[单片机]
51单片机设计的电子密码锁
该程序是基于51单片机设计的电子密码锁,功能较为简单,目前仅有修改密码和检测这一功能,以下是操作过程 运行仿真的初始界面 左边矩阵按键从左边第一行第一列起为0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 按下按键后界面如下,当四位数码管都显示后,按下矩阵键盘上任意按键确认密码 密码错误D1红灯亮起,密码正确D2绿灯亮起 当按下独立按键时,中断触发,进入密码修改,此时界面如同初始界面,输入原始密码,原始密码正确,绿灯亮起,等待输入新密码,此时界面显示原始密码。原始密码错误红灯亮起,退出修改,返回初始状态。 新密码输入会将原始密码覆盖,输入完成红绿灯同时亮起。 1s后返回初始界面,
[单片机]
<font color='red'>51</font><font color='red'>单片</font>机设计的电子密码锁
C51单片机模拟I2C总线驱动程序设计(1)
/********************************** I2C 总线驱动 ****************************** 模块名:I2C 总线驱动 型号:I2C 功能描述: 此模块包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能 很方便的与用户程序进行连接并扩展。需要注意的是,函数是采用延时方法产生 SCL 脉冲, 对高晶振频率要做一定的修改!!在写 E2PROM 的时候一定要延时!!! 说明: 1us机器周期,晶振频率要小于12MHz 返回1:则操作成功,返回0:则操作失败。 sla为器件从地址,suba为器件子地址。 ********
[单片机]
MCS-51单片机P0端口的结构及工作原理
P0 端口 8 位中的一位结构图见下图: 图片1 由上图可见, P0 端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边,标号为 P0.X 引脚的图标,也就是说 P0.X 引脚可以是 P0.0 到 P0.7 的任何一位,即在 P0 口有 8    P0端口8位中的一位结构图见下图: XMLNAMESPACE PREFIX = O / XMLNAMESPACE PREFIX = V / 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何
[单片机]
MCS-<font color='red'>51</font><font color='red'>单片</font>机P0端口的结构及工作原理
51单片机8*8点阵LED的显示原理及程序设计
在8X8点阵LED上显示柱形,让其先从左往右平滑移动三次,其次从右往左平滑移动三次,再次从上往下平滑移动三次,最后从下往上平滑移动三次,如此循环。 1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。 一根横柱:对应的行置0,而列则采用扫描的方法来实现。 2. 硬件电路 3.汇编源程
[单片机]
<font color='red'>51</font><font color='red'>单片</font>机8*8点阵LED的显示原理及程序设计
C8051F35X单片机内部Flash存储器的擦写方法
C805lF35X是Cygnal公司推出的混合信号片上系统型单片机MCU,采用CIP-5l内核可大大提升指令运行速度,另外该器件内部还具有一个完整而先进的时钟系统和片内调试电路,其内置的Flash代替ROM和EPROM,不仅为用户的存储提供方便,还大大简化电路。这里给出使用C80-5lF35X单片机内部Flash存储器的擦除、写入和读取操作方法。 1 存储器结构 C805lF35X单片机内部含有2个独立的存储器:程序存储器和数据存储器。程序存储器中包含8 KB可在系统编程的Flash存储器。C8051-F35X通过设置程序存储写允许位(PSCTL.0)采用MOVX指令对程序存储器写入。如图l所示。 这8 KB的F
[单片机]
C80<font color='red'>51</font>F35X<font color='red'>单片</font>机内部Flash存储器的擦写方法
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved