1. 程式人生 > >使用51單片機點亮我們的點陣燈

使用51單片機點亮我們的點陣燈

是我 寫代碼 lsd 原理圖 4行 原理 操作 發現 驗證

  通過前面我們都知道點亮我們的不管是點陣,數碼管,還是LED燈,不僅要熟悉我們的代碼還要會看我們的原理圖和真值表,所以我們如果真的要寫代碼倒是其次的,首先我們得學會看我們的原理圖和真值表,但是認識那個我們可以在網上找教程的,所以啊我這裏就不去重訴別人的話了。那麽我們今天要討論什麽問題勒!?我們今天講一下點陣吧,點陣說實話對於單片機來說雖然並不是最重要的,但是點陣卻是我們單片機中花樣最多的之一。可能說到這麽有人會說了,學了單片機我們有什麽用呢,那麽我們可以留意一下我們身邊的一些物品,比如我們常在街上可以看見一些商店利用那些LED燈做出的花樣,什麽閃爍啊,各種圖形變化啊,其實和我們的點陣原理都很像,不過他們那些控制的位更多,而我們51 單片機操作的位少一些,只有八位而已。但是我們其實把他的原理弄懂了我們學其他的或者操作更多的位也是很容易的。

  我們其實剛開始我們學習51單片機上面的點陣可能會疑惑,我們照著老師的代碼敲我們可以點亮他說的燈,但是我們通過原理圖來點亮我們的燈卻不是那麽容易,為什麽呢?或許我們細心的同學會發現我們要點亮的燈和我們的代碼所寫不一樣,不一樣在什麽地方呢?每一排的位操作挺好像是相反的。那麽前面的疑惑我們就解決了,我們要操作的點陣和我們的代碼點亮是相反的!在我們的51單片機中我們0稱做低電平,而1被叫做高電平,低電平是將燈點亮,高電平不亮。我們正對單片機如果我們要點陣第一個燈,那麽我們我們要寫的代碼是P0=0x01;而轉換成二進制就是0000 0001(這裏我們可以在網上去看2進制和16進制相互轉換的一些資料)我們可以知道的是他和我們設想的有些差別,比如我們就是要點亮第一排第一個燈,輸入了P0=0x01我們卻看見和我們的二進制數不符合,就像我們的燈一樣每個燈就是我們的一個位,每個燈有兩種狀態,一個是1,另一個就是0。實際上我們就可以得出結論操作我們的燈就是操作我們的二進制。那麽可以看一下我們的代碼,來驗證我們的猜想:

/*點亮我們的點陣第一排第一個燈*/

#include<reg52.h>

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延時函數

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main()

{

P0=0x01;

dz(0,0,0,1);

delay(300);//延時函數的調用

}

其實我們的點陣的燈就是操作我們的一個八位數的位,每個燈就是一位,因為我們點陣就是一排八個燈(這個一定得記住)那麽我們知道了點亮我們的點陣第一排第一個,我們可不可以點亮我們的點陣第一排呢?!代碼如下:

/*點亮我們的點陣第一排燈*/

#include<reg52.h>

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延時函數

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main()

{

P0=0x00;

dz(0,0,0,1);

delay(300);//延時函數的調用

}

其實代碼都差不多,就是我們怎麽用了,那麽思考我們想多點幾排呢?比如我們就要“同時”點亮兩排三排或者更多呢?記住我們 一定得看真值表!

代碼如下:

/*點亮我們的點陣第一排第一個燈*/

#include<reg52.h>

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延時函數

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main()

{

//第一行

P0=0x00;

dz(0,0,0,1);

delay(300);//延時函數的調用

//第二行

dz(0,0,0,1);

P0=0x00;

delay(300);

}

我們知道了一些點陣的原理那麽我們就來嘗試點亮我們全部數碼管唄:

#include<reg52.h>

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延時函數

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main(){

while(1){
//第一行
LSD(0,0,0,0);
P0=0x00;
delay(300);
//第二行
LSD(0,0,0,1);
P0=0x00;
delay(100);
//第三行
LSD(0,0,1,0);
P0=0x00;
delay(100);
//第4行
LSD(0,0,1,1);
P0=0x00;
delay(100);

//第5行
LSD(0,1,0,0);
P0=0x00;
delay(100);
//第6行
LSD(0,1,0,1);
P0=0x00;
delay(100);
//第7行
LSD(0,1,1,0);
P0=0x00;
delay(100);

//第8行
LSD(0,1,1,1);
P0=0x00;
delay(100);
}

}

大家可以自己將代碼復制在自己的程序中看一下代碼和我說的效果有什麽差別沒有。

其實我們有沒有想過我們該如何將我們的點陣對角線點亮一行呢?

#include<reg52.h>

sbit ADDR0=P0^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

//延時函數

delay(unsigned int x)

{

while(x--);

}

//

dz(unsigned int d,c,b,a)

{

ENLED=1;

ADDR3=d;

ADDR2=c;

ADDR1=b;

ADDR0=a;

}

void main()

{

while(1)

{

  //第一行第一顆
dz(0,0,0);
P0=0xFE;
delay(100);

//第2行第2顆
dz(0,0,1);
P0=0xFD;
delay(100);

//第3行第3顆
dz(0,1,0);
P0=0xFB;
delay(100);

//第4行第4
dz(0,1,1);
P0=0xF7;
delay(100);

//第5行第 5
dz(1,0,0);
P0=0xEF;
delay(100);

//第6行第 6
dz(1,0,1);
P0=0xDF;
delay(100);

//第7行第7
dz(1,1,0);
P0=0xBF;
delay(100);

//第8行第8
dz(1,1,1);
P0=0x7F;
delay(100);

}

}

使用51單片機點亮我們的點陣燈