|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机成功产生PWM波的方法 含源代码
+ X0 J: R4 k6 f5 O1 {' j4 y
- p [( W+ C( O% w9 _% W! {' t7 k0 W" K. @& U
$ a, O: |+ i. Z9 v9 A9 W
, g+ w7 c5 Q. @- M* x+ }' }% xPWM 是“脉冲宽度调制”的意思。: [" L: M, K& h4 S0 i2 h3 [1 c
PWM 实际上是在单片机的某个引脚输出一系列的矩形波,其周期一般是固定的;而其高电平、低电平所占用的时间,是可以受控调整的。
, {& u$ H5 }+ G0 M* o M' {高电平与周期占用的时间之比,称为占空比,其值为0~1之间。
J( o* E4 V$ B' D4 d8 mPWM 的应用很广,简单的说,它可以控制灯光的亮度、可以控制直流电机的转速,甚至还可以输出语音信号。) Y, L; O3 Y$ p+ h9 b, ~; `
新型的单片机,往往都含有硬件的 PWM 模块,编写程序就很简单;而老式的MCS-51系列,就不具备这个条件。, Q: o) A% _' |
其实,在没有 PWM 硬件的单片机上实现 PWM,也并不难,只需一个定时器,令其工作在中断方式即可。
+ d/ r R: u. o; H* v4 ^) a! Q0 `: H! E( I2 j2 r6 S
题目:AT89C52单片机输出可调 PWM 波。
$ M( {. g% l1 U, [要求:
0 ^; |$ J, \$ D1。单片机的晶振是12MHz,输出周期为1s。
4 U8 l0 K4 O1 `2 k" |9 u, h) `/ t2。用两个开关控制占空比的增加和减少,分20等级。
k0 U, [8 A5 t. e! g. T3 i3 [& a) ^针对这个题目,做而论道设计了一个简单的实验电路:
( X) {, O- J9 o! G* O, q, ~: e% i 在 P2 口的 8 条线输出 PWM 波形;) D' Z: X+ b5 \! _
在 /INT1、/INT0 外接了两个按键,用来调整占空比;
) x5 m5 X8 X2 C* `" v0 Q" G 在 P0 口外接了两个 BCD 数码显示器,用来显示当前的占空比的等级。
2 I1 H1 S6 r) E# r: N* p 实验的时候,可以使用示波器来观察 P2 口输出的波形。3 Q3 `* c0 \% d9 K0 S; E
如果把 PWM 波形的频率提高,也可以用 LED 观察到渐亮渐暗的效果,目前看,只是闪烁的时间发生变化。
: f" F& Y7 P$ p: V) C4 Q
, [) s* y1 r$ m- W7 [5 w; \
9 m5 Y8 d( Y. \* p电路以及仿真效果如下图:
6 c) P) Q' Q" g* g/ ], ?, A
% m& |% |$ v0 A# I) u7 \1 x
|2 H1 l" } F: a) M3 V A
$ Y, s8 C/ E& }7 S& d8 S程序如下:
4 T; f1 t6 W- Q% P1 H#include<reg52.h>- M* X! j5 h0 O* @2 m) |1 _
unsigned int a, b;
3 ], @; w' f% |0 @( e! E" e//------------------------------------------- v) |' ]+ t, z4 a' a- ]# x
void main(), J1 s" i3 |5 L$ J. g
{5 [, c; [3 g/ ?
TMOD = 0x01; //T0定时方式1
3 m; L% Y% U4 f0 K1 @: Y; t/ R TH0 = (65536-50000) / 256; //50ms@12MHz5 r+ J4 ]9 x9 s
TL0 = (65536-50000) % 256;
. y8 [% d* N0 O8 i j TR0 = 1; ~1 V8 N* [, v2 m# @/ \
0 H4 U/ n8 U r, ]
, N) w0 J: N5 E ET0 = 1;0 K5 f; A; X% D4 E1 D! u& p
EX0 = 1; EX1 = 1;
+ |( I9 {( D! f! q8 x IT0 = 1; IT1 = 1;1 M7 n) ~: w: z' E1 Y
EA = 1;$ F( f8 d) Q2 `$ n2 {
. @) @4 R4 V6 V O- G
( O& e8 r, H6 w+ m7 Y a = 0;
3 i# x N" ]! G/ V( e* t# V/ T( C b = 10;+ T& s" b8 Q5 b0 P- d4 y: @) Q
while(1);6 S: L. f* h* }+ x7 Q" B
}
6 j) G7 ]$ }- @) \//------------------------------------------' s: X. C# ]% l7 t
void time0() interrupt 1* d! P& F) }( w. @
{- s4 k& j4 L0 v5 T
TL0 = (65536-50000) % 256;
/ Y7 [6 O3 {, x* R$ Y1 w) ~7 f TH0 = (65536-50000) / 256; //50ms@12MHz2 v' w3 p2 N# f |
a++;9 ?7 J) |5 S6 t: K: G7 ~3 O! y
if(a == 20) a = 0; //在这里调整周期.! e- s u* y- g( {# R/ g
if(a < b) P2 = 0xff; //在这里调整占空比., X t9 W# ~( @+ z0 Q& ?
else P2 = 0x00;
+ g8 ]- @: o: L8 O P0 = ((b / 10) << 4) + b % 10; //显示占空比等级
% K0 M) I7 |) e0 |( I: Y}
2 H' I1 O" K/ D4 T3 {' k7 ]6 m//------------------------------------------7 G# |$ Z% S$ _1 `
void X0_INT() interrupt 05 i% g5 f$ B8 `, V+ M
{
6 e- K" O. z7 [" U b++;
9 ]- l( U$ r, O" n @! W' V if(b > 19) b = 19; //占空比等级最大为19: `5 f; M2 d! q8 R- S
}4 l, h* m6 e d i6 G# d& d: M
//------------------------------------------% Y- @+ l, C1 r1 x$ e7 ]( s
void X1_INT() interrupt 26 y# s0 X) S( v2 o6 S8 w
- ? t% W. t( m2 e% t7 @6 t( u' ~$ g% d
# h- d8 x, O& O( O3 p. y. ^
6 e3 B: ]5 V x }1 C…………限于本文篇幅 余下代码请从论坛下载附件…………
) B; i8 y/ q$ c
2 O$ V& |/ Y. a# n% x5 f d. U- W" A; R
|
|