这是PWM电机调速程序
" l" ]! _4 }+ G# i! p$ @+ h' K/ H
/**************************************************/
#include<reg51.h>
#defineuInt unsigned int7 ]( o9 G" {1 A' l1 O
#define uchar unsigned char
ucharPWM_T = 0; //占空比控制变量
//////////////////主程序入口//////////////////////
& @* z8 }$ {8 X/ o6 xvoid main(void)
u& P4 U7 F: R1 ]$ k{
& i% K+ ~% j( b% ~bit flag = 1; //控制灯渐亮渐熄方式( E# C0 ~( m- Q9 `: \3 F! R. s
uInt n;
TMOD=0x02; //定时器0,工作模式2,8位定时模式
& Z$ K. K9 `$ l$ f) ZTH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)! M4 b3 m8 x7 ?
TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
5 S. C6 q8 I9 ETR0=1; //启动定时器
7 U4 O9 r8 g& y& t$ jET0=1; //允许定时器0中断
+ R1 f, E1 H, M+ ^' W: a) P & c- I/ q! l2 X& x3 x
EA=1; //允许总中断
P1=0xff; //初始化P1
while(1)
% n3 H) t( N3 O9 |$ s, C{
/ A; N8 T; \+ z/ X5 z for(n=0;n<600;n++); //延时,将响应定时器中断,灯会自动加/减一个档次的亮度
. p) |! [# K$ q* d' v" p //取值0-65535,数字越大变化越慢
if(flag==1) //灯渐亮
7 i) v) H1 K' J/ Q- O PWM_T++;
5 m2 i5 B! F ?' h/ d7 V% u else //灯渐熄
4 l2 t e* V: c' f. q1 p8 d2 U: y PWM_T--;6 C+ C; L0 v6 A& p) f- `; r2 w
" _+ M, d" ~ q if(PWM_T>=100) //设置灯亮度级别为108 w' o* L* Y9 A- c
flag=0;
if(PWM_T==0) //限定最低亮度级别为0
7 }1 T2 @5 {9 ^: Y9 ^ flag = 1;
& G2 m8 |0 K! J" e& c% J7 v- I}
}
///////////////////定时器0中断模拟PWM////////////////////
% O: _% ^& ?# k& q) Z/ m6 Y8 ltimer0() interrupt 1 using 2 - v7 Y& K& f; i. Y* m% K' @6 n
{ - f, F+ |3 M# f
static uchar t ; //PWM计数
t++; //每次定时器溢出加1! F7 \7 w4 R( b
) r' Y$ M* k# o# G6 }
if(t==100) //PWM周期
{ 8 o$ J; O7 X) }) T- }) I
t=0; //使t=0,开始新的PWM周期 7 F) i. n1 i- e; [ A: w
P1=0x00; //使LED灯亮 8 ~% N C8 ^* T
}9 f% B9 e$ H* x# u8 ^
1 ?4 A9 Q0 A! v! C B- U
if(PWM_T==t) //按照当前占空比切换输出为高电平 - U/ k: W! p. T* F9 h
P1=0xff; //使LED灯灭
. [. X: P& ~8 [. f; G}