找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 23467|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)學(xué)習(xí)板的8?jìng)(gè)LED燈,想從中間往兩邊流水亮怎么用程序?qū)崿F(xiàn)?請(qǐng)高手幫下

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:321920 發(fā)表于 2018-5-13 12:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用一個(gè)LED變量是可實(shí)現(xiàn)流水燈的,但用兩個(gè)怎么實(shí)現(xiàn)?我用上面的方法,顯示是只亮一個(gè)燈,請(qǐng)高手指點(diǎn)

單片機(jī)源程序:
  1. #include "reg52.h"                         
  2. #include<intrins.h>                 

  3. typedef unsigned int u16;           
  4. typedef unsigned char u8;

  5. #define led1 P2    
  6. #define led2 P2   

  7. void delay(u16 i)
  8. {
  9.         while(i--);        
  10. }


  11. void main()
  12. {
  13.         u8 i;
  14.         while(1)
  15.         {
  16.          led1=0xef;
  17.                 led2=0xf7;
  18.         delay(50000);  
  19.         
  20.                
  21.                 for(i=0;i<3;i++)         
  22.                 {
  23.                          led1=_crol_(led1,1);
  24.                         led2=_cror_(led2,1);
  25.                         delay(50000);  
  26.                 }
  27.                 for(i=0;i<3;i++)         
  28.                 {
  29.                          led1=_cror_(led1,1);
  30.                         led2=_crol_(led2,1);
  31.                         delay(50000);  
  32.                 }        
  33.                         
  34. }
  35. }
復(fù)制代碼



評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
cciejs12345 + 8 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

來(lái)自 4#
ID:47286 發(fā)表于 2018-5-13 15:23 | 只看該作者
沒(méi)編譯 用記事本隨便寫(xiě)的 不保證全對(duì) 你試試看吧 如果問(wèn)題 自己想想怎么改 能改好也是進(jìn)步啊 如果沒(méi)問(wèn)題 最好也讀一下 好歹算是一種思路

#include "reg52.h"

#define unsigned char uchar
#define unsigned int uint

uchar i=0;        //定義循環(huán)變量 并賦值

uchar code a[]={0x00,0x18,0x24,0x42,0x81};        //定義循環(huán)數(shù)組
//循環(huán)數(shù)組說(shuō)明 如果led共陽(yáng) 上電后全亮 然后從中間兩個(gè)開(kāi)始滅 如果led共陰 上電后全滅 從中心兩個(gè)開(kāi)始亮
/*
0000 0000        0x00
0001 1000        0x18
0010 0100        0x24
0100 0010        0x42
1000 0001        0x81
*/
void delay(uint i)        //延時(shí)函數(shù)
{
        while(i--);        
}

void main()        //主程序
{
        while(1)        //主循環(huán)
        {
                P2=a[i];                //led端口=數(shù)組值i 初始值0 即 P2=a[0];
                delay(50000);        //延時(shí)
                i++;                        //循環(huán)變量自加
                if(i==4)                //如果 循環(huán)變量=4 即 循環(huán)完一次 a[]用到a[4]
                {
                        i=0;                        //清零 循環(huán)變量
                }
        }
}

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:307591 發(fā)表于 2018-5-13 13:56 | 只看該作者
一個(gè)IO口只能定義一次,你在前面定義了兩次沒(méi)有用。
回復(fù)

使用道具 舉報(bào)

板凳
ID:160834 發(fā)表于 2018-5-13 14:06 | 只看該作者
你上面這樣的定義
#define led1 P2    
#define led2 P2
這不是等于重復(fù)定義了嗎?
另外,一個(gè)變量就可以實(shí)現(xiàn)8位流水燈的移動(dòng),為什么要分成2個(gè)部分?
如果你真要分開(kāi),那就單獨(dú)定義每個(gè)IO口,再寫(xiě)個(gè)子程序,但是這樣不是把程序復(fù)雜化了嗎?

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:195836 發(fā)表于 2018-5-13 15:29 | 只看該作者
我認(rèn)為是你沒(méi)有搞清楚最基本的8個(gè)燈一起閃爍,還有八個(gè)燈流水(就最原始的從左往右,一次亮一個(gè)的那種)
把這兩個(gè)真正搞清楚了,也就會(huì)了吧
回復(fù)

