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

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

[复制链接]

该用户从未签到

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

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% t
7 @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

该用户从未签到

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-11-6 18:44 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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