前言
上次已經(jīng)實(shí)現(xiàn)了LED的點(diǎn)亮了,這篇文章將帶大家實(shí)現(xiàn)流水燈。
一、延時(shí)函數(shù)
要想實(shí)現(xiàn)流水燈首先就得知道什么是延時(shí)函數(shù),延時(shí)函數(shù)的作用就是等待。比如延時(shí)一毫秒就是讓程序在這里等待一毫秒。延時(shí)函數(shù)的本質(zhì)就是執(zhí)行一些空指令,因?yàn)閳?zhí)行指令需要耗費(fèi)時(shí)間,所以執(zhí)行一定數(shù)量的空指令就能達(dá)到延時(shí)的效果。
延時(shí)函數(shù)的實(shí)現(xiàn)
這里的延時(shí)函數(shù)就是不斷的在執(zhí)行;表達(dá)式來(lái)達(dá)到延時(shí)的效果。
/*延時(shí)函數(shù)
單位:ms
x:延時(shí)的數(shù)值
*/
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i=0;i<113;i++);
}
}
二、流水燈代碼
下面就是流水燈的代碼了,其實(shí)操作起來(lái)也是非常簡(jiǎn)單的。不過(guò)這樣寫(xiě)一個(gè)流水燈看起來(lái)實(shí)在是太過(guò)于復(fù)雜了,下面將對(duì)代碼進(jìn)行整改。
#include <reg52.h>
/*LED燈端口定義*/
sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;
/*延時(shí)函數(shù)
單位:ms
x:延時(shí)的數(shù)值
*/
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i=0;i<113;i++);
}
}
void main()
{
while(1)
{
LED0 = 0;
delayms(1000);
LED1 = 0;
delayms(1000);
LED2 = 0;
delayms(1000);
LED3 = 0;
delayms(1000);
LED4 = 0;
delayms(1000);
LED5 = 0;
delayms(1000);
LED6 = 0;
delayms(1000);
LED7 = 0;
delayms(1000);
LED0 = LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = 1;
}
}
三、代碼改進(jìn)
上篇文章我們已經(jīng)講到了8個(gè)LED燈分別接到了P2.0—P2.7上面。所以我們可以直接對(duì)P2端口進(jìn)行操作實(shí)現(xiàn)點(diǎn)亮LED燈。
默認(rèn)狀態(tài)LED燈都為滅,也就是狀態(tài)都為1。所以P2.0—P2.7的8個(gè)端口狀態(tài)為
1111 1111。
我們只需要讓其中一個(gè)位變成0即可讓LED燈點(diǎn)亮。
對(duì)P2直接進(jìn)行操作讓第一個(gè)LED燈點(diǎn)亮就是對(duì)P2賦值如下:
1111 1110
換成16進(jìn)制也就是0xfe
下面的代碼就可以點(diǎn)亮第一個(gè)LED了
P2 = 0xfe;
所以可以直接對(duì)P2進(jìn)行操作達(dá)到流水燈的效果。
#include <reg52.h>
/*延時(shí)函數(shù)
單位:ms
x:延時(shí)的數(shù)值
*/
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i=0;i<113;i++);
}
}
void main()
{
int i = 0;
while(1)
{
for(i = 0; i < 8; i ++ )
{
P2 = ~(1<<i);
delayms(1000);
}
}
}
板子上面有8個(gè)LED燈,所以這里設(shè)計(jì)了一個(gè)for循環(huán)。利用左移操作和取反操作實(shí)現(xiàn)了流水燈的效果。
簡(jiǎn)單解釋一下這個(gè)for循環(huán)實(shí)現(xiàn)流水燈的原理
一開(kāi)始i=0 P2 = ~(1<<0)相當(dāng)于是1111 1110
i = 2時(shí)P2 = ~(1<<1)相當(dāng)于是1111 1101
后面的以此類推,這里0移到到了哪里哪個(gè)LED就會(huì)被點(diǎn)亮了。
對(duì)左移和取反操作還不熟悉的同學(xué)建議去加強(qiáng)一下C語(yǔ)言的知識(shí)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-757766.html
總結(jié)
流水燈的點(diǎn)亮就介紹到這里了,大家主要是掌握sbit位定義和直接操作P2進(jìn)行流水燈的點(diǎn)亮。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-757766.html
到了這里,關(guān)于51單片機(jī)入門(mén)流水燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!