|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机成功产生PWM波的方法 含源代码
6 S" M3 t1 Z" [# ?0 i' }/ [0 ^9 F& F# P
3 C7 q" b% @ c" T* | H- w2 a u1 B* P& _
4 b0 }9 H; F, U( D$ O2 ? X
PWM 是“脉冲宽度调制”的意思。
. Q: f. Y9 ~7 J: D! D9 KPWM 实际上是在单片机的某个引脚输出一系列的矩形波,其周期一般是固定的;而其高电平、低电平所占用的时间,是可以受控调整的。$ n$ D- F- P) {/ Q2 K
高电平与周期占用的时间之比,称为占空比,其值为0~1之间。; w8 L F) D2 p; z0 W$ o, ^# |
PWM 的应用很广,简单的说,它可以控制灯光的亮度、可以控制直流电机的转速,甚至还可以输出语音信号。8 o" b9 L1 E Y: j( ?
新型的单片机,往往都含有硬件的 PWM 模块,编写程序就很简单;而老式的MCS-51系列,就不具备这个条件。6 t l: G" G3 x* |- A
其实,在没有 PWM 硬件的单片机上实现 PWM,也并不难,只需一个定时器,令其工作在中断方式即可。
8 \5 p- i' y8 n7 U- L5 h4 V' X" `+ [) M2 i9 y9 ]: l
题目:AT89C52单片机输出可调 PWM 波。, z! L- B. s: J, y
要求:' Y- R$ A, |3 a, m. R+ r% t" ^
1。单片机的晶振是12MHz,输出周期为1s。* j6 H8 l6 h1 e" S9 j
2。用两个开关控制占空比的增加和减少,分20等级。6 Z' C7 |( E/ ?% B4 a; e
针对这个题目,做而论道设计了一个简单的实验电路:# g; w2 y" G9 C8 U/ ?7 h
在 P2 口的 8 条线输出 PWM 波形;1 X0 t! e7 W5 J: H
在 /INT1、/INT0 外接了两个按键,用来调整占空比;
# o0 i1 d, Y ^, Z! ~! I7 D 在 P0 口外接了两个 BCD 数码显示器,用来显示当前的占空比的等级。
1 T5 W1 p- S1 R9 ^: j 实验的时候,可以使用示波器来观察 P2 口输出的波形。
, o2 q: ?" P) S5 o3 m& @ 如果把 PWM 波形的频率提高,也可以用 LED 观察到渐亮渐暗的效果,目前看,只是闪烁的时间发生变化。
$ \! i5 C0 c& U# Z1 t, A* ^" q% i; C% S5 r9 z: k' I
) f+ X+ A% U& E q" d4 u3 E电路以及仿真效果如下图:* v: Q$ I3 b7 L' q- `
3 w6 U6 h# C8 S) G0 l* a# N
' S, z: F5 q. H c a0 M, y* o5 z0 @
" @ v- [* g# q! r2 g8 L! g程序如下:" Y6 L* ]2 n1 I
#include<reg52.h>( K4 j- s" t2 f# \$ `( K
unsigned int a, b;. J4 x+ t. c2 Y- _1 X
//------------------------------------------: g* I+ S! q+ e* ?/ S
void main()) I* ] d) P( Z: k5 b1 C
{# K* e$ I6 H- _/ `( w! Q
TMOD = 0x01; //T0定时方式1
8 d. l9 Q& x, [5 O, B8 N% ]6 h TH0 = (65536-50000) / 256; //50ms@12MHz- M" \, l# O/ k
TL0 = (65536-50000) % 256;
. J" H, M) }6 i$ b8 ^& R/ S' h' N* O TR0 = 1;4 u: X$ T" v$ R4 k' e1 F: t' i
$ P' ]$ g4 A" V0 h( q% T4 [3 a: `
6 o' p$ m& F$ I' Y4 q% C% N6 M
ET0 = 1;' i( d; O0 G6 x" j; V# x# ~& n! A
EX0 = 1; EX1 = 1;) ~ D J% d7 [! N
IT0 = 1; IT1 = 1;. Y- c& z1 p$ S4 V
EA = 1;
' j: q( x% w1 J( P. J0 E
% v/ |$ Q0 H! d& v; h' u; b7 J' K
- `& L( j1 a" W* Z: ? a = 0;+ h% F4 z- L9 v6 [: x* S! m
b = 10;! M/ ^7 ~; @1 n6 R9 ~
while(1);
3 a# l, i% u1 d! I! l& `}* |( u5 T; y+ ~7 a
//------------------------------------------- q! X; D8 R8 W k* m4 {# @
void time0() interrupt 1
) Z# U" q( B& m, o/ e{ h1 q! @0 {" e: B" H* y
TL0 = (65536-50000) % 256;
+ I) r; V9 {8 W! R" U) e TH0 = (65536-50000) / 256; //50ms@12MHz* w$ d/ g9 P" C) Y/ S
a++;
, ]& J5 h1 n/ [% H' }4 D" N if(a == 20) a = 0; //在这里调整周期.3 v' `( D( E% x( y+ |
if(a < b) P2 = 0xff; //在这里调整占空比.1 U! l' Y; g7 N! C) G: y
else P2 = 0x00;4 g, t+ Q: Y8 u+ s0 k/ Y
P0 = ((b / 10) << 4) + b % 10; //显示占空比等级; q" I3 ^) l5 P( ]# M. T6 U! @
}7 b$ n- J+ l. i9 q1 q
//------------------------------------------
7 G4 ?# R) R# p% i8 a$ S5 ?5 e Wvoid X0_INT() interrupt 0# ?/ Y; V0 n: o+ Y0 ~; s
{( V$ C% Y; S- ?" |7 q
b++;
$ a7 q* y$ H* P3 T if(b > 19) b = 19; //占空比等级最大为19
: p2 V: M2 V* u, D* u}% N% A/ T: i4 x9 K
//------------------------------------------
' a9 k* A) k* C" i" P' ovoid X1_INT() interrupt 2, L! o4 B% ] `1 ^& p3 u) V
3 I- g7 i& _9 S, U/ c) t* j/ k
/ _ c- A4 V2 o( x. T" A1 a9 ~
% U- H; u: V6 T2 h+ @! R" W$ n
; @9 k+ H* T: R; N2 Y+ \
…………限于本文篇幅 余下代码请从论坛下载附件…………8 s2 Y( g, u( \( I1 Q; g
5 U# C; z' |7 e- }9 ]( f8 m9 t
I+ n* r4 }2 M. {$ q. ] |
|