|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机定时产生pwm波程序
/ c& A( l4 n: P7 K, j- t% u- {4 O) o: \4 H p% j& J
PWM(脉宽调制)在很多场合都用得上,例如LED亮度控制,开关电源输出电圧控制等。" g; o2 `! X, M! w3 r7 Q
这里采用简单的定时器实现PWM波输出,通过更改定时器定时参数,控制IO口输出; J% c% Y, E+ l# `8 Q) v
波形高低电平持续时间,实现PWM波。' Y6 _! U4 b( J; L1 d
6 h* R0 y6 m; {$ S5 d8 ?
代码如下:
6 b$ g# _- I: d( K#include<reg52.h>
& e2 D8 {% @- v/ E( e4 E( o2 ]; d9 O7 B6 h8 k& Q8 _4 Z. A
#define T0_INTERRUPT 1 //T0中断向量号
: ^7 E/ w$ d9 x#define PWMH_L 0x9C+ z! S; U) Y/ o0 |
#define PWMH_H 0xFF //PWM低电平时间0.1ms
& B, I* |9 w% p2 L0 |; q- N" }' o# P0 A8 ]) o
#define PWML_L 0xCE
+ h( K3 O- z( t0 K# }: j" O#define PWML_H 0xFF //PWM高电平时间0.05ms
9 n" l6 ?4 _0 l6 [* E4 C) G/ N( P/ t
sbit LED1 = P1^0; //常亮LED,作为对比,仿真看不出效果8 R8 P. C6 Q- v( ]
sbit LED2 = P1^1; //PWM驱动LED
; u, \9 F% A v) b* `: Z) b, Y* C/ \! e) b5 h# s. H/ {3 S
. G) @7 K. |* T0 K' {' o
* r! P% q9 t- y$ q' f7 U4 N/ atypedef unsigned char uchar;% ?% ~7 W. F4 r" n Q
typedef unsigned int uint;
) @# Q0 h# f9 F4 s' M% x' C* ?+ a2 K5 X. k& a- d: }) B
void Init_T0();, H" ~: B; R5 ?" G
# ?# i% w- J' g8 u' t
void main()6 S1 ~* f" V+ R/ |9 J6 B4 D+ r6 H
{5 w1 n0 D8 b9 K0 L8 N. W4 W; O( G
LED1 = 0; //点亮LED1% ~8 d0 \0 @1 B0 I7 _
LED2 = 1; //熄灭LED26 r" W% f% E. Q( g
Init_T0(); //初始化定时器0+ d& n n, V r
while(1)
7 T2 _3 N$ J; {8 B% Z% g {
2 \: Y! m# B7 D5 q PCON |= 0x01; //单片机进入休眠模式,节省功耗" q F/ w$ y8 M+ p1 F
}
" {( p% _$ U4 _. F# ~0 q. G2 B}/ z5 R( N/ j" p0 l
1 E. f, A. |0 K. b
void Init_T0()4 F2 l; Y; o1 x
{
1 X+ r; N1 p5 u! f6 B TMOD &= 0xF0;+ h- c: O& s# k/ Y" h
TMOD |= 0x01; //16位定时器模式/ H8 d# ?- M& o* {( a1 ?& k
* _/ V- O: r! Z- { TH0 = PWML_H;8 S6 n) _5 \ c" j4 k. w9 z
TL0 = PWML_L;- N: n1 d( a: p# C0 ?; h
. @% i9 o3 C! Q' p' J" E9 ~
EA = 1; //开全局中断
: E' N* e4 c4 o4 e5 q3 G/ f ET0 = 1; //允许T0中断
4 r. ^3 _+ G; L. Y0 f TR0 = 1; //启动定时器
- S: y3 E/ R( r}: f0 N% s8 t( u( D9 P
2 L- m4 {: Q* E/ u# ?7 L3 _! G: avoid T0_Interrupt() interrupt T0_INTERRUPT6 w- U$ z" l4 k' t% ~" k
{3 a2 a, G! a6 b. l/ ^, R8 ^% U5 O8 {
TF0 = 0;( P8 j% n& T& A, O O
if(LED2 == 1)/ A& n3 K; @) x3 T$ ?: U- j
{3 W, b0 X* t, V! R6 g
LED2 = 0; //设置低电平持续时间,LED2亮
, Z8 U9 o2 H' v! J" ~ TH0 = PWMH_H;5 ]& i- l, P' s8 `1 Y* c
TL0 = PWMH_L;
) h$ t( W4 A4 k. y/ E) X }
- f8 Y' v5 o( c5 n else
, n/ J2 j5 b. p" [0 l% [ {
: c( S2 C) K* C+ d) P1 m' t, { LED2 = 1; //设置高电平持续时间,LED2灭
+ _9 i9 P+ K3 V6 S* F/ v TH0 = PWML_H;
, n& A$ y# B! e/ \/ ]' }/ \ TL0 = PWML_L;
* y& Q" z# M# u: T& I- E4 o }) v, @, V, O' ^; H5 X
}8 x7 p* A# s/ {( U" {
. d& g- C! G( C' G |
|