全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

LED亮度控制

[复制链接]
5110 1

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

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

x
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重新编辑 ]

举报

回复

1 个评论

meigu***  新手上路  发表于 2013-3-9 12:22:17  | 显示全部楼层
采用了PWM原理
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

打开支付宝扫一扫,最高立得1212元红包
搜索

图文热点

更多

社区学堂

更多

客服中心

QQ:187196467 服务时间:周一至周日 8:30-20:30

关注我们

关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
快速回复 返回顶部 返回列表