久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2755|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频精品区 | 亚洲天堂一区 | 日本午夜在线视频 | 欧美综合一区 | 在线观看深夜视频 | 婷婷久久综合 | 中文字幕成人av | www.国产精品 | 国产91丝袜在线18 | 请别相信他免费喜剧电影在线观看 | 精品国产一区二区三区久久 | 免费的色网站 | 国产69久久精品成人看动漫 | 日韩欧美国产不卡 | 日韩久久久久久 | 色资源在线 | 一区二区三区四区在线 | 久久久久精 | 91av在线电影| 日日爱夜夜操 | 亚洲精品乱码久久久久久久久久 | 精品一区二区三区四区在线 | 91麻豆精品国产91久久久更新资源速度超快 | 自拍偷拍亚洲一区 | 欧美中文一区 | 免费精品视频 | 色视频在线播放 | 国产精品视频二区三区 | 一区二区三区四区在线视频 | 精品美女视频在线观看免费软件 | 成人黄色a | 亚洲欧美日本国产 | 国产一区二区电影 | 亚洲精品一区中文字幕乱码 | 亚洲成人午夜电影 | 国产成人福利视频在线观看 | 中文字幕精| 成年人在线 | 国产电影一区 | 日韩精品一区二区在线 | 日本二区|