找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 11557|回復: 31
收起左側(cè)

為什么單片機流水燈這樣寫,只能亮4個LED。我要亮8個燈

  [復制鏈接]
ID:427818 發(fā)表于 2018-11-16 16:55 | 顯示全部樓層 |閱讀模式
        while(1)
        {
           led = 0x01;
           delay(50000);
           led = 0x02;
           delay(50000);
           led = 0x03;
           delay(50000);
           led = 0x04;
           delay(50000);
           led = 0x11;
           delay(50000);
           led = 0x12;
           delay(50000);
           led = 0x13;
           delay(50000);
           led = 0x14;
           delay(50000);
回復

使用道具 舉報

ID:155507 發(fā)表于 2018-11-16 17:07 | 顯示全部樓層
給你改了一下試試。

        while(1)
        {
           led = 0x01;
           delay(50000);
           led = 0x02;
           delay(50000);
           led = 0x04;
           delay(50000);
           led = 0x08;
           delay(50000);
           led = 0x10;
           delay(50000);
           led = 0x20;
           delay(50000);
           led = 0x40;
           delay(50000);
           led = 0x80;
           delay(50000);



回復

使用道具 舉報

ID:427831 發(fā)表于 2018-11-16 17:14 | 顯示全部樓層
led是8位IO口嗎?沒太看懂你的代碼
回復

使用道具 舉報

ID:295874 發(fā)表于 2018-11-16 17:22 | 顯示全部樓層
你目前的位操作就只操作到了四個IO口,所以。。。。。。
回復

使用道具 舉報

ID:379730 發(fā)表于 2018-11-16 17:29 | 顯示全部樓層
本帖最后由 MMU_FS 于 2018-11-16 17:37 編輯

這樣是不對的,要按十六進制來,假設(shè)led映射的P0,應該這樣寫uint8_t temp = 0x01 , i = 0;
led = temp;

while(1)
{      temp = 0x01;
    for(i = 0 ; i < 8 ;  i ++)
    {
        led =(temp << 1) | temp;
        delay(50000);
    }
    temp = 0x7F;
    for(i = 0 ; i < 8 ;  i ++)
    {
l        ed =(temp >> 1) & temp;
        delay(50000);
    }

}
         


回復

使用道具 舉報

ID:427839 發(fā)表于 2018-11-16 17:42 | 顯示全部樓層
你的數(shù)值都不對,一個是8421,8421.
回復

使用道具 舉報

ID:423511 發(fā)表于 2018-11-16 17:49 | 顯示全部樓層
把led后邊的數(shù)改為:0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80。試一下。
回復

使用道具 舉報

ID:389298 發(fā)表于 2018-11-16 18:10 | 顯示全部樓層
有沒有圖
回復

使用道具 舉報

ID:63351 發(fā)表于 2018-11-16 18:48 | 顯示全部樓層
你是要做流水燈呢還是,讓8個常亮呢?  我默認你的led是低電平有效的, 如果是8個燈常亮,led = 0x00;  如果要依次點亮8個燈,你可以采用循環(huán)語句 led=0xff ;for(i=0;i<8; i++){led &= (0xfe<<i);  delay(50000); }
回復

使用道具 舉報

ID:427818 發(fā)表于 2018-11-16 22:10 | 顯示全部樓層
我就是想用最原始的方法試試,才開始學不久。各位大神的我都試試再說哈
回復

使用道具 舉報

ID:427818 發(fā)表于 2018-11-16 22:17 | 顯示全部樓層
angmall 發(fā)表于 2018-11-16 17:07
給你改了一下試試。

        while(1)

大神,我的為什么程序出現(xiàn)了什么問題呢?
回復

使用道具 舉報

ID:427818 發(fā)表于 2018-11-16 22:18 | 顯示全部樓層
kr123crg 發(fā)表于 2018-11-16 17:14
led是8位IO口嗎?沒太看懂你的代碼

是8位的IO
回復

使用道具 舉報

ID:427818 發(fā)表于 2018-11-16 22:18 | 顯示全部樓層
liyongan_1985 發(fā)表于 2018-11-16 17:22
你目前的位操作就只操作到了四個IO口,所以。。。。。。

的確是這樣,為什么呢?出錯在那呢?
回復

使用道具 舉報

ID:410399 發(fā)表于 2018-11-17 08:32 | 顯示全部樓層
0x01  ->  0000 0001
0x02  ->  0000 0010
0x03  ->  0000 0011
0x04  ->  0000 0100
0x11  ->  0000 1011
0x12  ->  0000 1100
0x13  ->  0000 1101
0x14  ->  0000 1110
你的是低電平有效還是高電平有效,怎么流水燈法,沒明白。
你程序?qū)?進制是這樣,對應輸出,最多就控制了4位LED
回復

使用道具 舉報

ID:427818 發(fā)表于 2018-11-17 16:14 | 顯示全部樓層
mosqu 發(fā)表于 2018-11-17 08:32
0x01  ->  0000 0001
0x02  ->  0000 0010
0x03  ->  0000 0011

噢噢,明白了
回復

使用道具 舉報

ID:392042 發(fā)表于 2018-11-17 17:43 | 顯示全部樓層
這個和iIO的定義有關(guān)系
回復

使用道具 舉報

ID:428347 發(fā)表于 2018-11-17 19:05 | 顯示全部樓層
十六進制有abcdef的才能控制到高4位,肯定不能控制8個
回復

使用道具 舉報

ID:300347 發(fā)表于 2018-11-17 23:08 | 顯示全部樓層
你可以使用51里的移位函數(shù),只要讓一個IO口的燈亮,接下來對這個IO口進行位移
回復

使用道具 舉報

ID:428719 發(fā)表于 2018-11-18 15:44 | 顯示全部樓層
改成0xff試試
回復

使用道具 舉報

ID:428557 發(fā)表于 2018-11-18 20:24 | 顯示全部樓層
如果樓主的LED燈共陰的話
回復

使用道具 舉報

ID:428557 發(fā)表于 2018-11-18 20:27 | 顯示全部樓層
如果樓主LED共陰的話while(1)         {            led = 0x01;            delay(50000);            led = 0x02;            delay(50000);            led = 0x04;            delay(50000);            led = 0x08;            delay(50000);            led = 0x10;            delay(50000);            led = 0x20;            delay(50000);            led = 0x40;            delay(50000);            led = 0x80;            delay(50000);如果共陽的話while(1)         {            led = 0x01;            delay(50000);            led = 0x02;            delay(50000);            led = 0x04;            delay(50000);            led = 0x08;            delay(50000);            led = 0xfe;            delay(50000);            led = 0xfd;            delay(50000);            led = 0xfb;            delay(50000);            led = 0xf7;            delay(50000);
回復

使用道具 舉報

ID:422467 發(fā)表于 2018-11-19 16:15 | 顯示全部樓層
8421,8421
回復

使用道具 舉報

ID:407083 發(fā)表于 2018-11-19 18:38 | 顯示全部樓層
你LED賦值不對,當然不能亮8個啊
回復

使用道具 舉報

ID:429435 發(fā)表于 2018-11-19 19:50 | 顯示全部樓層
#include<reg52.h> #define uint unsigned int #define uchar unsigned char uint i,j,z,; uchar a; void main(){ a=0xfe; for(z=0;z<8;z++){ P1=a; a=~a; a=a<<1; a=~a; for(i=150;i>0;i--) for(j=110;j>0;j--);  } }這樣也可以
回復

使用道具 舉報

ID:255398 發(fā)表于 2018-11-20 09:28 | 顯示全部樓層
你的電路圖?是高電平,還是 低電平點亮?把你的賦值寫成16進制,就明白為何只亮四個燈了。
回復

使用道具 舉報

ID:255398 發(fā)表于 2018-11-20 09:49 | 顯示全部樓層
先弄清楚16進制與二進制的關(guān)系,你知道只亮四個燈了
回復

使用道具 舉報

ID:168851 發(fā)表于 2018-11-20 10:55 | 顯示全部樓層
你的程序只是動作了4個IO口,具體的可以看看這個哈,你需要將十六進制轉(zhuǎn)換為二進制,轉(zhuǎn)換后如下(8421轉(zhuǎn)換哈)
0x01 --> 0000 0001 --->只亮最后1個燈珠
0x02 --> 0000 0010 --->只亮倒數(shù)第2個燈珠
0x03 --> 0000 0011 --->只亮最后2個燈珠
0x04 --> 0000 0100 --->只亮倒數(shù)第3個燈珠
0x11 --> 0001 0001 --->只亮第4個和第8個燈珠
0x12 --> 0001 0010 --->只亮第4個和第7個燈珠
0x13 --> 0001 0011 --->只亮第4個、第7個和第8個燈珠
0x14 --> 0001 0100 --->只亮第4個和第6個燈珠
你仔細觀察哈,其中1就是你變換的位,所以你整個過程總共就只變換了4位,即4個LED燈點亮(主要是第4顆、第6顆、第7顆、第8顆,這幾顆燈珠),所以你應該是高電平點亮LED燈珠。
最后給你個建議,可以看看郭天祥的單片機視頻教程,講得比較好,聽了就懂了哈
回復

使用道具 舉報

ID:429759 發(fā)表于 2018-11-20 11:07 | 顯示全部樓層
需要控制到高4位
回復

使用道具 舉報

ID:429813 發(fā)表于 2018-11-20 12:46 | 顯示全部樓層

十六進制有abcdef的才能控制到高4位,肯定不能控制8個
回復

使用道具 舉報

ID:432415 發(fā)表于 2018-11-24 16:04 | 顯示全部樓層
你這個管腳是不是定義的有問題
回復

使用道具 舉報

ID:910589 發(fā)表于 2021-4-22 22:46 | 顯示全部樓層
xqj777 發(fā)表于 2018-11-16 18:48
你是要做流水燈呢還是,讓8個常亮呢?  我默認你的led是低電平有效的, 如果是8個燈常亮,led = 0x00;  如 ...

你好,試了一下你的流水燈的程序,只有前7個LED會工作,最后一個一直不亮。還有用了幾個其他的流水燈的實驗也是這樣的情況。不知道是為什么?請問您知道嗎?求解答
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表