标题: 单片机LED闪烁滚动控制程序有问题 [打印本页]

作者: jiahz2019    时间: 2020-12-9 23:24
标题: 单片机LED闪烁滚动控制程序有问题
本帖最后由 jiahz2019 于 2020-12-10 00:01 编辑

我的程序是要实现8个LED灯,单个LED闪烁几次后再流水到下一个, 目前的程序 只有流水,没有闪烁功能。求大师们指点, 谢谢。

/****************************************************************************
          LED滚动闪烁控制           说明:当前LED闪烁几次后灭,下一个LED再闪烁,共8个LED  
*****************************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uint a,b;                                                               
uchar m,n;                                                                       //计时时间控制

void Timer0() interrupt 1                                                       //T0定时器
{
        m++;
        n++;
        TH0=0x3c;
        TL0=0xb0;                                                                                   //设定50ms时间
}
                                       
void T0_init(void)                                                                           //T0初始化
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        EA=1;
        ET0=1;
        TR0=1;
}

void main(void)
{
        T0_init();
        a=0x80;                                       //10000000
        b=0x7f;                                       //01111111
        P1=b;
        while(1)
        {
                if(m==10)                                    //闪烁时间控制
                {
                        P1=~a|b;                             //取反后位或
                        m=0;        
                }
                if(n==100)                                    //流水时间控制
                {
                        a=_cror_(a,1);
                        b=_cror_(b,1);
                        n=0;
                }         
        }
}


作者: fj51hei    时间: 2020-12-9 23:46
~a|b   a取反是整个字节,你是要单一位取反吧
作者: jiahz2019    时间: 2020-12-9 23:57
fj51hei 发表于 2020-12-9 23:46
~a|b   a取反是整个字节,你是要单一位取反吧

是取反整个字节
作者: suncat0504    时间: 2020-12-10 10:06
你没加闪烁的处理代码啊。
定义一个标志变量
uchar fllash=0;

                if(m==5)                                    //闪烁时间控制
                {
                    flash^=1;
                    if (flash==0) {
                        P1=~a|b;                             // 亮
                            m=0;        
                    } else {
                        P1=~a|0xff;                          // 全灭
                              m=0;        
                    }
                }

作者: wulin    时间: 2020-12-10 10:41
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar a;
uchar n;   //计时时间控制
bit flag=1;

void Timer0() interrupt 1 //T0定时器
{
        TH0=0x3c;
        TL0=0xb0;//设定50ms时间
        n++;
}

void T0_init(void)//T0初始化
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        EA=1;
        ET0=1;
        TR0=1;
}

void main(void)
{
        T0_init();
        a=0x7f;
        P1=a;
        while(1)
        {
                if(n%10==0) //闪烁时间控制
                {
                        flag=~flag;  //取反
                        if(flag)P1=a;
                        else P1=0xff;
                }
                if(n>=100)//流水时间控制
                {
                        n=0;
                        a=_cror_(a,1);
                }         
        }
}

作者: jiahz2019    时间: 2020-12-10 11:46
suncat0504 发表于 2020-12-10 10:06
你没加闪烁的处理代码啊。
定义一个标志变量
uchar fllash=0;

  if(m==10)                                    //闪烁时间控制
                {
                        P1=~a|b;                             //取反后位或
                        m=0;        
                }

我认为我这段是可以实现闪烁控制的呀, 只有时间到m==10一次,a的值便会进行一次位取反,那不就等于控制了灯的亮灭吗? 当然,这只我的理解,目前程序不正常,肯定是有问题, 你增加标志位变更的这段,我在理解一下。

作者: lids    时间: 2020-12-10 11:55
这样写看看,刚测试通过的
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uint a,b;                                                               
uchar m,n;                                                                       //计时时间控制
uchar code tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void Timer0() interrupt 1                                                       //T0定时器
{
        m++;
//        n++;
        TH0=0x3c;
        TL0=0xb0;                                                                                   //设定50ms时间
}
                                       
void T0_init(void)                                                                           //T0初始化
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        EA=1;
        ET0=1;
        TR0=1;
}

void main(void)
{                uchar s;
        T0_init();
//        a=0x80;                                       //10000000
        b=0x7f;                                       //01111111
        P1=b;
        while(1)
        {
                if(m==40) //流水时间控制
                {
                    m=0;
                                        s++;
                                        if(s==8)
                                        s=0;
                                       
                }

                                if(m%5 == 0)   //闪烁时间控制
                                b= tab[s];
                                else  b=0xff;
                                P1=b;
     }
}
作者: glinfei    时间: 2020-12-10 15:05
其实用  a=_cror_(a,1); b=_cror_(b,1);也行比用数组好,但每循环八次,a,b要重新赋值。
作者: jiahz2019    时间: 2020-12-10 16:30
glinfei 发表于 2020-12-10 15:05
其实用  a=_cror_(a,1); b=_cror_(b,1);也行比用数组好,但每循环八次,a,b要重新赋值。

是呀,我感觉用移位循环 挺简洁的,但功能确实没实现出来,不过我认为a,b没有必要运行8次后重新赋值吧
作者: glinfei    时间: 2020-12-10 17:18
jiahz2019 发表于 2020-12-10 16:30
是呀,我感觉用移位循环 挺简洁的,但功能确实没实现出来,不过我认为a,b没有必要运行8次后重新赋值吧

有必要啊,移位是用0替补的。如1000右移移位是0100。
作者: fj51hei    时间: 2020-12-11 11:57
其实原程序的思路是不错的  只是语句问题 原先的思路是一字节做移位实现滚动,一字节用取反方式闪烁然后合并输出对?确实挺简洁 改改应该能用。
作者: fj51hei    时间: 2020-12-11 12:00
jiahz2019 发表于 2020-12-9 23:57
是取反整个字节

取反整个字节  80 那跟7F不是一样?然后两个再或  那结果不还是7F  怎么闪烁?我以为你自己思路清楚了?
作者: jiahz2019    时间: 2020-12-14 23:35
经过几天的思考,终于开窍了,成功了,哈哈

/****************************************************************************
          LED滚动闪烁控制           说明:当前LED闪烁几次后灭,下一个LED再闪烁,共8个LED  
*****************************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uint a,b;                                                               
uchar m,n;                                                                       //计时时间控制

void Timer0() interrupt 1                                                       //T0定时器
{
        m++;
        n++;
        TH0=0x3c;
        TL0=0xb0;                                                                                   //设定50ms时间
}
                                       
void T0_init(void)                                                                           //T0初始化
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        EA=1;
        ET0=1;
        TR0=1;
}

void main(void)
{
        T0_init();
        a=0x80;                                       //10000000
        b=0x7f;                                       //01111111
        P1=b;
        while(1)
        {
                if(m==10)                                                                  
                {
                        a=~a;
                        P1=a|b;                             //取反后位或
                        m=0;       
                }
                if(n==100)
                {
                        a=_cror_(a,1);
                        b=_cror_(b,1);                                                 
                        n=0;
        }         
        }
}
作者: jiahz2019    时间: 2020-12-14 23:44
wulin 发表于 2020-12-10 10:41
#include
#include
#define uchar unsigned char

大师这个思路很好呀,测试了,可以实现功能,谢谢指点。
作者: jiahz2019    时间: 2020-12-14 23:46
suncat0504 发表于 2020-12-10 10:06
你没加闪烁的处理代码啊。
定义一个标志变量
uchar fllash=0;

嗯,看出问题了,就是没有闪烁的处理,修改好了,谢谢指点!
作者: jiahz2019    时间: 2020-12-14 23:51
lids 发表于 2020-12-10 11:55
这样写看看,刚测试通过的
#include
#include

测试了,大师的程序也可以实现功能,谢谢指点!
作者: lids    时间: 2020-12-15 08:24
jiahz2019 发表于 2020-12-14 23:35
经过几天的思考,终于开窍了,成功了,哈哈

/******************************************************* ...

楼主,a的初值不一定要a=0x80,只要赋值为全0,或者全1,都可以的
作者: jiahz2019    时间: 2020-12-15 08:45
lids 发表于 2020-12-15 08:24
楼主,a的初值不一定要a=0x80,只要赋值为全0,或者全1,都可以的

嗯,好像也是




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1