找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

LED亮度控制

[复制链接]
admin 发表于 2012-9-2 23:45:43 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
LED亮度控制的学习

本来想用52单片机定时器2来写这几个程序,但是对52的定时器2不太熟悉,就依然用了定时器0。
学习中参考了论坛上第一届比赛的帖子, 在此谢谢电子工程师之家论坛。

使用的是论坛上的学习板

1.有些灯亮 有些灯暗


#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit dm=P1^4;
sbit wm=P1^5;
sbit led_cs=P1^6;

unsigned char k=0;

init()
{
TMOD = 0x02; //定时器0,工作方式2,自动重装
TH0 = 256-50;
TL0 = 256-50;
ET0 = 1;
EA = 1;
TR0 = 1;
}

time0() interrupt 1 using 0
{
k++;
}

main()
{

dm=0;
wm=0;
led_cs=1;
init();
while (1)
{
while ( k<20)
{
P0 = 0x00;
}

while ( k>=20&&k<=255)
{
P0 = 0x55;
}

}
}
说一下编程思想:程序运行后,定时0开始工作(主要任务是 使 k增1)当k小于20的时候所用等全亮,当k大于等于20且小于255的时候灯单数熄灭,双数继续亮。
由于while ( k>=20&&k<=255)
{
P0 = 0x55;
}
这段程序占用的时间比while ( k<20)
{
P0 = 0x00;
}多
所以单数灯熄灭的时间比亮的时间上,整体上就比较暗。同时由于双数灯一直都亮,整体上就比较亮。
学习中想过会不会 两 个while()程序段都不运行,其实不会,因为当k值增到255的时候再加1就变为0了,就会进入第一个while()程序段中

2.所有的LED由暗变亮


#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int


sbit dm=P1^4;
sbit wm=P1^5;
sbit led_cs=P1^6;

uchar m=0;

time0init()
{
TMOD = 0x02; //定时器0,工作方式2,自动重装
TH0 = 256-50;
TL0 = 256-50;
ET0 = 1;
EA = 1;
TR0 = 1;
}

time0() interrupt 1 using 0
{
m++;
}

void main()
{
uchar k= 0;
dm=0;
wm=0;
led_cs=1;
time0init();
while(1)
{

k = 0;
while(k!=255)
{
if( m == 0) // 点亮
{
P0 = 0x00;
}
if(m== k) // 熄灭
{
P0= 0xff;
}
if( m== 255)
{
k++;
}
}
}
在这个程序中运用的原理和上边程序的原理一样(当亮的时间(P0口为0的时间)比暗的时间(P0口为1的时间)短时LED灯就比较暗,反之就比较亮)
要实现动态的变化(由暗变亮)就需要让开始的时候暗,随着时间的变化增亮
程序中刚开始m值很容易就等于k值 ,但是随着k值的增加m值要等于k值就需要一定的时间了,即为LED由亮着变为熄灭需要时间长了。

在此也请教一下各位52 定时器2的使用方法 谢谢
[ 此贴被电子隐者在2009-07-18 14:35重新编辑 ]
meiguo9999 发表于 2013-3-9 12:22:17 | 显示全部楼层
采用了PWM原理
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 18:38 , Processed in 0.078678 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表