找回密码
 注册
关于网站域名变更的通知
查看: 294|回复: 3
打印 上一主题 下一主题

51单片机成功产生PWM波的方法 含源代码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-8 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
51单片机成功产生PWM波的方法 含源代码
' G7 v; T( a8 \  E/ j% x7 }6 f% }/ [- M) E/ |6 p. i

7 Y1 [. f! p3 _; J5 |& N& `0 P( b- @4 J/ J- A4 c  w

$ o% E) ?7 g3 @3 APWM 是“脉冲宽度调制”的意思。
& d0 C" a" o/ ^+ q# Y, PPWM 实际上是在单片机的某个引脚输出一系列的矩形波,其周期一般是固定的;而其高电平、低电平所占用的时间,是可以受控调整的。
# U6 d0 O* M0 h4 Q# E高电平与周期占用的时间之比,称为占空比,其值为0~1之间。
; D1 z, C3 f) Y3 F( o+ NPWM 的应用很广,简单的说,它可以控制灯光的亮度、可以控制直流电机的转速,甚至还可以输出语音信号。6 w, N/ `# X7 C) h/ c0 d3 l
新型的单片机,往往都含有硬件的 PWM 模块,编写程序就很简单;而老式的MCS-51系列,就不具备这个条件。
5 P9 q7 |5 U2 U* w其实,在没有 PWM 硬件的单片机上实现 PWM,也并不难,只需一个定时器,令其工作在中断方式即可。
2 V4 ^4 y; H+ O& S) w: H4 C
: k9 ?# Q% P! m4 ~% h题目:AT89C52单片机输出可调 PWM 波。
. x: i3 @/ Q5 l* f/ ?* H) n! F' a要求:/ W& F6 Y% C0 D% R8 V3 @1 o3 v
1。单片机的晶振是12MHz,输出周期为1s。
% p( ?3 R. [2 ]+ x, y) D8 `2。用两个开关控制占空比的增加和减少,分20等级。1 D+ g3 B" k0 g1 ]' h$ L& \% q
针对这个题目,做而论道设计了一个简单的实验电路:
5 Y2 `2 U) U" g4 q' }' O1 s 在 P2 口的 8 条线输出 PWM 波形;! O; i$ y! _8 V: A4 d) E! H5 n
 在 /INT1、/INT0 外接了两个按键,用来调整占空比;
. x4 v! b" e3 w 在 P0 口外接了两个 BCD 数码显示器,用来显示当前的占空比的等级。! V+ r2 X' d: d9 y2 m; a4 _- D- j
 实验的时候,可以使用示波器来观察 P2 口输出的波形。
6 g/ f; E! v, o/ \4 @ 如果把 PWM 波形的频率提高,也可以用 LED 观察到渐亮渐暗的效果,目前看,只是闪烁的时间发生变化。# O/ M/ t$ @. ?; C: a
/ [: f1 a* l* y2 G5 X- E( ?7 a

0 ?! O& h# t# s  A6 m电路以及仿真效果如下图:

3 i( O+ B" U  i+ k, y + O% G  E: O) q1 y' _7 ^0 |
# {, r9 |- l: U6 c8 l

) c  L# _. m8 _- R程序如下:

. A% D  A/ {% M/ w1 ~$ O#include<reg52.h>
. ~& Y& ^' j9 x* [  ]3 ]; eunsigned int a, b;: |% j' H$ s+ ?+ K2 ~) s3 C1 r
//------------------------------------------: b* U: O$ b: t" k, @# b
void main()
1 Z$ [$ E! E) Y( N. K{) a. D! Z; v( v! x
         TMOD = 0x01;                 //T0定时方式1& t( Q! f& R: J  ]- C# A, |' J
         TH0 = (65536-50000) / 256;   //50ms@12MHz
; g( r- q$ O; d) A1 ~. B- \/ [  R         TL0 = (65536-50000) % 256;8 P2 c- G- Q& p/ K* Z4 ^" D5 ]
         TR0 = 1;  u( ^) i3 t6 N6 w# S6 _
$ L9 H. _4 O: @
' [6 t! w% I5 d. I  n' z
         ET0 = 1;
( ?$ n+ J; Y+ R         EX0 = 1; EX1 = 1;
6 H5 Z7 ^1 ]! L$ }         IT0 = 1; IT1 = 1;: j# q4 F/ r* P# q
         EA = 1;* \. k7 ]9 q) W5 l4 a; i

, P# x$ O# [, z4 e+ L

) b, F8 k5 f9 `3 B  e* z         a = 0;; Q, K& N& J8 _
         b = 10;
. C, o$ z' j0 I3 s4 p4 z9 P         while(1);0 t) I+ W; r1 J/ c7 e
}
5 D- e# i! g( B, f: B. I# }//------------------------------------------/ ~2 K4 G4 P6 }" I" a  X
void time0() interrupt 1  q8 N0 C5 I$ g" Y& C% I
{7 d7 {/ B+ V2 g. b; n" E5 O* C
         TL0 = (65536-50000) % 256;, n8 G, v% n0 `; i, S3 z
         TH0 = (65536-50000) / 256;   //50ms@12MHz
3 n) b+ [" X5 ~; T1 S" j         a++;$ Y7 l9 I. f2 F4 o  n. ~3 T
         if(a == 20) a = 0;           //在这里调整周期.
/ l7 u/ }+ G) w! P! k/ ~4 v) V         if(a < b) P2 = 0xff;        //在这里调整占空比.$ P- k& P1 q  \% [& i
         else   P2 = 0x00;
  t, D% x1 d/ G* Y4 a9 N( O. X, p, D         P0 = ((b / 10) << 4) + b % 10; //显示占空比等级
2 w9 Z2 i6 Y" E" I4 G# L}
- Y7 q5 O' H: Z//------------------------------------------5 B0 A, s8 O% O
void X0_INT() interrupt 0
/ B6 z0 p) \' f* J! l{
5 H4 G+ b0 T& J6 K5 H7 d7 m         b++;
3 |3 p4 d, P+ P1 F6 R! J* C         if(b > 19) b = 19;           //占空比等级最大为19& @7 f/ N0 F3 V% D% {
}
9 G: I' _% j  l- C' z//------------------------------------------# M, A) l# v, D
void X1_INT() interrupt 2
5 h+ [  g8 I6 v5 E4 V" F) \, \
, W- w7 X4 K1 o

* o0 y- A3 _8 Y- l
; W: ^/ B7 N( K5 k
8 z  |" y$ L4 i! t3 |  X
…………限于本文篇幅 余下代码请从论坛下载附件…………' P7 j) k8 x6 [. X4 j5 l
游客,如果您要查看本帖隐藏内容请回复

1 Z6 z6 A$ n, d) c) Y

7 m# E. G4 Z% ~) B7 l  i3 K

该用户从未签到

2#
发表于 2019-1-8 16:04 | 只看该作者
看看楼主的代码

该用户从未签到

3#
发表于 2019-2-1 17:49 | 只看该作者
这个不错,谢谢楼主分享

该用户从未签到

4#
发表于 2019-2-12 14:42 | 只看该作者
看看楼主的代码,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 11:12 , Processed in 0.171875 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表