目录
1.知识点
一般人眼睛对于80Hz 以上刷新频率则完全没有闪烁感。
亮灭频率太小的话 看起来就会LED灯闪烁,
那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,
基本就看不到LED闪烁了,而是一个常亮的LED灯亮度会发生改变,
你在1秒内,高电平0.5秒,低电平0.5秒,(频率1Hz)如此反复,那么你看到的电灯就会闪烁,
但是如果是10毫秒内,5毫秒打开,5毫秒关闭,(频率100Hz) 这时候灯光的亮灭速度赶不上开关速度(LED灯还没完全亮就又熄灭了),由于视觉暂留作用 人眼不感觉电灯在闪烁,而是感觉灯的亮度少了 因为高电平时间(占空比)为50% 亮度也就为之前的50% 。
PWM重要参数: 频率 = 1 / TS 占空比 = TON / TS 精度 = 占空比变化步距
频率很高时,看不到闪烁,占空比越大,LED越亮;
频率很高时,看不到闪烁,占空比越小,LED越暗;
频率很低时,可看到闪烁,占空比越大,LED越亮;
频率很低时,可看到闪烁,占空比越小,LED越暗;
所以,在频率一定下,可以不断占空比改变LED灯的亮度, 使其达到一个呼吸灯的效果。
2.LED接口
3.代码讲解
#include <STC15F2K60S2.H>
void Device(unsigned char p2,unsigned char p0)//配置锁存器
{
P0=p0;
P2=p2;
P2=0;
}
void Delay(unsigned int t)//延时函数
{
t=t*12; //使用89cxx系列型号单片机不用*12
while(t--); //15Fxx单片机与89c系列的运行速度不一样
}
void system()//初始化
{
Device(0xa0,0);//关闭蜂鸣器
Device(0x8,0xff);//关闭led灯
}
#define LED1 Device(0x80,~0x01)//LED1亮
#define LED2 Device(0x80,0xff)//LED灭
void main()
{
unsigned char Time,i;
system();
while(1)
{
for(Time=0;Time<100;Time++) //改变亮灭时间,由暗到亮
{
for(i=0;i<20;i++) //计次延时
{
LED1; //LED亮
Delay(Time); //延时Time
LED2; //LED灭
Delay(100-Time); //延时100-Time
}
}
for(Time=100;Time>0;Time--) //改变亮灭时间,由亮到暗
{
for(i=0;i<20;i++) //计次延时
{
LED1; //LED亮
Delay(Time); //延时Time
LED2; //LED灭
Delay(100-Time); //延时100-Time
}
}
}
}