一、跑馬燈和流水燈的區(qū)別
好多人分不清跑馬燈和流水燈,還以為是同一種狀態(tài),雖然難度等級是一樣的,但是燈的亮滅顯示方式是不一樣的。請看下圖
二、單片機控制LED燈的常用電路接法
弄清楚跑馬燈的顯示狀態(tài)后可以開始進行設(shè)計了, 在日常的跑馬燈設(shè)計電路中LED燈一般接為這兩種形式,共電源或共地,也就是通常說的灌電流式和拉電流式
三、電路分析與編程
大家可以根據(jù)自己實際的電路需要選擇其中一種接法,由于AT89S52單片機IO端口不操作時是高電平所以下面我選擇的是共電源接法。
電路分析:當電路輸出高電平[端口為1]LED燈滅,當電路輸出低電平[端口為0]LED燈亮
大家可以按照自己的思路編程,方法不唯一,下面我將介紹3種方法
方法一:不利用算法,直接使用IO控制[可以說是最蠢的方法,但是一樣能實現(xiàn)效果,并且容易理解]
#include
//LED輸出端口位定義
sbit led0=P0^0;
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
//延時函數(shù)
void delay(void)
{
unsigned char a,b;
for(a=0;a<200;a++)
for(b=0;b<200;b++);
}
void main()
{
led0=1; //端口初始化
led1=1;
led2=1;
led3=1;
led4=1;
led5=1;
led6=1;
led7=1;
while(1)
{
led0=0; //點亮LED0
delay(); //延時
led0=1; //熄滅LED0
delay(); //延時,為下一個燈準備
led1=0;
delay();
led1=1;
delay();
led2=0;
delay();
led2=1;
delay();
led3=0;
delay();
led3=1;
delay();
led4=0;
delay();
led4=1;
delay();
led5=0;
delay();
led5=1;
delay();
led6=0;
delay();
led6=1;
delay();
led7=0;
delay();
led7=1;
delay();
}
}
方法二:借助數(shù)組對上面程序進行改進,使端口一次性賦值定義
#include
#define uchar unsigned char
#define uint unsigned int
//定義一個一維數(shù)組
unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//延時函數(shù)
void delay(void)
{
uchar a,b;
for(a=0;a<200;a++)
for(b=0;b<200;b++);
}
void main()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
P0=table[i];//11111110
delay();
}
}
}
方法三:利用函數(shù)封裝庫
#include
#include //此為調(diào)用函數(shù)的頭文件必須添加
#define uchar unsigned char
#define uint unsigned int
//延時函數(shù)
void delay(void)
{
uchar a,b;
for(a=0;a<200;a++)
for(b=0;b<200;b++);
}
void main()
{
uchar k;
k=0xfe; //定義初值
while(1)
{
P0=k;
delay();
k=_crol_(k,1); //調(diào)用頭文件封裝庫函數(shù)
}
}
還有移位運算等其他的方法在這里就不一一列出