这是PWM电机调速程序
9 h/ @1 d9 w8 f+ i
/**************************************************/
#include<reg51.h>
#defineuInt unsigned int4 a! j2 g. f0 q+ K/ h
#define uchar unsigned char
ucharPWM_T = 0; //占空比控制变量
//////////////////主程序入口//////////////////////
5 v- Y9 b2 o, @) |& `void main(void)
. I$ c6 N" p" P7 j/ W% x{
3 z3 N# X0 t& T7 y4 |' w* bbit flag = 1; //控制灯渐亮渐熄方式
) f; h9 C, x% Q; S) Q1 u! UuInt n;
TMOD=0x02; //定时器0,工作模式2,8位定时模式
; D* [# T, G0 a( STH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
8 A" l3 o& T: b) G. U9 RTL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)0 n: e# q R0 C q! S8 x3 Q
TR0=1; //启动定时器 ; h/ l N0 Z8 [2 c
ET0=1; //允许定时器0中断' a2 x: _8 S: s
7 u( [, T( \, @/ b8 p
EA=1; //允许总中断
P1=0xff; //初始化P1
while(1)
. ^) T' @+ x% v( r- U8 i1 |{
+ v8 r1 r, J# {9 o! ~ for(n=0;n<600;n++); //延时,将响应定时器中断,灯会自动加/减一个档次的亮度! b4 p( O9 A% d6 \+ I5 D
//取值0-65535,数字越大变化越慢
if(flag==1) //灯渐亮
a' o2 `6 ~' @0 Z PWM_T++;- K' f4 |# [7 D/ b. O, |. U6 h
else //灯渐熄
( `4 q; ?0 u/ R# F- x/ F" d* J PWM_T--;
1 b' e+ I" n4 u$ s2 U0 x2 \ w # P2 G! |! I* I3 o$ Q+ Y5 H# z
if(PWM_T>=100) //设置灯亮度级别为10
% S: p v( U7 T flag=0;
if(PWM_T==0) //限定最低亮度级别为02 l/ v( ]8 w! ~& Z* j+ h* {
flag = 1;
# G- R* S! h) n2 W4 A# w}
}
///////////////////定时器0中断模拟PWM//////////////////// K' R+ X. k" s* g
timer0() interrupt 1 using 2 7 O0 }4 G0 s/ h! {( K! z
{
% O8 D% i0 l. ^/ mstatic uchar t ; //PWM计数
t++; //每次定时器溢出加1
5 b# U* ^1 `! B" F2 v
# H1 K3 I' V- w. D/ V1 zif(t==100) //PWM周期
{
% U1 ]8 ?" I" ^1 J0 I& i t=0; //使t=0,开始新的PWM周期 8 z" L9 J, ]% p* L" P& D8 H, e
P1=0x00; //使LED灯亮 4 s: N# e! ~) u) L( O8 O5 f: v
}; y: V% Y) Z+ c" T/ c
, ` H, h. z9 H6 e" r, f% h( G
if(PWM_T==t) //按照当前占空比切换输出为高电平 ! f- v! g& ]" A# ?; C
P1=0xff; //使LED灯灭 " J, k! J1 ]1 R6 ?/ Y2 F" Q
}