这是PWM电机调速程序
6 L8 y! R( Y* Y' z1 ^: Y% c a" f
/**************************************************/
#include<reg51.h>
#defineuInt unsigned int
% a U. M/ j3 I8 q3 F/ U+ x#define uchar unsigned char
ucharPWM_T = 0; //占空比控制变量
//////////////////主程序入口//////////////////////, Y/ [8 D! u1 Z1 T0 Q ]
void main(void)
7 _9 Z- T" B9 g8 E! p+ ^{
4 ~% d+ |4 g* |! Dbit flag = 1; //控制灯渐亮渐熄方式
# d' K) Y$ Q7 q3 ?1 c- @4 {uInt n;
TMOD=0x02; //定时器0,工作模式2,8位定时模式
. ^, P% e* V( F v$ ]% n4 E5 PTH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
! R8 {2 D8 c( C9 a1 }TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
- M- [7 D6 h2 s8 j7 g; L$ p& rTR0=1; //启动定时器 ( t0 K& j& D/ W6 J8 x. Z& z. I; @' B
ET0=1; //允许定时器0中断
; ~8 [6 P8 O4 |1 W" \& J & p' Y$ m" s9 m+ T0 @# }
EA=1; //允许总中断
P1=0xff; //初始化P1
while(1)
6 H$ [5 z, j& t6 P _{ " t! ~# q9 k) Q+ ~: v
for(n=0;n<600;n++); //延时,将响应定时器中断,灯会自动加/减一个档次的亮度$ u( b1 E% L) ~" v" m
//取值0-65535,数字越大变化越慢
if(flag==1) //灯渐亮7 y4 b4 O2 F2 C/ V; _$ r* e
PWM_T++;
% w, o, c9 ^, l+ |) j4 X7 a else //灯渐熄" p/ |5 }: |7 e+ ^1 [
PWM_T--;/ r1 ~. k; z* L
; t* {; b4 G B9 K! K& k; @7 \ if(PWM_T>=100) //设置灯亮度级别为107 E2 m2 R) ]* l$ y" Q1 b0 U. {
flag=0;
if(PWM_T==0) //限定最低亮度级别为0
& l5 R5 b. b2 d) Z# ?! W! } flag = 1;$ V+ t& }. ~8 A9 t
}
}
///////////////////定时器0中断模拟PWM////////////////////( I4 g8 c' y% F- @) l% t( p7 b& s
timer0() interrupt 1 using 2 $ `$ F: p2 e7 | L8 n* L
{ 5 J$ P9 }% t; K! f
static uchar t ; //PWM计数
t++; //每次定时器溢出加1
/ Z- _4 g* h% Z* I' c' T+ q, o. _
( y5 d: e/ ~3 |0 b$ G6 U3 Rif(t==100) //PWM周期
{
0 g: I8 _" X- D0 |: M t=0; //使t=0,开始新的PWM周期 + p. z) } t$ s7 g9 X3 T7 R' ?
P1=0x00; //使LED灯亮
& o5 C3 {8 Z& l7 }}" [% f+ \# b: ~5 r& n( A7 _
, G l+ G: p3 a/ Y" ] ?! G: q
if(PWM_T==t) //按照当前占空比切换输出为高电平 4 A% F+ z* h2 f8 s" S- B5 |& f
P1=0xff; //使LED灯灭 6 d: h& Q. h9 l9 \
}