标题: 51单片机成功产生PWM波的方法 含源代码 [打印本页]

作者: 51hei学习技术中    时间: 2017-4-4 03:58
标题: 51单片机成功产生PWM波的方法 含源代码
PWM 是“脉冲宽度调制”的意思。
PWM 实际上是在单片机的某个引脚输出一系列的矩形波,其周期一般是固定的;而其高电平、低电平所占用的时间,是可以受控调整的。
高电平与周期占用的时间之比,称为占空比,其值为0~1之间。
PWM 的应用很广,简单的说,它可以控制灯光的亮度、可以控制直流电机的转速,甚至还可以输出语音信号。
新型的单片机,往往都含有硬件的 PWM 模块,编写程序就很简单;而老式的MCS-51系列,就不具备这个条件。
其实,在没有 PWM 硬件的单片机上实现 PWM,也并不难,只需一个定时器,令其工作在中断方式即可。

题目:AT89C52单片机输出可调 PWM 波。
要求:
1。单片机的晶振是12MHz,输出周期为1s。
2。用两个开关控制占空比的增加和减少,分20等级。
针对这个题目,做而论道设计了一个简单的实验电路:
 在 P2 口的 8 条线输出 PWM 波形;
 在 /INT1、/INT0 外接了两个按键,用来调整占空比;
 在 P0 口外接了两个 BCD 数码显示器,用来显示当前的占空比的等级。
 实验的时候,可以使用示波器来观察 P2 口输出的波形。
 如果把 PWM 波形的频率提高,也可以用 LED 观察到渐亮渐暗的效果,目前看,只是闪烁的时间发生变化。

电路以及仿真效果如下图:



//程序如下:
  1.     #include<reg52.h>
  2.     unsigned int a, b;
  3.     //------------------------------------------
  4.     void main()
  5.     {
  6.              TMOD = 0x01;                 //T0定时方式1
  7.              TH0 = (65536-50000) / 256;   //50ms@12MHz
  8.              TL0 = (65536-50000) % 256;
  9.              TR0 = 1;

  10.              ET0 = 1;
  11.              EX0 = 1; EX1 = 1;
  12.              IT0 = 1; IT1 = 1;
  13.              EA = 1;

  14.              a = 0;
  15.              b = 10;
  16.              while(1);
  17.     }
  18.     //------------------------------------------
  19.     void time0() interrupt 1
  20.     {
  21.              TL0 = (65536-50000) % 256;
  22.              TH0 = (65536-50000) / 256;   //50ms@12MHz
  23.              a++;
  24.              if(a == 20) a = 0;           //在这里调整周期.
  25.              if(a < b) P2 = 0xff;        //在这里调整占空比.
  26.              else   P2 = 0x00;
  27.              P0 = ((b / 10) << 4) + b % 10; //显示占空比等级
  28.     }
  29.     //------------------------------------------
  30.     void X0_INT() interrupt 0
  31.     {
  32.              b++;
  33.              if(b > 19) b = 19;           //占空比等级最大为19
  34.     }
  35.     //------------------------------------------
  36.     void X1_INT() interrupt 2
  37.     {
  38.              b--;
  39.              if(b < 1) b = 1;             //占空比等级最小为1.
  40.     }
复制代码

以上代码下载:
代码.rar (516 Bytes, 下载次数: 401)



作者: 925302604    时间: 2017-4-4 11:03
看了帖子有点启发,感谢分享
作者: 浅忆,汐辰!    时间: 2017-9-27 14:19
能不能把所有的代码发给我看看
作者: buck198    时间: 2018-1-24 19:12
第一次,多谢啦
作者: buck198    时间: 2018-1-24 20:43
哥,代码不全啊,附件
作者: Toda    时间: 2018-3-9 10:39
附件的代码不全啊

作者: December    时间: 2018-3-28 15:15
感谢楼主
作者: December    时间: 2018-4-3 16:56
请问为什么我生成的方波是斜的?


作者: hellopp2008    时间: 2018-6-12 13:30
不错学习了呀
作者: 萌木头    时间: 2018-7-2 10:56
这b太黑了就差两行
作者: mhxbyl    时间: 2018-7-6 19:28
楼主请问怎么把占空比的值显示在液晶屏内
作者: mhxbyl    时间: 2018-7-6 21:28
萌木头 发表于 2018-7-2 10:56
这b太黑了就差两行

就差一黑币,难受
作者: mhxbyl    时间: 2018-7-6 22:46
楼主,占空比等级怎么显示到1602里?求教。。
作者: mhxbyl    时间: 2018-7-8 15:28
若改成lcd显示欲望比什么
作者: 赵逗逗    时间: 2018-10-31 09:33
看了帖子有点启发,感谢分享
作者: 套你猴子    时间: 2018-12-5 09:02
stc89c51
作者: Marlboro    时间: 2019-1-22 00:15
你好,在仿真电机在最大的占空时的速度看起来有点慢,怎样可以调快点

作者: Duo2048    时间: 2019-4-15 22:16
看看看看,嘿嘿  不错哦
作者: 懒惰的家伙    时间: 2019-7-8 19:23
请问接lcd又该如何接呢

作者: baggio84    时间: 2019-7-19 11:37
学习大神
作者: 249449417@qq.co    时间: 2019-7-19 14:22
代码不全,没看就损失几个币
作者: zhxc531    时间: 2019-7-19 22:54
我用STC15的硬件PWM可以做到带加减速缓冲带动2DM556的驱动2000的细分空转工作在1000RPM,快还是慢啊?
作者: 职业业余玩家    时间: 2020-11-22 14:19
感谢楼主,很有启发
作者: 了解@    时间: 2020-12-11 13:26
就这水平,坑我5黑币,就一个框架,还不如自己写的
作者: 夏一    时间: 2020-12-11 19:10
mhxbyl 发表于 2018-7-6 21:28
就差一黑币,难受

有币也是白给的程序包里啥都没有
作者: 夏一    时间: 2020-12-11 19:13
能退币吗!最后5个币给他收走了
作者: 15802426785    时间: 2020-12-11 22:06
液晶屏显示怎么做的啊
作者: gxslxxm    时间: 2020-12-12 08:55
额 想法是好的。这种事情我也做过,但是后边很少做这种事情,原因下边解释。
凡是利用定时器io口翻转的方式实现了PWM,频率越高,频繁的中断会占用alu。
如果框架搭的不好,可能会有一定的影响。真的除非是你真的只用单片机实现一个功能。
想法有两种。
1。短时间的定时器,中断时间是 100us,甚至更短,中断一个周期计数,一个占空比计数。
2。调整中断时间,也就是定时器,code主体中,调整进入中断的时间。
无论是怎么样,只要是用定时器中断做的pwm。理解之后code怎么实现是看个人的编程习惯,但是本质是一样的东西。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1