|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机定时产生pwm波程序
8 [ N) E% o0 j2 {: k3 L f5 ^: @( Z4 g; L9 z
PWM(脉宽调制)在很多场合都用得上,例如LED亮度控制,开关电源输出电圧控制等。& U8 b+ ~5 X8 G9 P% o
这里采用简单的定时器实现PWM波输出,通过更改定时器定时参数,控制IO口输出
' E( a7 u8 O! X( L波形高低电平持续时间,实现PWM波。7 V2 Y* u/ C# W$ I2 x" x% r
7 m7 Q/ U, {0 O) x; E
代码如下:
: J) t- E% e# z" t" r#include<reg52.h>) w+ M+ l. T' M9 {5 x
* S% B: ~: m' Z3 x- w
#define T0_INTERRUPT 1 //T0中断向量号" F+ X/ ]1 ]$ j9 ]* U( }
#define PWMH_L 0x9C, }$ ^# d' a g' F" ]2 Z$ u/ G/ W
#define PWMH_H 0xFF //PWM低电平时间0.1ms
7 h, h8 x2 X/ D4 X; M' j
5 {/ {# U& Z6 B: Q#define PWML_L 0xCE
& s! r; x& Z8 ?9 S" H; g#define PWML_H 0xFF //PWM高电平时间0.05ms
- G* m7 X. H2 m. ?; N4 ?! c% f7 O7 B0 a
sbit LED1 = P1^0; //常亮LED,作为对比,仿真看不出效果
% E/ w8 Q# l3 B2 Y& W: Lsbit LED2 = P1^1; //PWM驱动LED2 _% |3 Z% Y: U/ D+ ^$ K( ` j
0 W% K* C! h/ L7 f, g
) G7 }4 Y* i7 M# k. o+ i
4 m) H5 P9 [2 S( N6 W4 Ctypedef unsigned char uchar;
* n/ e" p: W* B8 s' C* g; _typedef unsigned int uint;8 [, G/ p9 u, s' T
L) b# u5 ^' ^void Init_T0();0 V- H8 |1 l$ x- | T( C
0 G, u' `- T Lvoid main()
/ ?/ u% O0 V7 {8 B: Q4 |{
6 f: D2 b% z h: E3 @. c LED1 = 0; //点亮LED13 }) Z0 C9 c% u) O2 h
LED2 = 1; //熄灭LED22 h% Y3 H6 _" s+ Y1 c3 I2 c
Init_T0(); //初始化定时器0; f% J* f5 W, X1 i* K
while(1)& Q1 o* s! o. {1 c- ]
{
" f3 \ f7 i( o% |2 m% b0 G PCON |= 0x01; //单片机进入休眠模式,节省功耗. c% z1 k( w7 e: f w% y& o+ i
}# _. P! D1 z8 E+ @, A2 `" V$ k* Z
}" M- {. n) g1 y& N: F
9 D1 e3 |' d( ?/ M* ?
void Init_T0()
* l! W+ p, N; U: }6 r% \3 a7 L{2 o9 O; y# P" W# H. p
TMOD &= 0xF0;
" I. a, l+ b8 i, w; i5 R TMOD |= 0x01; //16位定时器模式+ h3 T0 C) e/ j! q+ A' R3 y; |
% Q, o, C6 V4 k! F
TH0 = PWML_H;
8 X8 t2 V/ @/ c0 u TL0 = PWML_L;$ }" W0 I% E. B6 p
) h( |9 B! F8 H9 Q+ c. Q5 g% g EA = 1; //开全局中断, T, A- l8 a+ _& B8 W2 t- ?
ET0 = 1; //允许T0中断* s" M) d7 D3 E4 q8 ?
TR0 = 1; //启动定时器
2 J6 @/ k' E, e- W$ z$ n}
# @5 M+ m9 q4 i! a+ G! x0 S& h' u+ C
void T0_Interrupt() interrupt T0_INTERRUPT- f% V6 n) W# f8 v$ Z8 F0 h
{& V+ Z. F% p6 m1 Y; \# _- Z( H
TF0 = 0;
% S" C5 H: C8 ]1 f1 a- y if(LED2 == 1)8 x' c3 \/ L+ t0 e* u
{
4 z" B8 P$ f8 M I LED2 = 0; //设置低电平持续时间,LED2亮, V" `5 k' D" N0 N# d6 t8 o, i+ C
TH0 = PWMH_H;9 {* q2 ]) E k. ~ m
TL0 = PWMH_L;0 ~8 Z1 e" f6 Z4 ]6 @7 q
}
1 @% G# c r% S& n3 b4 k else
- I6 y# W* [0 D* U5 O, b {
5 @0 I5 [# E( Z; [; T* L LED2 = 1; //设置高电平持续时间,LED2灭 7 z, x3 S' D# I; }, H. l% h. \
TH0 = PWML_H;
; B T/ n8 T3 I7 T0 G$ _7 s0 u TL0 = PWML_L;
' k; h+ e% ^ k% {! d }
$ ~3 X' g4 ?# J6 E; c) K}
3 r. j2 ~$ |% J3 M( S$ r+ @! C: F8 |& |
|
|