怎样用一个单片机控制LED灯的亮度

十年砍柴 2011-06-07 08:39:50
要求是用一个按键来切换LED的亮度 如按第一次LED灯为强光,按第二次为弱光,再按一次灯熄灭


我的整体思路是定义一个标志变量 按一次按键该变量加1 然后用switch语句来设置PWM值(前提是改单片机自带PWM功能)

但是我完全不清楚怎么初始化PWM和设置PWM值 那位高手愿意教下我啊 单片机型号参考SOP8


还有就是如果单片机不带PWM功能的话(参考HS108)我需要用定时器中断来实现PWM功能 但是细节方面我也是不知道怎么写


那位有思路 或者相关代码的话 教教我吧 多谢!!分的话一定我可以追加。
...全文
4449 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
SailorXing 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iamlaosong 的回复:]

不用那么复杂,设置一个定时中断,时间在5毫秒以下,按键像你说的那样计数,每次加1,如果到3,就改为0,在0-2之间循环。定时中断时,如果是0,则输出高电平点亮灯;如果是1则取反输出,这样灯只有一半时间亮,因为中断时间在5毫秒以内,看不出来闪烁,但亮度肯定低一半;如果是2,则输出低电平,灯不亮。
[/Quote]支持通过对点亮时间的控制来改变亮度,还有一种方法是通过数模转换来控制输出电压,不过要使用专门的IC控制电压。
AnYidan 2011-06-08
  • 打赏
  • 举报
回复
microchip
十年砍柴 2011-06-08
  • 打赏
  • 举报
回复
或者哪位推荐一个包含PWM功能的单片机给我
lbing7 2011-06-08
  • 打赏
  • 举报
回复
定时器设定频率为你PWM频率的N分之一,这个具体看你的控制精度要求

在定时器中断中,用一个变量PWMCOUNT。这个变量的值控制在0到N-1之间,不停地如此处理该变量


另外一个PWM控制变量PWMUSED,由用户控制。值也在0到N-1之间

同时于中断中处理这样的关系:

if (PWMUSED < PWMCOUNT)
{
//输出高
}
else
{
//输出低
}
十年砍柴 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 veron_04 的回复:]
可以多搞几个LED接上去,比如2个,这两个LED分别接在两个输出口上。
1、当你按一次时,两个输出口都输出,那么两个LED都亮,亮度肯定大于一个LED
2、再按一次后,关闭掉一个输出口,其对应的LED熄灭,此时就一个LED亮了,其亮度若于两个LED
3、最后一次按,关闭掉另一个输出口,其对应的LED也熄灭,也就是说两个LED都熄灭了。

这只是一个思路。不过实现起来最简单了。现在市面上很……
[/Quote]
想法很好 可是不是我需要的
贝隆 2011-06-08
  • 打赏
  • 举报
回复
可以多搞几个LED接上去,比如2个,这两个LED分别接在两个输出口上。
1、当你按一次时,两个输出口都输出,那么两个LED都亮,亮度肯定大于一个LED
2、再按一次后,关闭掉一个输出口,其对应的LED熄灭,此时就一个LED亮了,其亮度若于两个LED
3、最后一次按,关闭掉另一个输出口,其对应的LED也熄灭,也就是说两个LED都熄灭了。

这只是一个思路。不过实现起来最简单了。现在市面上很多的LED手电筒就是这样做的。
十年砍柴 2011-06-08
  • 打赏
  • 举报
回复
没人在了啊
十年砍柴 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iamlaosong 的回复:]
不用那么复杂,设置一个定时中断,时间在5毫秒以下,按键像你说的那样计数,每次加1,如果到3,就改为0,在0-2之间循环。定时中断时,如果是0,则输出高电平点亮灯;如果是1则取反输出,这样灯只有一半时间亮,因为中断时间在5毫秒以内,看不出来闪烁,但亮度肯定低一半;如果是2,则输出低电平,灯不亮。
[/Quote]


关键的是 我不了解那个EMP78153S单片机 不知道怎样定义改单片机的中断? 我只会51单片机啊
那位可以教教我呢
十年砍柴 2011-06-08
  • 打赏
  • 举报
回复
补充下 大家可千万别笑我 这个新手写的代码哈
十年砍柴 2011-06-08
  • 打赏
  • 举报
回复
#include "EM78P153S.h"


#define uchar unsigned char //定义一下方便使用
#define uint unsigned int


sbit led = P60; //定义 LED 灯
sbit key = P61; //定义按键
static uchar flag=0; //LED状态变量




void main(void) // 主程序
{
uchar i;
TCC=1; //开定时器中断
TCC=?; // 定时器赋初值 此初值需要是定时器定时5毫秒 BUT我不知道
INT=1; //打开总中断
while(1) //程序循环
{

unsigned char i;
if(!key)
{
for(i=0;i<1000;i++); //等待按键稳定
flag++; //改变状态标志位
if(flag==3) flag=0; //状态循环
while(!key); //等待按键松开
for(i=0;i<1000;i++); //等待按键稳定松开
}

}
}

timer() //定时器中断函数
{
TCIF=0; // TCC溢出位清0;
TCC=? ; //定时器赋初值
switch (flag)
{
case 0: led=1; //LED熄灭
break;
case 1: led=0; //LED点亮 此时为强光
break;
case 2; led=~led // LED通过不断点亮和熄灭 此时为弱光
default:
break;
}


}

照着2楼iamlaosong兄弟的思路我写了个大概的代码 但是我不了解义隆单片机 里面的定时器设置和函数我不知道怎么写,那位兄弟帮我修改修改啊
十年砍柴 2011-06-08
  • 打赏
  • 举报
回复
我的产品就是一个LED灯
贝隆 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sailorxing 的回复:]
引用 2 楼 iamlaosong 的回复:

不用那么复杂,设置一个定时中断,时间在5毫秒以下,按键像你说的那样计数,每次加1,如果到3,就改为0,在0-2之间循环。定时中断时,如果是0,则输出高电平点亮灯;如果是1则取反输出,这样灯只有一半时间亮,因为中断时间在5毫秒以内,看不出来闪烁,但亮度肯定低一半;如果是2,则输出低电平,灯不亮。
支持通过对点亮时间的控制来改变亮度,还有一种方法是……
[/Quote]
考虑在半亮是串联一个分压电阻。全亮时把这个电阻给短路了就可以了。
fontlose 2011-06-07
  • 打赏
  • 举报
回复
一次按键该变量加1,按到最后一个初始化为起始,就是一个状态机问题。
PWM可以看成是周期为T,其中高电平时间t,低电平时间就为T-t了,当高点平时间占周期的1半时亮度就是50%
调整t就可以调亮度了
Frankfu001 2011-06-07
  • 打赏
  • 举报
回复
你可以在2s内按下几下,判断按键,这样蛮好!
宋哥 2011-06-07
  • 打赏
  • 举报
回复
不用那么复杂,设置一个定时中断,时间在5毫秒以下,按键像你说的那样计数,每次加1,如果到3,就改为0,在0-2之间循环。定时中断时,如果是0,则输出高电平点亮灯;如果是1则取反输出,这样灯只有一半时间亮,因为中断时间在5毫秒以内,看不出来闪烁,但亮度肯定低一半;如果是2,则输出低电平,灯不亮。
十年砍柴 2011-06-07
  • 打赏
  • 举报
回复
自己沙发下

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