/*-------------------------------------------------------------------
假定led的闪烁频率为100HZ,而亮度变化的范围为0~99共100等分。
则每一等分所占用的时间为 1/(100*100)=100us即在改变led的亮灭状态时,
应该是在100us整数倍时刻时。用单片机的定时器产生100us的中断,
同时每10ms调整一次led的占空比。这样在10ms*100=1S的时间内led可以从暗逐渐变亮,
在下一个1S内可以从亮逐渐变暗,然后不断循环。
---------------------------------------------------------------------*/
#include <reg52.h>
#define led_on P1=0x00
#define led_off P1=0xff
#define pwm_max 99
#define pwm_min 0
unsigned char timenum;
signed char ledpwm,ledpwm_temp;
bit leddirction;
void main(void)
{
TMOD=0x02;
TL0=156;
TH0=156;
ET0=1;
EA=1;
TR0=1;
while(1);
}
void timer0(void) interrupt 1
{
if((++timenum)>=100) //每20mS调整一下led的占空比
{
timenum=0;
if(leddirction==0) //如果是渐亮方向变化,则占空比递增
{
ledpwm++;
if(ledpwm>pwm_max)
{
ledpwm=pwm_max;
leddirction=1;
}
}
if(leddirction==1) //如果是渐暗方向变化,则占空比递减
{
ledpwm--;
if(ledpwm<pwm_min)
{
ledpwm=pwm_min;
leddirction=0;
}
}
ledpwm_temp=ledpwm; //获取LED的占空比
}
if(ledpwm_temp>0) //占空比大于0,则点亮led,否则熄灭led
{
led_on;
ledpwm_temp--;
}
else
{
led_off;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a=0,z=0,c=0,b=99;
void chushi()
{
TMOD=0X01;//设置定时器0为定时工作
TH0=(65536-200)/256;//装初值
TL0=(65536-200)%256;
ET0=1;//开定时器中断
EA=1;// 开总中断
TR0=1;//启动定时器
}
void flash(uchar a,uchar b)
{
if(c==a)//灭的时间
P1=0xff;
if(c==b)//亮的时间
{
P1=0;
}
}
void main()
{
chushi();
while(1)
{
flash(a,b);
if(c==99)//每20MS调整一次占空比
{
c=0;
if(z==0)//暗到亮
{
a++;
b--;
if(a==99&&b==0)
z=1;
}
if(z==1)//亮到暗
{
a--;
b++;
if(a==0&&b==99)
z=0;
}
}
}
}
void zhongduan1() interrupt 1
{
TH0=(65536-200)/256;//重新装初值
TL0=(65536-200)%256;
c++;
}
-----------------------------------------------------------------------
您好楼主:
能解释下pwmshi 是怎么与灯的亮度练习起来的(没看到相关语句)?
-----------------------------------------------------------------------
亮度变化的范围为0~99共100等分。
最亮的时候其灰度等级为99,为0的时候最暗,也就是熄灭了。
定义PWM的占空比上限为99, 下限定义为0
#define pwm_max 99 //最亮
#define pwm_min 0 //最暗 熄灭
控制PWM 就是控制亮度
一周热门 更多>