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

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


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

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


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


那位有思路 或者相关代码的话 教教我吧 多谢!!分的话一定我可以追加。
...全文
4680 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,511

社区成员

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

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