1. 程式人生 > >利用51單片機做出一些炫彩效果

利用51單片機做出一些炫彩效果

全部 點陣 signed led 順序 接下來 ddr 1=1 深入

  今天我們來討論一下我們如何利用單片機做出一些炫彩的效果,而昨天好像是七夕節,很多人都把它當做了情人節,那麽我們來做一個浪漫的“I Love u”;今天我就把代碼寫出來,而不再是截圖掛出來。效果圖我也就拍出來了,你們如果有單片機可以自己復制代碼下來看一些效果。(其實這一次的代碼有一點跨度大了,畢竟前面我並沒有說的很深入,現在一下子又變得看不懂了,不過慢慢來,我會在以後的博客中把後邊的討論寫詳細一點)代碼如下,註釋我來寫了一部分,但是不全,我會慢慢把它補齊。

    效果大致如我以下描述:首先,LED燈慢慢的像流水燈一樣一個接一個亮起來;而後是點陣從靠近LED燈的那一排開始亮起來,就像蛇一樣遊動,第一排是從第一個亮完最後一個,從第二排接著第一排的最後一個那側開始亮(就像蛇遊動)一直到最後一排;接下來是數碼管,數碼管只有那一個點“.“亮,像流水燈一樣亮起來;前面效果都完之後所有的LED燈,點陣,數碼管都會全部亮起來;點陣就會顯示“I love u”那句話了,不過不是同時顯示,成一個先後順序。

(如果代碼和註釋中有誤,請指出,我會第一時間和你溝通並改正,謝謝)

#include <reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;

//延時函數
void delay(unsigned int t){
unsigned int i;
for(i=0;i<t;i++);
}

//左移函數
void change1(){
unsigned int j;
for(j=0;j<8;j++){
P0=~(0x01<<j);
delay(10000);
}
}
//右移函數
void change2(){
unsigned int j;
for(j=0;j<8;j++){
P0=~(0x80>>j);
delay(3000);
}
}
//LED流水燈的依次點亮
void y6(unsigned int j){
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;
if(j==1){
change1();
}else{
change2();
}
}


//點陣的點亮
void y0_5(unsigned int i){
unsigned int j;
ENLED=0;
ADDR3=0;
switch(i){
case 0: ADDR2=1; ADDR1=1; ADDR0=1; change2(); break;
case 1: ADDR2=1; ADDR1=1; ADDR0=0; change1(); break;
case 2: ADDR2=1; ADDR1=0; ADDR0=1; change2(); break;
case 3: ADDR2=1; ADDR1=0; ADDR0=0; change1(); break;
case 4: ADDR2=0; ADDR1=1; ADDR0=1; change2(); break;
case 5: ADDR2=0; ADDR1=1; ADDR0=0; change1(); break;
case 6: ADDR2=0; ADDR1=0; ADDR0=1; change2(); break;
case 7: ADDR2=0; ADDR1=0; ADDR0=0; change1(); break;
}
}

//數碼管的點亮
void y0_s(unsigned int i,unsigned int wk){
unsigned int j;
ENLED=0;
ADDR3=1;
switch(i){
case 0: ADDR2=1; ADDR1=0; ADDR0=1; break;
case 1: ADDR2=1; ADDR1=0; ADDR0=0; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=1; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=0; break;
case 4: ADDR2=0; ADDR1=0; ADDR0=1; break;
case 5: ADDR2=0; ADDR1=0; ADDR0=0; break;
}
if(wk==1){
P0=0x00;
}else{
P0=0x7f;
}
}

//數碼管的全部點亮

void alllion6(unsigned int wk){
unsigned int j;
ENLED=0;
ADDR3=1;
for(j=0;j<6;j++){
switch(j){
case 0: ADDR2=1; ADDR1=0; ADDR0=1; break;
case 1: ADDR2=1; ADDR1=0; ADDR0=0; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=1; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=0; break;
case 4: ADDR2=0; ADDR1=0; ADDR0=1; break;
case 5: ADDR2=0; ADDR1=0; ADDR0=0; break;
}
if(wk==1){
P0=0x00;
}else{
P0=0x7f;
}
delay(100);
}
}