使用道具 舉報(bào)

6#
ID:328907 發(fā)表于 2018-5-13 15:35 | 只看該作者
for 循環(huán)就行
回復(fù)

使用道具 舉報(bào)

7#
ID:321920 發(fā)表于 2018-5-13 20:10 | 只看該作者
dzbj 發(fā)表于 2018-5-13 15:23
沒(méi)編譯 用記事本隨便寫(xiě)的 不保證全對(duì) 你試試看吧 如果問(wèn)題 自己想想怎么改 能改好也是進(jìn)步啊 如果沒(méi)問(wèn)題 最 ...

感謝,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

8#
ID:321920 發(fā)表于 2018-5-13 20:15 | 只看該作者
奎爾塞拉 發(fā)表于 2018-5-13 15:29
我認(rèn)為是你沒(méi)有搞清楚最基本的8個(gè)燈一起閃爍,還有八個(gè)燈流水(就最原始的從左往右,一次亮一個(gè)的那種)
...

8?jìng)(gè)燈的流水我搞清楚了 ,我想設(shè)計(jì)一個(gè)從中間向兩邊流水,如果8?jìng)(gè)燈分別是1,2,3,4,5,6,7,8,  我的意思是  左邊的4個(gè)按。础。场。病。薄⊥瑫r(shí)右邊的4個(gè)是。担叮罚傅捻樞,也就是說(shuō),同時(shí)亮兩個(gè)的流水效果
,
回復(fù)

使用道具 舉報(bào)

9#
ID:321920 發(fā)表于 2018-5-13 20:15 | 只看該作者
8?jìng)(gè)燈的流水我搞清楚了 ,我想設(shè)計(jì)一個(gè)從中間向兩邊流水,如果8?jìng)(gè)燈分別是1,2,3,4,5,6,7,8,  我的意思是  左邊的4個(gè)按。础。场。病。薄⊥瑫r(shí)右邊的4個(gè)是 5678的順序,也就是說(shuō),同時(shí)亮兩個(gè)的流水效果 ,
回復(fù)

使用道具 舉報(bào)

10#
ID:321920 發(fā)表于 2018-5-13 20:59 | 只看該作者
dzbj 發(fā)表于 2018-5-13 15:23
沒(méi)編譯 用記事本隨便寫(xiě)的 不保證全對(duì) 你試試看吧 如果問(wèn)題 自己想想怎么改 能改好也是進(jìn)步啊 如果沒(méi)問(wèn)題 最 ...

感謝調(diào)試成功,學(xué)習(xí)了這個(gè)思路
  1. #include "reg52.h"        
  2. typedef unsigned char uchar;

  3. typedef unsigned int uint;
  4. typedef unsigned int u16;         
  5. typedef unsigned char u8;

  6. void delay(u16 i)
  7. {
  8.         while(i--);        
  9. }


  10. uchar i=0;     

  11. uchar code a[]={0x18,0x24,0x42,0x81};      
  12. /*
  13. 0000 0000        0x00
  14. 0001 1000        0x18
  15. 0010 0100        0x24
  16. 0100 0010        0x42
  17. 1000 0001        0x81
  18. */


  19. void main()      
  20. {
  21.         while(1)   
  22.         {
  23.                 P2=a[i];              
  24.                 delay(50000);      
  25.                 i++;                 
  26.                 if(i==4)              
  27.                 {
  28.                   i=0;            
  29.                 }
  30.         }
  31. }
復(fù)制代碼
[/code]
回復(fù)

使用道具 舉報(bào)

