
用几个变量表示按键的按下/松开状态,然后用定时器中断设置PWM的频率,例如要50hz的频率,那么定时器中断周期(PWM周期的一半)可以设置为10ms,在中断服务程序内根据按键的状态确定是否需要对PWM输出管脚进行翻转。改方法可以输出占空比为50%的PWM信号。
LED是英文 light emitting diode (发光二极管)的缩写,它的基本结构是一块电致发光的半导体材料芯片,用银胶或白胶固化到支架上,然后用银线或金线连接芯片和电路板,然后四周用环氧树脂密封,起到保护内部芯线的作用,最后安装外壳,所以 LED 灯的抗震性能好。运用领域涉及到手机、台灯、家电等日常家电和机械生产方面。
stripsetPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b);
第一个参数n是彩带中LED的编号,最接近单片机引脚的编号为0;接下来的三个参数描述像素颜色,分别表示红色、绿色和蓝色的亮度级别,0为最暗,255是最大亮度;
stripsetPixelColor(uint16_t n, uint32_t c);
n是彩带中LED的编号,颜色color是一种32位类型,将红色,绿色和蓝色值合并为一个数字,有时这样做能提高程序的效率。通过下面的方法,可以将红色、绿色和蓝色值转换为32位类型。
uint32_t magenta = stripColor(red, green, blue);
stripsetBrightness(uint8_t);
一般只在setup()中调用,以保证在整个程序执行过程中LED颜色亮度的一致性。其实,在程序中通过合适的逻辑控制各像素的亮度值,可能动画效果更好。
stripshow();
该方法更新彩带上的全部LED。一个好的习惯是先利用setPixelColor()设置好整个彩带的颜色,然后再调用show()方法,以防止出现动画跳跃而不平滑。
/52系列单片机,晶振12MHz,P10输出100Hz方波(即周期10ms),方波由T0定时器产生
P13接按键
K1,每按一次按键,方波占空比改变一次,依次为:1/10→2/10→……→9/10→1/10,如此循环/
#include"reg52h"
//包含52系列头文件
#define
uchar
unsigned
char
//定义
无符号字符型
#define
uint
unsigned
int
//定义
无符号整型
#define
TRUE
1
//定义
逻辑真
#define
FALSE
0
//定义
逻辑假
#define
th0
0xfc
//100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为
1ms
#define
tl0
0x18
//1ms
at
12HMz
Fosc
#define
DutyDeno
10
//定义
占空比分母
为:10
sbit
WaveOut=P1^0;
//定义
方波输出
接口
sbit
Key1=P1^3;
//定义
按键Key1
接口
uchar
DutyNume=1;
//定义
占空比分子
变量,并初始化为
1(即
占空比
为:1/10)
void
Timer0()
interrupt
1
//定时器T0
中断
函数
{
static
uchar
duty_time=0;
//定义静态变量,作为
占空比
输出时间的参考值(1ms)
TL0=tl0;
TH0=th0;
//重赋定时器初值,1ms
duty_time=++duty_time%DutyDeno;
//该句等效于:duty_time++;duty_time%=DutyDeno;
if(duty_time<DutyDeno)
WaveOut=1;
//若计时时间小于
占空比分子,则输出应为
高电平
else
WaveOut=0;
//若计时时间大于
占空比分子,则输出应为
低电平
}
void
TimerInit()
//定时器初始化
函数
{
TMOD=0x01;
//T0
16位定时器
EA=1;
//允许系统中断
ET0=1;
//允许T0中断
TH0=th0;
TL0=tl0;
//1ms
初值
TR0=1;
//T0开始计时
}
void
KeyResp()
//按键响应
函数
{
static
bit
KeyDownFlag,KeyReadyFlag;
//定义
静态标志位,KeyDownFlag
按键按下标志,KeyReadyFlag
按键准备(响应)标志
if(!Key1)
//若按键Key1
被按下
{
KeyDownFlag=TRUE;
//按键按下标志
置位
KeyReadyFlag=TRUE;
//按键准备标志
置位
}
else
KeyDownFlag=FALSE;
//若按键Key1
无按下,则清空
按键按下标志
if(!KeyDownFlag
&&
KeyReadyFlag)
//若
按键已准备,且按键无按下(即
松手状态)
{
DutyNume++;
//占空比分子
加1
if(DutyNume==DutyDeno)
DutyNume=1;
//若
占空比分子=分母,则返回
1
KeyReadyFlag=FALSE;
//按键处理完毕,清
按键准备标志
}
}
void
main()
//主函数
{
TimerInit();
//调用
定时器初始化
函数
while(1)
//循环系统
{
KeyResp();
//调用
按键响应
函数
}
}
方波输出接口接灯;
在大街小巷,我们都能看到一些字显示灯牌,这些灯牌都是led显示屏,led灯是非常节能的二极管,对于人们来说,不仅使用着极为方便,而且还能节省电量,着实是一种特别实用的灯板。led显示屏是可以随意调节亮度的,它可以根据人们的需要修改亮度,让亮度更符合人们的要求。假如是为了吸引顾客,那么就要把led显示屏调亮一些,调节的方法下面就介绍给大家。
led显示屏亮度调节方法
一种是改变流过LED的电流,一般LED管允许连续工作电流在20毫安左右,除了红色LED有饱和现象外,其他LED亮度基本上与流过的电流成比例;
另一种方法是利用人眼的视觉惰性,用脉宽调制方法来实现灰度控制,也就是周期性改变光脉冲宽度(即占空比),只要这个重复点亮的周期足够短(即刷新频率 足够高),人眼是感觉不到发光象素在抖动。由于脉宽调制更适合于数字控制,所以在普遍采用微机来提供led显示内容的今天,几乎所有的led屏都是采用脉宽调制来控制灰度等级的。
led显示屏优势
1、面积延展性,LCD面积大了难以实现无缝拼接,LED显示屏可任意延展,并实现无缝拼接。
2、LCD等离子屏光通量衰减很快,一般运行一年半左右时间,就需要更换,但LED显示屏同等运行条件下至少五年没问题。
3、LED刷屏机可运用互动技术,增强刷屏机作为广告媒介与广告受众之间的互动,如定制触摸屏、实现云技术播控管理等。
LED发光材料
1、LED发光灯(或称单灯) 一般由单个LED晶片,反光杯,金属阳极,金属阴极构成,外包具有透光聚光能力的环氧树脂外壳。可用一个或多个(不同颜色的)单灯构成一个基本像素,由于亮度高,多用于户外显示屏。
2、LED点阵模块 由若干晶片构成发光矩阵,用环氧树脂封装于塑料壳内。适合行列扫描驱动,容易构成高密度的显示屏,多用于户内显示屏。
3、贴片式LED发光灯(或称SMD LED) 就是LED发光灯的贴焊形式的封装,可用于户内全彩色显示屏,可实现单点维护,有效克服马赛克现象。
led显示屏的调节方法特别简单,大家只要按照步骤学习就可以掌握,led显示屏能够用的地方很多,除了要学会调整亮度以外,还要知道它能够用到的地方。人们多用它来通知一些事情,或者是看到一些广告,亮度也是根据人们的需要选择的,它都会有一个限度。led显示屏是目前为止最环保的显示屏种类,所以提倡大家都使用led类型的,其他灯牌的话,会更加费电一些。
土巴兔在线免费为大家提供“各家装修报价、1-4家本地装修公司、3套装修设计方案”,还有装修避坑攻略!点击此链接:
/
模拟PWM输出控制灯的10个亮度级别
将定时器2溢出定为1/1200秒。每10次脉冲输出一个120HZ频率。
这每10次脉冲再用来控制高低电平的10个比值。
这样,在每个1/120秒的方波周期中,我们都可以改变方波的输出占空比,从而控制LED灯的10个级别的亮度。
/
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg52h> //包括一个52标准内核的头文件
sbit P10 = P1^0; //要控制的LED灯
sbit K1= P3^2; //按键K1
uchar scale;//用于保存占空比的输出0的时间份额,总共10份
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
//模拟PWM输出控制灯的10个亮度级别
void main(void) // 主程序
{
uint n;
RCAP2H =0xF3; //赋T2的预置值,溢出1次是1/1200秒钟
RCAP2L =0x98;
TR2=1; //启动定时器
ET2=1; //打开定时器2中断
EA=1; //打开总中断
while(1) //程序循环
{ ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度
scale++;
if(scale==10)scale=0;
}
}
//1/1200秒定时器2中断
timer2() interrupt 5
{
static uchar tt; //tt用来保存当前时间在一秒中的比例位置
TF2=0;
tt++;
if(tt==10) //每1/120秒整开始输出低电平
{
tt=0;
if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
P10=0;
}
if(scale==tt) //按照当前占空比切换输出高电平
P10=1;
}
――――――――――――――――――
在主程序中,每延时一段时间,就自动换一个占空比,以使亮度自动变化,方便观察。
编译,运行,看结果。
可以看到,LED的亮度以每种亮度1秒左右不断变化,共有10个级别。
一种是改变流过LED的电流,普通LED管容许持续任务电流在20毫安左右,除了红色LED有饱和现象外,其余LED亮度基本上与流过的电流成比例;不过这种调节方法虽然简单,但随着LED大屏幕要求的逐步提高,也越来越不适应快速精确地调制了,下面接受常用的一种调制方法;
另一种方法是脉冲宽度调制(PWM),使用人眼的能感觉到的变化的频率,用脉宽调制方法来实现灰度控制,也就是周期性改变光脉冲宽度(即占空比),只需这个反复点亮的周期足够短(即刷新频次足够高),人眼是感觉不到发光象素在颤抖。由于脉宽调制更适宜于数字控制,所以得到了很广发的利用。常见的方法就是采纳微机来提供LED显示方式。目前几乎所有的LED屏都是采纳脉宽调制来控制灰度等级的。江西做LED显示屏。
以上就是关于89C52单片机怎么通过按键产生PWM信号来控制LED灯的不同亮度全部的内容,包括:89C52单片机怎么通过按键产生PWM信号来控制LED灯的不同亮度、ws2812 LED灯编程、AD 控制LED灯亮度 C语言程序怎么编写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)