//點陣全部點亮
void alllion8(){
unsigned int j;
ENLED=0;
ADDR3=0;
for(j=0;j<8;j++){
switch(j){
case 0: ADDR2=1; ADDR1=1; ADDR0=1; P0=0x00; break;
case 1: ADDR2=1; ADDR1=1; ADDR0=0; P0=0x00; break;
case 2: ADDR2=1; ADDR1=0; ADDR0=1; P0=0x00; break;
case 3: ADDR2=1; ADDR1=0; ADDR0=0; P0=0x00; break;
case 4: ADDR2=0; ADDR1=1; ADDR0=1; P0=0x00; break;
case 5: ADDR2=0; ADDR1=1; ADDR0=0; P0=0x00; break;
case 6: ADDR2=0; ADDR1=0; ADDR0=1; P0=0x00; break;
case 7: ADDR2=0; ADDR1=0; ADDR0=0; P0=0x00; break;
}
delay(100);
}
}
//LED全部點亮

void alllionled(){
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;
P0=0x00;
}

//“I love U”中的“I”
void alllioni(){
unsigned int j;
ENLED=0;
ADDR3=0;
for(j=0;j<8;j++){
switch(j){
case 0: ADDR2=1; ADDR1=1; ADDR0=1; P0=0x00; break;
case 1: ADDR2=1; ADDR1=1; ADDR0=0; P0=0x00; break;
case 2: ADDR2=1; ADDR1=0; ADDR0=1; P0=0xe7; break;
case 3: ADDR2=1; ADDR1=0; ADDR0=0; P0=0xe7; break;
case 4: ADDR2=0; ADDR1=1; ADDR0=1; P0=0xe7; break;
case 5: ADDR2=0; ADDR1=1; ADDR0=0; P0=0xe7; break;
case 6: ADDR2=0; ADDR1=0; ADDR0=1; P0=0x00; break;
case 7: ADDR2=0; ADDR1=0; ADDR0=0; P0=0x00; break;
}
delay(100);
}
}

//“I love U”中的“love”
void alllionl(){
unsigned int j;
ENLED=0;
ADDR3=0;
for(j=0;j<8;j++){
switch(j){
case 0: ADDR2=1; ADDR1=1; ADDR0=1; P0=0xe7; break;
case 1: ADDR2=1; ADDR1=1; ADDR0=0; P0=0xc3; break;
case 2: ADDR2=1; ADDR1=0; ADDR0=1; P0=0x81; break;
case 3: ADDR2=1; ADDR1=0; ADDR0=0; P0=0x00; break;
case 4: ADDR2=0; ADDR1=1; ADDR0=1; P0=0x00; break;
case 5: ADDR2=0; ADDR1=1; ADDR0=0; P0=0x00; break;
case 6: ADDR2=0; ADDR1=0; ADDR0=1; P0=0x99; break;
case 7: ADDR2=0; ADDR1=0; ADDR0=0; P0=0xff; break;
}
delay(100);
}
}

//“I love U”中的“u”
void allliony(){
unsigned int j;
ENLED=0;
ADDR3=0;
for(j=0;j<8;j++){
switch(j){
case 0: ADDR2=1; ADDR1=1; ADDR0=1; P0=0x81; break;
case 1: ADDR2=1; ADDR1=1; ADDR0=0; P0=0x00; break;
case 2: ADDR2=1; ADDR1=0; ADDR0=1; P0=0x3c; break;
case 3: ADDR2=1; ADDR1=0; ADDR0=0; P0=0x3c; break;
case 4: ADDR2=0; ADDR1=1; ADDR0=1; P0=0x3c; break;
case 5: ADDR2=0; ADDR1=1; ADDR0=0; P0=0x3c; break;
case 6: ADDR2=0; ADDR1=0; ADDR0=1; P0=0x3c; break;
case 7: ADDR2=0; ADDR1=0; ADDR0=0; P0=0x3c; break;
}
delay(100);
}
}

main(){
while(1){
unsigned int wk=0;
unsigned int wc=0;
unsigned int j;


y6(1);//流水LED燈
for(j=0;j<8;j++){
y0_5(j);//點陣循環點亮
}
for(j=0;j<6;j++){
y0_s(j,0);//數碼管
delay(10000);
}
//全亮
for(j=0;j<200;j++){
alllion6(1);
delay(20);
alllion8();
delay(20);
alllionled();
delay(20);
}
//I love you
for(wk=0;wk<200;wk++){
alllioni();
delay(50);
alllionled();
delay(50);
alllion6(1);
delay(50);
}
for(wk=0;wk<200;wk++){
alllionl();
delay(50);
alllionled();
delay(50);
alllion6(1);
delay(50);
}
for(wk=0;wk<200;wk++){
allliony();
delay(50);
alllionled();
delay(50);
alllion6(1);
delay(50);
}
}
}

利用51單片機做出一些炫彩效果