这是PWM电机调速程序
! ^5 l2 e: r$ \; M; y$ R
/**************************************************/
#include<reg51.h>
#defineuInt unsigned int
: t' Y' t+ C- Q0 v#define uchar unsigned char
ucharPWM_T = 0; //占空比控制变量
//////////////////主程序入口//////////////////////7 p, h, L) W6 J$ l4 Z
void main(void) , T1 [/ ?# d+ x" L
{
8 z b8 W1 w" {/ T0 F0 [( |$ lbit flag = 1; //控制灯渐亮渐熄方式% y3 ^. `' c3 Q3 y
uInt n;
TMOD=0x02; //定时器0,工作模式2,8位定时模式 ; z! y A: r% U/ i
TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)4 s6 e3 z: b9 g0 T! N; c
TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
, G- W! g6 [" {9 |TR0=1; //启动定时器
2 i1 T' ]5 r$ h# N7 yET0=1; //允许定时器0中断$ i/ \3 G2 `* V
( }$ c5 t$ t% _, F0 x$ k. N! S, uEA=1; //允许总中断
P1=0xff; //初始化P1
while(1)
. C! u& Y$ x% p, S1 e{ ; F: N' I$ z& C( @, k& |8 d
for(n=0;n<600;n++); //延时,将响应定时器中断,灯会自动加/减一个档次的亮度
6 b, W7 f, @" Z8 t4 N //取值0-65535,数字越大变化越慢
if(flag==1) //灯渐亮1 F: N- R- U2 t% I. N5 l
PWM_T++;
% a, G$ M' H8 d0 p5 e& c else //灯渐熄3 h. K2 H# X+ |) I. L( } A5 k
PWM_T--;
# X7 m- y2 }3 t. C8 m4 ?1 j
, o, v& d; K W4 V8 G4 Y) o if(PWM_T>=100) //设置灯亮度级别为10' p- ?6 f. T* Q# O$ a
flag=0;
if(PWM_T==0) //限定最低亮度级别为0
7 s+ k2 P6 N& R4 a; _ flag = 1;' {" ^5 R" ]: y @
}
}
///////////////////定时器0中断模拟PWM////////////////////
2 W1 g. Q! ?. r: u6 i8 |& ^/ htimer0() interrupt 1 using 2 4 z* @6 g6 \5 _1 B1 o2 n! w0 x/ l( k
{
+ p" Q9 H3 d- f- A* D% nstatic uchar t ; //PWM计数
t++; //每次定时器溢出加1
& d0 c$ n" Y% E! H9 @% j
) v" i6 t' K9 t2 @8 wif(t==100) //PWM周期
{ / S9 G6 @8 ^. D2 q" U; m
t=0; //使t=0,开始新的PWM周期 \' o! G9 U2 f% w: g4 v* U( B
P1=0x00; //使LED灯亮
% k$ Q9 E6 B- b% z$ ^5 E7 m}
- h, P3 d7 p7 b& \1 N. N
$ K+ X9 M; a7 Bif(PWM_T==t) //按照当前占空比切换输出为高电平
& z, j. Q& K; a) q8 S; j P1=0xff; //使LED灯灭 # u8 q& Q! ~0 N; t2 h
}