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

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

[复制链接]

该用户从未签到

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

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. ]

该用户从未签到

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-8-18 18:15 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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