|
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 k8 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 |
|