11#
ID:47286 發(fā)表于 2018-5-14 00:08 | 只看該作者
epaysh 發(fā)表于 2018-5-13 20:15
8?jìng)(gè)燈的流水我搞清楚了 ,我想設(shè)計(jì)一個(gè)從中間向兩邊流水,如果8?jìng)(gè)燈分別是1,2,3,4,5,6,7 ...

用我寫(xiě)的那種數(shù)組的方式 你想怎么亮都可以 數(shù)組的內(nèi)容實(shí)際上就是P2端口的狀態(tài) 你只要根據(jù)你需要的邏輯定義數(shù)組每位的值就可以顯示不同效果 也可以增加數(shù)組內(nèi)容和改變i值花插著來(lái) 做其它效果 反正核心就是控制端口狀態(tài) 這個(gè)思路的核心是把要改變的部分寫(xiě)在一個(gè)地方 不必為其它花樣又單獨(dú)寫(xiě)程序
回復(fù)

使用道具 舉報(bào)

12#
ID:321920 發(fā)表于 2018-5-14 05:23 來(lái)自手機(jī) | 只看該作者
dzbj 發(fā)表于 2018-5-14 00:08
用我寫(xiě)的那種數(shù)組的方式 你想怎么亮都可以 數(shù)組的內(nèi)容實(shí)際上就是P2端口的狀態(tài) 你只要根據(jù)你需要的邏輯定 ...

是的,這個(gè)思路很直觀,通用性也強(qiáng),感謝
回復(fù)

使用道具 舉報(bào)

13#
ID:329253 發(fā)表于 2018-5-14 08:20 來(lái)自手機(jī) | 只看該作者
我也學(xué)習(xí)到了
回復(fù)

使用道具 舉報(bào)

14#
ID:321920 發(fā)表于 2018-5-18 09:12 | 只看該作者
#include "reg52.h"        
typedef unsigned char uchar;

typedef unsigned int uint;
typedef unsigned int u16;         
typedef unsigned char u8;

void delay(u16 i)
{
        while(i--);        
}


uchar i=0;     

uchar code a[]={0xe7,0xdb,0xbd,0x7e};      
/*
0000 0000        0x00
0001 1000        0x18
0010 0100        0x24
0100 0010        0x42
1000 0001        0x81
*/


void main()      
{
        while(1)   
        {
                P2=a[i];              
                delay(50000);      
                i++;                 
                if(i==4)              
                {
                  i=0;            
                }
        }
}
回復(fù)

使用道具 舉報(bào)

15#
ID:328200 發(fā)表于 2018-5-18 10:02 | 只看該作者
用數(shù)組最簡(jiǎn)單,將0xe7,0xdb,0xbd,0x7f放進(jìn)去,再用for循環(huán)就可以。
回復(fù)

使用道具 舉報(bào)

16#
ID:328200 發(fā)表于 2018-5-21 08:32 | 只看該作者
hfj2011 發(fā)表于 2018-5-18 10:02
用數(shù)組最簡(jiǎn)單,將0xe7,0xdb,0xbd,0x7f放進(jìn)去,再用for循環(huán)就可以。

最后一個(gè)寫(xiě)錯(cuò)了,應(yīng)該是0x7e  ,粗心了哈。
回復(fù)

使用道具 舉報(bào)

17#
ID:921275 發(fā)表于 2021-5-14 16:12 來(lái)自手機(jī) | 只看該作者
hfj2011 發(fā)表于 2018-5-18 10:02
用數(shù)組最簡(jiǎn)單,將0xe7,0xdb,0xbd,0x7f放進(jìn)去,再用for循環(huán)就可以。

怎么用呢,我已經(jīng)用if語(yǔ)句去弄三個(gè)流水燈三個(gè)方向了,最后一個(gè)我想弄從中間向兩邊流動(dòng),弄不出來(lái)
回復(fù)

使用道具 舉報(bào)

18#
ID:921288 發(fā)表于 2021-5-14 16:42 | 只看該作者
先輸出為0,再定義一個(gè)數(shù)組{00011000,00100100,01000010,10000001},遍歷相或
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表