哪位好心人帮我优化下小程序,控制发光二极管的(本人初学)

[复制链接]
 楼主| 发表于 2011-5-26 14:08 | 显示全部楼层 |阅读模式
本帖最后由 mimi2011 于 2011-5-26 14:23 编辑

用的是51,要实现P0.0口二极管亮a分钟,灭b分钟(亮灭时间不一样的,随ab不同取值变化)如此循环下去,我自己功能是可以实现但是要设很多标志位来判断

在定时器中已经有设定变量one_minute++;  怎么在主程序中来实现以上功能..谢谢..
发表于 2011-5-26 14:21 | 显示全部楼层
本帖最后由 ayb_ice 于 2011-5-26 15:10 编辑

#define MINUTE(x)        ((x)*60.0*100.0)  // x小于10.9

uchar flag;
int time = 0;

void main(void)
{
        while(1)
        {
                switch(flag)
                {
                default:
                        flag = 0;
                case 0:
                        if(!time){
                                LED = 1;
                                time = MINUTE(2);
                                flag++;
                        }
                        break;
                case 1:
                        if(!time){
                                LED = 0;                                
                                time = MINUTE(3);
                                flag++;
                        }
                        break;
                }

                if(time) time--;

                delay_10ms();
        }
}

void delay_10ms(void)
{
        ...
}
 楼主| 发表于 2011-5-26 14:32 | 显示全部楼层
2# ayb_ice

楼上这位大哥..有点看不懂..能稍稍解释下?(抱拳)
发表于 2011-5-26 15:09 | 显示全部楼层
这是一个简单的状态机+时间片
程序有点错误,忘了调用延时程序,前面修正
发表于 2011-5-26 15:51 | 显示全部楼层
灭b分钟
发表于 2011-5-26 15:54 | 显示全部楼层
Light_LED(BYTE high_a,BYTE low_b)
{
        if(initStart || ((P0.0 == 0) && (minute >= b)))
        {
                initStart = FALSE;
                one_minute = 0;
                P0.0 = 1;                  //假设输出高点亮LED               
        }

        if((P0.0 == 1) && (minute  >= a))
        {
                 minute  = 0;
                 P0.0 = 0;
        }
}
在main循环里调用此函数,可以1min中调一次,initStart 为全局变量,初始化为TRUE,并且在a、b变化时置TRUE表示重新开始点灯流程
发表于 2011-5-26 15:55 | 显示全部楼层
哦,程序里的a,b应该是high_a,low_b,手误,呵呵
发表于 2011-5-26 15:58 | 显示全部楼层
minute  为 one_minute
这个回复框编辑程序比较麻烦,呵呵,不能用TAB
发表于 2011-5-26 18:07 | 显示全部楼层
2楼的方式比较习惯..
发表于 2011-5-27 10:05 | 显示全部楼层
理解!
发表于 2011-5-28 14:57 | 显示全部楼层
学习了
发表于 2011-5-30 18:24 | 显示全部楼层
#include<reg52.h>
#define MINUTE(x)((x)*60.0*100.0)  // x小于10.9
#define uchar unsigned char
#define uint unsigned int
uchar flag;
void delay(uint x);
int time = 0;
sbit LED=P0^0;
void main()
{
        while(1)
        {
                LED=1;
                delay(60000);
                LED=0;
                delay(60000);

        }
}
void delay(uint x)
{
        int i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);       
}
发表于 2011-5-30 21:00 | 显示全部楼层
牛叉
发表于 2011-5-31 09:18 | 显示全部楼层
LZ要求间隔时间是变化的,不是固定的两个值,所以写成函数调用的方式比较灵活
发表于 2011-5-31 15:49 | 显示全部楼层
12L的比较清晰,
发表于 2011-6-3 16:01 | 显示全部楼层
學習了~
发表于 2011-6-3 21:36 | 显示全部楼层
12L的比较业余
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

49

帖子

1

粉丝
快速回复 返回顶部 返回列表