|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机成功产生PWM波的方法 含源代码
; a' b& P+ w' Y
7 h* O, n# n" L, V+ r) y9 i. H
, K2 C8 p5 |/ K* B& T& c
, p" J! D5 I- C/ O* z! ?
|4 Q' O$ _' y" g# T& }3 JPWM 是“脉冲宽度调制”的意思。1 q0 V' P' C. D+ g4 Y) ~: N$ ^5 g$ s
PWM 实际上是在单片机的某个引脚输出一系列的矩形波,其周期一般是固定的;而其高电平、低电平所占用的时间,是可以受控调整的。
1 W# _% K5 M( k) d- P/ h高电平与周期占用的时间之比,称为占空比,其值为0~1之间。* d2 D: M" Q* u: S J* P; i2 c7 L/ R. L
PWM 的应用很广,简单的说,它可以控制灯光的亮度、可以控制直流电机的转速,甚至还可以输出语音信号。' G" p( r' ~3 D
新型的单片机,往往都含有硬件的 PWM 模块,编写程序就很简单;而老式的MCS-51系列,就不具备这个条件。$ U, j- c7 ~& u; g$ K0 Y
其实,在没有 PWM 硬件的单片机上实现 PWM,也并不难,只需一个定时器,令其工作在中断方式即可。
" ?& e/ E! p( Y2 C) k7 U1 A
" U1 Q. i4 e" a8 {1 _" L题目:AT89C52单片机输出可调 PWM 波。
9 [! @! \2 @6 y6 {要求:2 f; P. A# O* ]4 d9 i) c* i$ R
1。单片机的晶振是12MHz,输出周期为1s。9 B2 |8 ?- q) n6 H U) l$ e! X2 v
2。用两个开关控制占空比的增加和减少,分20等级。) a5 w- }5 S' s' Q* G2 d
针对这个题目,做而论道设计了一个简单的实验电路:! J, g8 e" O2 B {, Y
在 P2 口的 8 条线输出 PWM 波形;7 G/ C0 j1 @7 f8 ~
在 /INT1、/INT0 外接了两个按键,用来调整占空比;
1 {7 N. e- V4 ?/ r 在 P0 口外接了两个 BCD 数码显示器,用来显示当前的占空比的等级。8 a: A8 E4 X+ @6 Y7 ~ k
实验的时候,可以使用示波器来观察 P2 口输出的波形。
+ Q/ F6 d( t! A( J3 l# F9 k 如果把 PWM 波形的频率提高,也可以用 LED 观察到渐亮渐暗的效果,目前看,只是闪烁的时间发生变化。" N4 i8 L n7 U0 h" ^
3 Z3 N, |- n$ q" L
9 q. z R" l/ u Z: X$ x电路以及仿真效果如下图:5 v, ]( a& q d: P7 ]. H
# \0 T. n8 K1 J " j. J/ s& H7 i T& S6 G! D
. k. W* m% W# c" f4 x- P, A2 [5 J
程序如下:
9 {# r5 N1 Z7 Q#include<reg52.h>8 M# ?0 H# q6 K4 d' g- S" [
unsigned int a, b;6 y9 |4 b* H0 X7 j$ A% m8 z" B; j* E
//------------------------------------------) I% y. J' ^, N5 Y! I
void main() c& S4 P% V) J' ] J3 ]
{
! d4 w7 H7 n' I, F5 W! Z TMOD = 0x01; //T0定时方式1* W6 {2 |1 M1 b/ R1 m0 B
TH0 = (65536-50000) / 256; //50ms@12MHz7 p, `, B3 O1 @' v# W4 W( K
TL0 = (65536-50000) % 256;
6 u6 k, {/ n* Q$ z# F$ I8 ^2 W TR0 = 1;( }# u* h, ^2 [; O
$ \" `: I1 D& Y* e2 z/ b) l
9 o3 ^) W6 ]" O
ET0 = 1; z) Y# n8 B5 J4 j7 F+ o( |
EX0 = 1; EX1 = 1;( b; O. u: p$ H3 Z
IT0 = 1; IT1 = 1;
4 E+ c! w8 J0 g2 z* @, n3 E EA = 1;5 a6 d9 Y: @& G9 w% ?3 B# r1 s3 ?) z
5 Z3 E3 l, r: B; S" X5 v4 M: ?
$ T9 s; z$ W5 u# M% z3 [$ f0 _
a = 0;- R+ k+ Z% F% @0 j f* ?
b = 10;1 ~4 s. k0 \; k# g$ |
while(1);2 X/ I! E- B' h* N( O4 u( z4 e
}, H3 C4 P* r5 q ]
//------------------------------------------
) Q7 u& i8 N. X, Y. d1 vvoid time0() interrupt 1! d+ ~) u% b0 G/ H
{, y. m) J& z3 f; T& O
TL0 = (65536-50000) % 256;
( m4 d1 x, U S9 D- I- y' t+ s TH0 = (65536-50000) / 256; //50ms@12MHz
" A/ d" M9 x8 N a++;
3 D3 T) n# d' v' d% A6 ]: T if(a == 20) a = 0; //在这里调整周期.: }) E9 m) z8 M. \
if(a < b) P2 = 0xff; //在这里调整占空比.* _' T. G) G2 ]9 _
else P2 = 0x00;
& t: Z; e+ X4 ~: _; Z P0 = ((b / 10) << 4) + b % 10; //显示占空比等级5 o1 l7 k6 _; x% d, p
}
, ]! e1 y2 k/ `$ L$ b$ F( v+ w//------------------------------------------
5 J4 M- ? m, A0 E& gvoid X0_INT() interrupt 01 |) ~7 v: J' P; k. X! ~
{
) T! |7 K$ ? T% i b++;0 L! P7 u! [1 \0 w
if(b > 19) b = 19; //占空比等级最大为19' R8 v: t- b/ N7 b5 U( ~
}
" D/ o; a+ H" z! ^7 a* ?/ L& w//------------------------------------------4 A& z5 p/ t' [8 l! d2 k& L
void X1_INT() interrupt 2% H N, Z+ }. Y# p, f7 f" Q5 f
5 T% N; H% l' y* o
& O' C0 L$ a, J# u/ }
. k7 \4 o: K9 w% d* l' C' x! O4 e4 ]' W* K1 C# l) i8 q, v
…………限于本文篇幅 余下代码请从论坛下载附件…………
* Y/ R/ Y" `5 ~1 T' ~$ k/ T, P+ c7 _9 Y; q! }
$ e" C7 F ^0 J, Z K3 w
|
|