找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2309|回复: 18
打印 上一主题 下一主题
收起左侧

单片机LED闪烁滚动控制程序有问题

[复制链接]
跳转到指定楼层
楼主
ID:656213 发表于 2020-12-9 23:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;
                }         
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:712493 发表于 2020-12-9 23:46 来自手机 | 只看该作者
~a|b   a取反是整个字节,你是要单一位取反吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:656213 发表于 2020-12-9 23:57 | 只看该作者
fj51hei 发表于 2020-12-9 23:46
~a|b   a取反是整个字节,你是要单一位取反吧

是取反整个字节
回复

使用道具 举报

地板
ID:517466 发表于 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;        
                    }
                }
回复

使用道具 举报

5#
ID:213173 发表于 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);
                }         
        }
}
回复

使用道具 举报

6#
ID:656213 发表于 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的值便会进行一次位取反,那不就等于控制了灯的亮灭吗? 当然,这只我的理解,目前程序不正常,肯定是有问题, 你增加标志位变更的这段,我在理解一下。
回复

使用道具 举报

7#
ID:140489 发表于 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;
     }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20

查看全部评分

回复

使用道具 举报

8#
ID:844772 发表于 2020-12-10 15:05 | 只看该作者
其实用  a=_cror_(a,1); b=_cror_(b,1);也行比用数组好,但每循环八次,a,b要重新赋值。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:656213 发表于 2020-12-10 16:30 | 只看该作者
glinfei 发表于 2020-12-10 15:05
其实用  a=_cror_(a,1); b=_cror_(b,1);也行比用数组好,但每循环八次,a,b要重新赋值。

是呀,我感觉用移位循环 挺简洁的,但功能确实没实现出来,不过我认为a,b没有必要运行8次后重新赋值吧
回复

使用道具 举报

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

有必要啊,移位是用0替补的。如1000右移移位是0100。
回复

使用道具 举报

11#
ID:712493 发表于 2020-12-11 11:57 | 只看该作者
其实原程序的思路是不错的  只是语句问题 原先的思路是一字节做移位实现滚动,一字节用取反方式闪烁然后合并输出对?确实挺简洁 改改应该能用。
回复

使用道具 举报

12#
ID:712493 发表于 2020-12-11 12:00 | 只看该作者

取反整个字节  80 那跟7F不是一样?然后两个再或  那结果不还是7F  怎么闪烁?我以为你自己思路清楚了?
回复

使用道具 举报

13#
ID:656213 发表于 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;
        }         
        }
}

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

14#
ID:656213 发表于 2020-12-14 23:44 | 只看该作者
wulin 发表于 2020-12-10 10:41
#include
#include
#define uchar unsigned char

大师这个思路很好呀,测试了,可以实现功能,谢谢指点。
回复

使用道具 举报

15#
ID:656213 发表于 2020-12-14 23:46 | 只看该作者
suncat0504 发表于 2020-12-10 10:06
你没加闪烁的处理代码啊。
定义一个标志变量
uchar fllash=0;

嗯,看出问题了,就是没有闪烁的处理,修改好了,谢谢指点!
回复

使用道具 举报

16#
ID:656213 发表于 2020-12-14 23:51 | 只看该作者
lids 发表于 2020-12-10 11:55
这样写看看,刚测试通过的
#include
#include

测试了,大师的程序也可以实现功能,谢谢指点!
回复

使用道具 举报

17#
ID:140489 发表于 2020-12-15 08:24 | 只看该作者
jiahz2019 发表于 2020-12-14 23:35
经过几天的思考,终于开窍了,成功了,哈哈

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

楼主,a的初值不一定要a=0x80,只要赋值为全0,或者全1,都可以的
回复

使用道具 举报

18#
ID:656213 发表于 2020-12-15 08:45 | 只看该作者
lids 发表于 2020-12-15 08:24
楼主,a的初值不一定要a=0x80,只要赋值为全0,或者全1,都可以的

嗯,好像也是
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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