做網(wǎng)站怎么兼職網(wǎng)絡(luò)公司網(wǎng)絡(luò)營銷推廣方案
點(diǎn)亮一個(gè)LED燈
根據(jù)LED
模塊原理圖,我們可以知道,通過控制P20、P21...P27
這八個(gè)位置的高低電平,可以實(shí)現(xiàn)D1~D8
八個(gè)LED
燈的亮滅。VCC
接的是高電平,如果P20
接的是低電平,那么D1
就可以亮。如果P20
接的是高電平,D1
就不能亮,以此類推。
P20~P27
一共有八個(gè)端口,依次可以用P2_0,P2_1,P2_2...P2_7
進(jìn)行表示。也可以直接用P2
進(jìn)行表示。
例如P2_0=0
,表示P20
是低電平,P2_1=1
,表示P21
是高電平。
如果只用P2
表示,P2=0xFF
,表示P20~P27
全是高電平,因?yàn)?code>0xFF是十六進(jìn)制,轉(zhuǎn)化為二進(jìn)制是1111 1111
,十六進(jìn)制轉(zhuǎn)二進(jìn)制是四位一組,F
表示15
,1111
。因此對(duì)應(yīng)P20=1,P21=1,....P27=1
。
如果P2=0xFE
,表示P20=0,P21~P27
全是高電平,因?yàn)?code>0xFE轉(zhuǎn)化為二進(jìn)制是1111 1110
從低位開始依次對(duì)應(yīng)P20,P21,P22...P27
。一個(gè)二進(jìn)制數(shù)對(duì)應(yīng)一個(gè)引腳。 低電平表示亮,高電平不亮。0
表示低電平,1
表示高電平。
#include <REGX52.H>
void main(){P2=0xFE;//1111 1110 點(diǎn)亮D1while(1){}
}
點(diǎn)亮一個(gè)LED
使一個(gè)LED燈閃爍
while
循環(huán)使得程序一直運(yùn)行下去。如果要使一個(gè)LED
燈閃爍,那么就要使一個(gè)燈亮,然后滅,交替進(jìn)行。
如果我們寫這樣的代碼,可以使得一個(gè)LED
燈閃爍嗎?
#include <REGX52.H>
void main(){while(1){P2=0xFE;//1111 1110P2=0xFF;}
}
答案是不可以,因?yàn)闄C(jī)器的運(yùn)算速度是非常的快的,我們的肉眼沒辦法區(qū)分兩行代碼的區(qū)別,所以我們看到的是燈一直亮著。如果要讓肉眼看見LED
燈閃爍,那就要讓機(jī)器慢下來,也就是讓機(jī)器延時(shí),再運(yùn)行下一段代碼。
延時(shí)就是空跑,程序什么都不執(zhí)行,但是需要耗費(fèi)時(shí)間。一般用多個(gè)while循環(huán)函數(shù)實(shí)現(xiàn)。
我們可以利用STC-ISP
軟件自動(dòng)生成延時(shí)函數(shù)。我們生成1
毫秒的延時(shí)函數(shù),然后封裝成可以實(shí)現(xiàn)任意毫秒的延時(shí)函數(shù)。
#include <REGX52.H>void Delay(unsigned int xms) //@11.0592MHz
{while(xms--){unsigned char i, j;i = 2;j = 199;do{while (--j);} while (--i);}}void main(){while(1){P2=0xFE;//1111 1110Delay(500);P2=0xFF;Delay(500);}
}
這段代碼實(shí)現(xiàn)了周期為1s
,使一個(gè)LED
燈閃爍。
LED閃爍
LED流水燈
LED流水燈意思是,讓D1亮,其他不亮,然后D2亮,其他不亮,.....,使得燈亮呈流水狀亮。
D1對(duì)應(yīng)P2_0,D2對(duì)應(yīng)P2_1......D8對(duì)應(yīng)P2_7。
D1對(duì)應(yīng)P2 二進(jìn)制的第一位(個(gè)位),D2對(duì)應(yīng)P2 二進(jìn)制的第二位(十位),......D8對(duì)應(yīng)P2的第八位。(低位依次對(duì)應(yīng))
D1亮對(duì)應(yīng)P2=0xFE,D2亮對(duì)應(yīng)P2=0xFD,D3亮對(duì)應(yīng)P2=0xFB,D4亮對(duì)應(yīng)P2=0xF7。
D5亮對(duì)應(yīng)P2=0xEF,D6亮對(duì)應(yīng)P2=0xDF,D7亮對(duì)應(yīng)P2=0xBF,D8亮對(duì)應(yīng)P2=0x7F。
我們以四個(gè)LED燈為一組,對(duì)應(yīng)的十六進(jìn)制是E,D,B,7。分別表示第一個(gè)燈亮,第二個(gè)燈亮,第三個(gè)燈亮,第四個(gè)燈亮。
//main.c
#include <REGX52.H>
#include "Delay.h"
void main(){while(1){P2=0xfe;Delay(500);P2=0xfd;Delay(500);P2=0xfb;Delay(500);P2=0xf7;Delay(500);P2=0xef;Delay(500);P2=0xdf;Delay(500);P2=0xbf;Delay(500);P2=0x7f;Delay(500);}}
//Delay.c
void Delay(unsigned int xms) //@11.0592MHz
{while(xms--){unsigned char i, j;i = 2;j = 199;do{while (--j);} while (--i);}}
//Delay.h
void Delay(unsigned int xms); //@11.0592MHz
將這三個(gè)文件放到同一個(gè)組別中,實(shí)現(xiàn)模塊化編寫代碼,提高代碼的可移植性,便攜性。我們只需要在主函數(shù)聲明Delay.h的頭文件即可使用Delay.c中的Delay的延時(shí)函數(shù)。
流水燈
LED流水燈plus版本
#include <REGX52.H>
#include "Delay.h"void liushui1(unsigned int xms){P2=0xfe;Delay(xms);P2=0xfd;Delay(xms);P2=0xfb;Delay(xms);P2=0xf7;Delay(xms);P2=0xef;Delay(xms);P2=0xdf;Delay(xms);P2=0xbf;Delay(xms);P2=0x7f;Delay(xms);
}
void liushui2(unsigned int xms){P2=0x7f;Delay(xms);P2=0xbf;Delay(xms);P2=0xdf;Delay(xms);P2=0xef;Delay(xms);P2=0xf7;Delay(xms);P2=0xfb;Delay(xms); P2=0xfd;Delay(xms); P2=0xfe;Delay(xms); }
void ji(unsigned int xms){P2=0xAA;Delay(xms);
}
void ou(unsigned int xms){P2=0x55;Delay(xms);
}void man(){P2=0x00;Delay(500);P2=0xff;Delay(500);
}
void main(){unsigned int xms=300;while(1){int i;liushui1(xms);liushui1(xms);man();man();liushui2(xms);liushui2(xms);man();man();for(i=1;i<=5;i++){ji(xms);ou(xms);}xms-=50;if(xms==0) xms=300;}}
這段代碼是用于單片機(jī)(基于8051架構(gòu))的程序,用來控制LED燈的流水燈效果和閃爍模式。程序包含幾個(gè)關(guān)鍵函數(shù),每個(gè)函數(shù)用于實(shí)現(xiàn)特定的燈光效果。
包含的頭文件和自定義函數(shù)
#include <REGX52.H>
這行代碼包含了一個(gè)專為8051單片機(jī)設(shè)計(jì)的頭文件,其中包含了對(duì)單片機(jī)特定功能寄存器的定義和訪問方法。
#include "Delay.h"
這行代碼包含了一個(gè)自定義的延時(shí)函數(shù)庫,里面定義的Delay
函數(shù)被用來在程序中實(shí)現(xiàn)延時(shí)效果,使LED燈的變化速度符合人眼觀察的需求。
liushui1函數(shù)
void liushui1(unsigned int xms){P2=0xfe;Delay(xms);P2=0xfd;Delay(xms);P2=0xfb;Delay(xms);P2=0xf7;Delay(xms);P2=0xef;Delay(xms);P2=0xdf;Delay(xms);P2=0xbf;Delay(xms);P2=0x7f;Delay(xms);
}
liushui1
函數(shù)實(shí)現(xiàn)了LED燈的正向流水效果。通過改變P2
端口的輸出值,讓LED依次點(diǎn)亮,模擬流水的效果。xms
參數(shù)控制每個(gè)LED點(diǎn)亮的持續(xù)時(shí)間,從而影響流水的速度。
liushui2函數(shù)
void liushui2(unsigned int xms){P2=0x7f;Delay(xms);P2=0xbf;Delay(xms);P2=0xdf;Delay(xms);P2=0xef;Delay(xms);P2=0xf7;Delay(xms);P2=0xfb;Delay(xms); P2=0xfd;Delay(xms); P2=0xfe;Delay(xms); }
liushui2
函數(shù)實(shí)現(xiàn)了LED燈的反向流水效果,其工作原理與liushui1
相似,但LED點(diǎn)亮的順序相反。
ji函數(shù)和ou函數(shù)
void ji(unsigned int xms){ P2=0xAA; Delay(xms); }
void ou(unsigned int xms){ P2=0x55; Delay(xms); }
ji
函數(shù)和ou
函數(shù)用來實(shí)現(xiàn)特定的LED閃爍模式。ji
函數(shù)讓LED以0xAA
(10101010二進(jìn)制模式)的模式閃爍,而ou
函數(shù)以0x55
(01010101二進(jìn)制模式)的模式閃爍。參數(shù)xms
控制閃爍的持續(xù)時(shí)間。
man函數(shù)
void man(){ P2=0x00; Delay(500); P2=0xff; Delay(500); }
man
函數(shù)用于實(shí)現(xiàn)所有LED全部點(diǎn)亮然后再全部熄滅的效果,每個(gè)狀態(tài)持續(xù)500ms。
main函數(shù)
void main(){unsigned int xms=300;while(1){int i;liushui1(xms);liushui1(xms);man();man();liushui2(xms);liushui2(xms);man();man();for(i=1;i<=5;i++){ji(xms);ou(xms);}xms-=50;if(xms==0) xms=300;}}
main
函數(shù)是程序的入口點(diǎn),定義了一個(gè)無限循環(huán),在這個(gè)循環(huán)中不斷調(diào)用上述定義的函數(shù),以實(shí)現(xiàn)不斷變化的LED燈效果。通過調(diào)整xms
的值,可以改變燈光效果的速度。當(dāng)xms
減到0時(shí),程序會(huì)將其重置為300ms,保證了程序的連續(xù)運(yùn)行和燈光效果的多樣性。正向流水流兩次,然后全部點(diǎn)亮全部熄滅兩次,逆向流水流兩次,然后全部點(diǎn)亮全部熄滅兩次,奇偶交替變換五次,然后延時(shí)降低50毫秒,一直到延時(shí)為0
,此時(shí)重新設(shè)置延時(shí)時(shí)間為300毫秒。
流水燈plus_0
結(jié)尾
最后,感謝您閱讀我的文章,希望這些內(nèi)容能夠?qū)δ兴鶈l(fā)和幫助。如果您有任何問題或想要分享您的觀點(diǎn),請(qǐng)隨時(shí)在評(píng)論區(qū)留言。
同時(shí),不要忘記訂閱我的博客以獲取更多有趣的內(nèi)容。在未來的文章中,我將繼續(xù)探討這個(gè)話題的不同方面,為您呈現(xiàn)更多深度和見解。
謝謝您的支持,期待與您在下一篇文章中再次相遇!