打印

高手救命,帮我看下调光台灯,3Q了

[复制链接]
2687|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include<reg51.h>   //库文件定义
#define uchar unsigned char  //宏定义uchar
sbit LED=P1^0;      //台灯控制端
sbit ONOFF=P2^0;   //开关控制端
sbit ADD=P2^1;    //亮度增加
sbit DEC=P2^2;      //亮度降低
uchar Brightness;   //256位的亮度调节
bit MARK;     //台灯开关标志位
void delay1ms(unsigned int a) {
uchar i;
while(--a!=0)
{
  for(i=0;i<125;i++);
}
}
void delay(unsigned int d) {
uchar i;
while(--d!=0)
{
  for(i=0;i<2;i++);
}
}
void drive(void) {
  unsigned int a;
  a=Brightness;
  LED=0;
  delay(a);
  a=~a;
  LED=1;
  delay(a);
  a=~a;
}
void open(void){
if(ONOFF==0)
{
  delay1ms(20);
  if(ONOFF==0)
  {
   MARK=1;
   while(ONOFF==0);
  }
}
}         //去抖动 如果开关 开启 将MARK置1
void cloos(void){
if(ONOFF==0)
{
  delay1ms(20);
  if(ONOFF==0)
  {
   MARK=0;
   while(ONOFF==0);
  }
} }                                 //去抖动 如果开关 关闭 将MARK置0
void ADD0(void){
if(ADD==0)
{

Brightness++;
if(Brightness>254)
{
  Brightness=254;
}
}
}
void DEC0(void){
     if(DEC==0)
  {
  Brightness--;
  if(Brightness<1)
  {
   Brightness=1;
  }
  }
  }
void int0(void){
  Brightness=130;
  MARK=0;
  LED=1;
  ONOFF=1;
  ADD=1;
  DEC=1;
}
void main(void){
  int0();
while(1){
if(MARK==0)
{
  cloos();
}
if(MARK==1)
{
  drive();
  open();
  
  ADD0();
  DEC0();
}
}
}   


这是一个调光电路和程序 ,可是不知道怎么回事 按下ONOFF电路没反应,谢谢大家帮忙啊

相关帖子

沙发
jjjyufan| | 2012-2-7 13:23 | 只看该作者
看你的电路图
应该是个发光二极管的概率为90%
所以不能调光的,再折腾也没用
建议看看LED调光电路
或者你单片机 pwm控制mos管 调压 接个大功率的LED

使用特权

评论回复
板凳
t.jm| | 2012-2-7 13:57 | 只看该作者
本帖最后由 t.jm 于 2012-2-7 14:06 编辑

这个电路LED也能调光,问题出在drive
void drive(void) {
  unsigned int a;
  a=Brightness;
  LED=0;
  delay(a);
  a=~a;
  LED=1;
  delay(a);
  a=~a;
}
不能调光是因为a是int,而Brightness是uchar,所以~a后总是>0xff00,调光范围很小。
改成:
void drive(void) {
  static unsigned char a;
  if(a++ >= Brightness)
      LED=1;
   else
      LED=0;
}

使用特权

评论回复
地板
adofe| | 2012-4-7 17:22 | 只看该作者
灯都开不了,何谈调光。

使用特权

评论回复
5
AA制生活| | 2012-4-7 20:09 | 只看该作者
:L Proteus能模拟到调光效果嗎?

使用特权

评论回复
6
大浪MM| | 2012-4-7 21:21 | 只看该作者
学习学习了

使用特权

评论回复
7
NE5532| | 2012-4-7 22:32 | 只看该作者
:L Proteus能模拟到调光效果嗎?
AA制生活 发表于 2012-4-7 20:09


所以我一直说仿真害死初学者呢,就是总有不怕死的人要上。

使用特权

评论回复
8
fjzzclc| | 2012-4-9 11:54 | 只看该作者
都没有主函数, void main()

使用特权

评论回复
9
joyme| | 2012-4-9 13:34 | 只看该作者
if(MARK==1)
才调用open(),而MARK需要open()检测到按键MARK才会等于1,逻辑矛盾,当然ONOFF无效

使用特权

评论回复
10
wujunwy| | 2012-6-19 15:54 | 只看该作者
为什么不用PWM调光啊。

使用特权

评论回复
11
中国机器| | 2012-6-19 19:58 | 只看该作者
所以我一直说仿真害死初学者呢,就是总有不怕死的人要上。
NE5532 发表于 2012-4-7 22:32


谁拿仿真当真,谁就上当了

使用特权

评论回复
12
中国机器| | 2012-6-19 20:01 | 只看该作者
这个电路LED也能调光,问题出在drive
void drive(void) {
  unsigned int a;
  a=Brightness;
  LED=0;
  delay(a);
  a=~a;
  LED=1;
  delay(a);
  a=~a;
}
不能调光是因为a是int,而Brightness是uchar,所以~a后总 ...
t.jm 发表于 2012-2-7 13:57


:victory: 好犀利的眼神,果然是高手啊!

使用特权

评论回复
13
wukunshan| | 2012-6-20 10:21 | 只看该作者
本人也是非常反感仿真。一看到仿真电路或程序就闪!

使用特权

评论回复
14
t.jm| | 2012-6-20 10:56 | 只看该作者
仿真是死的,人是活的,LZ用了个技巧你们没注意到,LZ用万用表去测LED的电压,
用万用表的电压去反应LED的亮度/亮度变化绝对是可行的。

使用特权

评论回复
15
q331513266| | 2012-6-20 13:39 | 只看该作者
仿真有这么恐怖么;P

使用特权

评论回复
16
lcq07| | 2012-6-21 17:04 | 只看该作者
14# t.jm
测平均还差不多

使用特权

评论回复
17
www.feedlan.com| | 2012-6-21 17:11 | 只看该作者
额,高手就是高手,牛

使用特权

评论回复
18
望断云山| | 2012-6-22 09:48 | 只看该作者
仿真是死的,人是活的,LZ用了个技巧你们没注意到,LZ用万用表去测LED的电压,
用万用表的电压去反应LED的亮度/亮度变化绝对是可行的。
t.jm 发表于 2012-6-20 10:56


个人觉得测led限流电阻的电压更好

使用特权

评论回复
19
t.jm| | 2012-6-22 09:57 | 只看该作者
18# 望断云山
是这样,电阻的电压除以电阻就是电流,用电流反应LED亮度是非常恰当的。

使用特权

评论回复
20
中国机器| | 2012-6-23 13:30 | 只看该作者
仿真是死的,人是活的,LZ用了个技巧你们没注意到,LZ用万用表去测LED的电压,
用万用表的电压去反应LED的亮度/亮度变化绝对是可行的。
t.jm 发表于 2012-6-20 10:56


电压表并联到了LED的两端,呵呵;改到电阻的两端测电压,或者干脆串联个电流表

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

208

帖子

1

粉丝