|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机定时产生pwm波程序
3 t- K: `4 K: B8 L& o& @& A, [
! n, |9 G) }( DPWM(脉宽调制)在很多场合都用得上,例如LED亮度控制,开关电源输出电圧控制等。" }9 w/ Y Z! \" {
这里采用简单的定时器实现PWM波输出,通过更改定时器定时参数,控制IO口输出! w6 q! ?/ n7 o0 c
波形高低电平持续时间,实现PWM波。
; K$ B& n* k6 i: X( K+ o0 E
5 D* n4 [. r; @+ O, m i代码如下:
. M+ e, @; c! S#include<reg52.h>
# V2 V7 G; R0 t1 O6 [1 o0 N3 F1 ]7 h
#define T0_INTERRUPT 1 //T0中断向量号0 o4 I3 _8 h+ {- A% e1 _& r, D
#define PWMH_L 0x9C4 J c$ G! W: |: D9 x
#define PWMH_H 0xFF //PWM低电平时间0.1ms5 w1 \$ J1 ~( p, T
5 ` L Y2 x/ G) [5 B* p7 d: P#define PWML_L 0xCE
3 T. W, A; T" w8 l+ Y#define PWML_H 0xFF //PWM高电平时间0.05ms
- g( ~9 s3 ^$ y8 w; W/ u( X y$ e% H8 d3 g) w5 D
sbit LED1 = P1^0; //常亮LED,作为对比,仿真看不出效果
" f4 c% U7 n& b2 f2 u1 @! asbit LED2 = P1^1; //PWM驱动LED
/ {% ^( c4 s. d- I. D
1 p( i' n, ]5 K0 A D4 O( _5 m3 a; W4 ~% D- R9 ^0 I
) B2 h; w9 `) D; j' \2 [
typedef unsigned char uchar;) W0 N* J/ d2 U3 C" z
typedef unsigned int uint;
5 h8 _" L7 {( C, l' `: |! t7 k8 |3 d. A& _/ ?
void Init_T0();' z) T. U# F+ B7 I. O, J) G$ E9 V
/ Y8 k& V! R7 q7 q, s: Hvoid main()
7 p/ }4 Y! h, g; ?6 _{8 N: `2 I' s4 H7 `4 B
LED1 = 0; //点亮LED1* x( A) ?$ |' @4 u8 P
LED2 = 1; //熄灭LED23 ?* c% k0 s! x
Init_T0(); //初始化定时器06 S6 g3 Y" i) E0 W9 D, P
while(1)# i; G/ J0 i0 r+ T! o4 h/ ]2 ]8 O( L
{
; \# T! C3 _" \% k: u+ m: e PCON |= 0x01; //单片机进入休眠模式,节省功耗
/ A6 h! O1 B. W1 O2 \ }8 O' T2 ^# t9 b, E P u& a( E
}& m; u* V2 ^7 F9 P( d5 `- h
( f. e. i2 Q- hvoid Init_T0()" ^+ {; G/ h" J3 X8 s) N
{
% Y$ `% q# R8 E TMOD &= 0xF0;
0 F% X7 r$ A0 }6 \ l4 A+ d' d$ w2 w TMOD |= 0x01; //16位定时器模式
5 K- \' B% C* A+ r, b0 E" a+ m* s0 Y4 K) @5 q. I/ p9 s
TH0 = PWML_H;, b. g5 j2 e/ @
TL0 = PWML_L;
9 {! b4 u; X$ T u% S* f6 w% j
6 o# x* Z3 r$ I) q$ B0 k& X EA = 1; //开全局中断7 Y6 r& c7 h2 B- v4 N0 F
ET0 = 1; //允许T0中断5 h3 m7 E: I: s+ Y9 g3 u
TR0 = 1; //启动定时器
$ z: h0 c' @9 P" V+ v. A}
' N4 k- K( C! J9 h3 l
% W6 B! D1 u" F4 P8 w' o% _' }void T0_Interrupt() interrupt T0_INTERRUPT
U8 r1 L: {! c/ T: p* W4 A+ M{
6 u9 A: G5 ^. }% P% [( { W8 F TF0 = 0;) _# h2 t( b$ E# L$ p6 o
if(LED2 == 1)$ P5 z/ X' S3 w' U9 ~/ S& B
{$ P! s- A6 e- ? h: @
LED2 = 0; //设置低电平持续时间,LED2亮6 f0 C0 w" | W W
TH0 = PWMH_H;/ u3 S7 T" {* L, M9 g) W+ T6 _* J
TL0 = PWMH_L;3 u7 u3 \1 v/ d- E/ s% J! a0 V
}8 F! G* w- g, t* A% y3 M& D4 i
else, s# j6 P; l* K# Z+ f# \' ~
{5 u3 C" R' I' i
LED2 = 1; //设置高电平持续时间,LED2灭 * n+ d5 f4 l4 y. d
TH0 = PWML_H;* a( O6 G! ]1 j, l0 T; O
TL0 = PWML_L;- [5 |/ A7 l' @& V/ u% L
}# {0 u( c' ^7 Z! O) |- B# A8 J
}- R6 d. {$ [( R$ x4 P/ E+ y! k8 o
2 D9 I3 r* m& |& [
|
|