89C52单片机怎么通过按键产生PWM信号来控制LED灯的不同亮度

89C52单片机怎么通过按键产生PWM信号来控制LED灯的不同亮度,第1张

用几个变量表示按键的按下/松开状态,然后用定时器中断设置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语言程序怎么编写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9675015.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存