打印

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

[复制链接]
2931|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mimi2011|  楼主 | 2011-5-26 14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mimi2011 于 2011-5-26 14:23 编辑

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

在定时器中已经有设定变量one_minute++;  怎么在主程序中来实现以上功能..谢谢..

相关帖子

沙发
ayb_ice| | 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)
{
        ...
}

使用特权

评论回复
板凳
mimi2011|  楼主 | 2011-5-26 14:32 | 只看该作者
2# ayb_ice

楼上这位大哥..有点看不懂..能稍稍解释下?(抱拳)

使用特权

评论回复
地板
ayb_ice| | 2011-5-26 15:09 | 只看该作者
这是一个简单的状态机+时间片
程序有点错误,忘了调用延时程序,前面修正

使用特权

评论回复
5
xiaotann| | 2011-5-26 15:51 | 只看该作者
灭b分钟

使用特权

评论回复
6
joyme| | 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表示重新开始点灯流程

使用特权

评论回复
7
joyme| | 2011-5-26 15:55 | 只看该作者
哦,程序里的a,b应该是high_a,low_b,手误,呵呵

使用特权

评论回复
8
joyme| | 2011-5-26 15:58 | 只看该作者
minute  为 one_minute
这个回复框编辑程序比较麻烦,呵呵,不能用TAB

使用特权

评论回复
9
Light_David| | 2011-5-26 18:07 | 只看该作者
2楼的方式比较习惯..

使用特权

评论回复
10
LXingJian| | 2011-5-27 10:05 | 只看该作者
理解!

使用特权

评论回复
11
HORSE7812| | 2011-5-28 14:57 | 只看该作者
学习了

使用特权

评论回复
12
yyx9081| | 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--);       
}

使用特权

评论回复
13
枫虞502| | 2011-5-30 21:00 | 只看该作者
牛叉

使用特权

评论回复
14
joyme| | 2011-5-31 09:18 | 只看该作者
LZ要求间隔时间是变化的,不是固定的两个值,所以写成函数调用的方式比较灵活

使用特权

评论回复
15
654245467| | 2011-5-31 15:49 | 只看该作者
12L的比较清晰,

使用特权

评论回复
16
yinyouyu| | 2011-6-3 16:01 | 只看该作者
學習了~

使用特权

评论回复
17
Light_David| | 2011-6-3 21:36 | 只看该作者
12L的比较业余

使用特权

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

本版积分规则

0

主题

49

帖子

1

粉丝