打印

帮忙分析一下这个C程序

[复制链接]
2383|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kakasha|  楼主 | 2011-4-14 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目要求:1357个灯半亮(亮度是全亮时候的一半),其余的全亮。

程序测试正常,但我始终不太明白怎么回事,希望解惑。
1)程序:
# include <reg51.h>
#define uchar unsigned char
# define led P1     //led接在P1
# define Ton 40        //基准脉宽0.04ms
uchar LEDflag = 0;  //全局变量,最大255,保存T0中断次数

void init();
void led_on();
void main()
{
   init();
while(1)
{

   led_on();

}
}
void init()    //定时器初始化
{
TMOD = 0x02;    //T0 方式2,8位自动载入
TH0 =  256 - Ton;   //T0初始值
TL0 =  256 - Ton;   //重载值
TR0 = 1;     //启动T0
ET0 = 1;     //T0,T1中断
  EA = 1;     //全局中断允许
}

void time0_int() interrupt 1 using 3  //T0中断函数,中断1,使用工作组3
{
LEDflag++;      //修改LEDflag
}

void led_on()
{

if(LEDflag == 0)  // 点亮8个灯
{
led = 0x00;
}
if(LEDflag == 12)  // 熄灭1,3,5,7
{
led = 0x55;
    }
}

相关帖子

沙发
JayGong| | 2011-4-14 17:39 | 只看该作者
脉宽调制(PWM)原理!

使用特权

评论回复
板凳
joyme| | 2011-4-14 18:17 | 只看该作者
程序没有写完?调节占空比可以调节加在LED上的平均电压从而调节LED的亮度
按你现在的程序,LED1,3,5,7亮12*0.04ms(如果定时器对的话),灭(255-12)*0.04ms,这种占空比LED亮度应该很低,而不是一半。你需要调节LEDflag的终止值来得到一半的亮度,如占空比选50%,则需要加一句if(LEDflag >= 24)LEDflag = 0;

使用特权

评论回复
地板
ljm810010| | 2011-4-14 22:44 | 只看该作者
3# joyme
如果你有亲自做过实验,你就会发现50%的占空比驱动LED,亮度比100%占空比时仅少一点点。再试试5%的点空比,就会发现亮度并不是很暗,而是一半亮度左右。

使用特权

评论回复
5
joyme| | 2011-4-14 22:54 | 只看该作者
3# joyme
如果你有亲自做过实验,你就会发现50%的占空比驱动LED,亮度比100%占空比时仅少一点点。再试试5%的点空比,就会发现亮度并不是很暗,而是一半亮度左右。

我也没有说要LZ调到50%,只是解释这个方法,至于调到多少占空比合适,确实需要实际测试

使用特权

评论回复
6
ayb_ice| | 2011-4-15 08:31 | 只看该作者
程序的占空比根本不是50%
而是12/256

使用特权

评论回复
7
木字四点水| | 2011-4-15 08:44 | 只看该作者
12/256

使用特权

评论回复
8
老鱼探戈| | 2011-4-15 11:06 | 只看该作者
3# joyme
如果你有亲自做过实验,你就会发现50%的占空比驱动LED,亮度比100%占空比时仅少一点点。再试试5%的点空比,就会发现亮度并不是很暗,而是一半亮度左右。

我也没有说要LZ调到50%,只是解释这个方法,至于 ...
joyme 发表于 2011-4-14 22:54

LED的亮度不但要考虑程序输出的占空比,还要考虑LED的压降,至于实际亮度,可以用仪器测试。
普通LED是这样的,但是如果是用三色灯做彩灯就是另一会事了。

使用特权

评论回复
9
mcu5i51| | 2011-4-15 13:42 | 只看该作者
好像人的眼睛对亮度感觉是对数的,需要考虑的太多了,或者只是学习一种方法就好

使用特权

评论回复
10
云的追寻| | 2011-4-15 17:15 | 只看该作者
T0中断应该错了。

使用特权

评论回复
11
ayb_ice| | 2011-4-15 17:21 | 只看该作者
void time0_int() interrupt 1 using 3  //T0中断函数,中断1,使用工作组3
{
LEDflag++;      //修改LEDflag
}

void led_on()
{

if(LEDflag == 0)  // 点亮8个灯
{
led = 0x00;
}
if(LEDflag == 12)  // 熄灭1,3,5,7灯
{
led = 0x55;
    }
}

以上程序基本是垃圾程序,有严重的逻辑BUG

使用特权

评论回复
12
1314wankai| | 2011-4-15 21:35 | 只看该作者
0<=led_flag<12    1,2,3,....7,8全亮

12<=led_flag<=256,    1,3,5,7来,2,4,6,8亮

使用特权

评论回复
13
1314wankai| | 2011-4-15 21:38 | 只看该作者
void time0_int() interrupt 1 using 3  //T0中断函数,中断1,使用工作组3
{
LEDflag++;      //修改LEDflag
   if(led_flag==24)
     led_flag=0;
}

使用特权

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

本版积分规则

0

主题

6

帖子

1

粉丝