51微控制器流水燈電路以及C程式碼

石輔寸發表於2018-10-25

流水燈是51微控制器的入門級實驗,以下是其電路圖以及C程式碼

流水燈proteus電路圖

在這裡插入圖片描述

此圖發光二極體採用 共陽極式連線

流水燈C程式碼

#include<reg51.h>
#define TIME 1
//巨集定義秒數,方便更改間隔時間
void delaySec(unsigned char n);
void Movinglight();
unsigned char code MovinglightArray[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char i,n = 1;
int main()
{
	Movinglight();
	return 0;
}
void Movinglight()
{
	while(1)
	{
		for(i = 0;i < 8;i++)
			P1 = MovinglightArray[i];
			delaySec(TIME);
	}
}
void delaySec(unsigned char n)
{
	unsigned int i,j,l;
	for(l = 0;l < n;l++)
		for(i = 0;1000;i++)
			for(j = 0;j < 114;j++);
}/*當n為1時,誤差約0.001s*/

授人以魚不如授人以漁,在此,筆者覺得應該給大家簡單剖析一下以上的程式碼,以方便初學者更加容易更改和理解程式碼。

我看程式碼習慣從主函式開始,相信大家大多都是這樣的吧?
進入主函式:
1,呼叫Movinglight函式
進入Movinglight函式:
1,呼叫while函式,1代表死迴圈
2,for迴圈,依次給P1口賦值

初學者一般看不懂0x 加 數字,其實0x 加 數字的意思,0x就是表示後兩位是16進位制數。
但是微控制器處理是按照二進位制處理資料的。
所以我們把上述例子轉化為位元組(即八個二進位制位)。
例如,0xfe = 1111 1110;0xfd = 1111 1101。
不要糾結0xfe或者0xfd的,對應微控制器來說,P1口的值不重要,這個值包含的位才是控制微控制器的關鍵所在,微控制器只在意它所代表的二進位制數的位是0還是1。

根據電路圖,P1.7對應二進位制數的最高位,P1.0對應二進位制數的最低位。
拿0xfe舉例大家就能更好地理解了。
0xfe = 1111 1110。
分解開來實際上是:
P1.0 = 0
P1.1 = 1
P1.2 = 1
P1.3 = 1
P1.4 = 1
P1.5 = 1
P1.6 = 1
P1.7 = 1

最低位為0,其餘為均為1。

那麼0和1有什麼含義?
以本實驗為例,在微控制器通電的情況下:
P1.0 = 0 表示這個引腳處為低電平
其餘引腳處則是高電平。

那什麼是高低電平呢?
說白了就是高低電勢。
其實我認為說成高低電勢更容易為廣大讀者理解。
高低電平是相對的,比如5V相對於0V 是高電平,但是相對於10V 又是低電平。
但是圈子裡的所有書都是說電平的。
一般情況下,微控制器是5V和0V。
一端高電平,一端低電平才能形成電壓,發光二極體才能點亮。兩邊都是高電平或者兩邊都是低電平發光二極體都不能被點亮。

通常情況下,通電情況下微控制器引腳預設為高電平。

由於發光二極體正極連線公共正電壓源,所以只有位為0時,燈才會亮。

以上內容如果有什麼謬誤,敬請指正。

相關文章