这是PWM电机调速程序
+ \; {: S! a4 T2 R6 R8 k5 q% Z8 U
/**************************************************/
#include<reg51.h>
#defineuInt unsigned int
) ~& U' I+ r+ @8 y; d2 m#define uchar unsigned char
ucharPWM_T = 0; //占空比控制变量
//////////////////主程序入口//////////////////////
4 g7 {# Z! O: r$ bvoid main(void) : H" J0 R: G/ h# h m9 s
{ % J( |+ T: R$ N0 k) O
bit flag = 1; //控制灯渐亮渐熄方式. t& J8 s, t) \0 _, L$ H. g
uInt n;
TMOD=0x02; //定时器0,工作模式2,8位定时模式 1 [3 ~! j6 d; D- g
TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
) ?6 y5 Q( x' s# RTL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)" J1 |3 p. w# r
TR0=1; //启动定时器
2 Y0 B( K0 s, ZET0=1; //允许定时器0中断
5 M! k |% h7 I, L / C3 @5 ]3 M6 p8 R' h
EA=1; //允许总中断
P1=0xff; //初始化P1
while(1)
! D6 O$ i5 K1 n( a{
6 }7 f% ]( F U8 V, E/ i) k' I for(n=0;n<600;n++); //延时,将响应定时器中断,灯会自动加/减一个档次的亮度
5 U$ x; ?8 s3 c4 U; l2 X- | F% E //取值0-65535,数字越大变化越慢
if(flag==1) //灯渐亮9 Y! _5 i. s* K% b! {& ~
PWM_T++;3 p$ K, R+ l6 R5 d. O
else //灯渐熄) o5 L1 q( Y2 q# r5 I5 `
PWM_T--;
, R* b8 B0 p; n# V8 A* {5 K+ }
. u+ ]0 e% v3 a if(PWM_T>=100) //设置灯亮度级别为10" V! G$ R D9 T
flag=0;
if(PWM_T==0) //限定最低亮度级别为05 m- t, _% @8 V1 t& G* E5 V4 M. h
flag = 1;& J+ `7 V4 E; t) K, f* A2 w i P
}
}
///////////////////定时器0中断模拟PWM//////////////////// z" q; H: J" t! {7 |, W
timer0() interrupt 1 using 2
$ N9 A* w- `6 _( t{
$ a3 Y; N8 s6 ~. ~& Q u" Xstatic uchar t ; //PWM计数
t++; //每次定时器溢出加1
* w" j9 A2 h1 U) @- x * U. _. }2 F: @$ `
if(t==100) //PWM周期
{ $ Q: c5 J0 N9 f
t=0; //使t=0,开始新的PWM周期 3 `2 u/ X# I" t+ L$ x7 K) { w7 Y5 @
P1=0x00; //使LED灯亮 % } ]. g% w* X
}7 G. [' X4 `; K) ^6 e7 l& m2 z
5 O) L& I6 g" v
if(PWM_T==t) //按照当前占空比切换输出为高电平
+ t0 {, I, \# _& {" S6 ` P1=0xff; //使LED灯灭 & X% @+ J+ k: T
}