點燈合集(點亮LED、流水燈、8x8點陣、點陣拓展)——附程序

一、點亮LED

簡介:

發光二極管簡稱:LED

是一種常用發光器件。

有正、負兩極,一般接限流電阻,電阻值根據實際需要選擇。

點亮LED,只需在正極加高電平,負極加低電平。

在這裏插入圖片描述

LED閃爍:

Proteus仿真圖:

在這裏插入圖片描述

視頻展示:

51單片機——LED閃爍

代碼:

#include<reg51.h>

sbit led = P3^7;

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

void main(){
	while(1){
		led = ~led;   //對 led 不斷取反
		delay(1000);  //延時一段時間,閃爍效果
	}
}

二、流水燈

把多個LED並連起來,一端共陽。

另一端與單片機 P0端口相連。
在這裏插入圖片描述

Proteus仿真圖:

在這裏插入圖片描述

代碼:

代碼一:

#include<reg51.h>

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

void main(){

	while(1){
		P0 = 0xFE;
		delay(500);

		P0 = 0xFD;
		delay(500);

		P0 = 0xFB;
		delay(500);

		P0 = 0xF7;
		delay(500);

		P0 = 0xEF;
		delay(500);

		P0 = 0xDF;
		delay(500);

		P0 = 0xBF;
		delay(500);

		P0 = 0x7F;
		delay(500);
	}
}

代碼二(優化):

#include<reg51.h>

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

void main(){

	unsigned int i, j;

	while(1){
		j = 0xFE;  //十六進制:1111 1110
		for(i=0; i<8; i++){
			P0 = j;  //對 P0 口操作
			j = (j<<1)|0x01;  //j 逐位左移,與0x01逐位或運算
			delay(500);
		}
	}
}

三、行列掃描原理

對行列掃描原理不理解的話可以參考:
按鍵(獨立按鍵、矩陣鍵盤)——附帶程序

四、8x8點陣

簡介:

瞭解了流水燈之後,點陣就非常容易掌握,可以看作是8條流水燈又並聯在一起,構成8x8點陣。

實物圖:
實物圖
Proteus器件圖:
在這裏插入圖片描述
內部連線:有兩種連法。
在這裏插入圖片描述

顯示大寫字母 G :

Proteus仿真圖:

在這裏插入圖片描述

效果:

在這裏插入圖片描述

代碼:

/*
利用掃描原理進行顯示:
先選通一列,對該列的每一行操作,
接着再選通下一列,對下一列對應的行進行操作
以此類推,逐次掃描列和行

① table_1 是列掃描數組。

例:當 i=1 時,P2 口值爲 0x02(十六進制爲:0000 0010),所以 P2 口,除 P2^1=1 是高電平外,P2   口其它管腳都爲低電平,所以選通第二列

② table_2 是行掃描數組,儲存將要顯示的字符字碼,與 table_1 列掃描配合顯示。

例:當 i=1 時,選通第二列,此時 P0 口值爲 0x83(十六進制爲:1000 0011),因爲行掃描是低電平有效,即第 3、4、5、6、7 行亮,爲字母 G 的第一列

③其他以此類推
*/
#include<reg51.h>

unsigned char code table_1[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};  //列掃描
unsigned char code table_2[] = {0xff, 0x83, 0x7d, 0x6d, 0x6d, 0x6d, 0x9b, 0xff};  //行掃描

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

void main(){

	while(1){
		unsigned char i;
		for(i=0; i<8; ++i){
			P2 = table_1[i];  //先列掃描
			P0 = table_2[i];  //再行掃描
			delay(5);
		}
	}
}

想要實現顯示其他圖形或字符,可以使用文字取模軟件

五、點陣拓展

4個8x8點陣組合

在這裏插入圖片描述
把四個組合在一起,顯示更加美觀,如下圖:
在這裏插入圖片描述

實驗一:顯示 ×

效果展示:

在這裏插入圖片描述

代碼:

老師要求的實驗,代碼不怎麼美觀!見諒,見諒!

日後有時間再優化程序。

/*
原理和 8x8 點陣一樣,利用行列掃描顯示 

先對 P2 口進行操作,即 0 ~ 7列,每列的 16 行由 P0 口(第0 ~ 7行)和 P1 口(第8 ~ 15行)組成
當選通一列時,需要對 P0 和 P1 口同時進行操作
接着再選通下一列,對下一列對應的 P0 和 P1 口操作
以此類推

!注意一定要在 P2 口 和 P3 口操作完後進行消影,否則影響顯示效果
*/
#include<reg51.h>

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

void main(){

	while(1){  //行列掃描
	
		P2 = 0x01;  //P2 口控制低 8 列, l0~l7
		P0 = 0Xfe;
		P1 = 0x7f;
		delay(1);

		P2 = 0x02;
		P0 = 0Xfd;
		P1 = 0xbf;
		delay(1);

		P2 = 0x04;
		P0 = 0Xfb;
		P1 = 0xdf;
		delay(1);

		P2 = 0x08;
		P0 = 0Xf7;
		P1 = 0xef;
		delay(1);

		P2 = 0x10;
		P0 = 0Xef;
		P1 = 0xf7;
		delay(1);

		P2 = 0x20;
		P0 = 0Xdf;
		P1 = 0xfb;
		delay(1);

		P2 = 0x40;
		P0 = 0Xbf;
		P1 = 0xfd;
		delay(1);

		P2 = 0x80;
		P0 = 0X7f;
		P1 = 0xfe;
		delay(1);

		P2 = 0x00;  //消影

		P3 = 0x01;  //P3 口控制高 8 列,l8 ~l15
		P0 = 0X7f;
		P1 = 0xfe;
		delay(1);

		P3 = 0x02;
		P0 = 0Xbf;
		P1 = 0xfd;
	    delay(1);

		P3 = 0x04;
		P0 = 0Xdf;
		P1 = 0xfb;
		delay(1);

		P3 = 0x08;
		P0 = 0Xef;
		P1 = 0xf7;
		delay(1);

		P3 = 0x10;
		P0 = 0Xf7;
		P1 = 0xef;
		delay(1);

		P3 = 0x20;
		P0 = 0Xfb;
		P1 = 0xdf;
		delay(1);

		P3 = 0x40;
		P0 = 0Xfd;
		P1 = 0xbf;
		delay(1);

		P3 = 0x80;
		P0 = 0Xfe;
		P1 = 0x7f;
		delay(1);

		P3 = 0X00;  //消影
	}
}

實驗二:顯示愛心

效果展示:

在這裏插入圖片描述

代碼:

老師要求的實驗,代碼不怎麼美觀!見諒,見諒!

日後有時間再優化程序。

#include<reg51.h>

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

void main(){

	while(1){  //行列掃描

		P2 = 0x01;  //P2 口控制低 8 列, l0~l7
		P0 = 0x0f;
		P1 = 0xff;
		delay(1);

		P2 = 0x02;
		P0 = 0x07;
		P1 = 0xfe;
		delay(1);

		P2 = 0x04;
		P0 = 0x03;
		P1 = 0xfc;
		delay(1);

		P2 = 0x08;
		P0 = 0x01;
		P1 = 0xf8;
		delay(1);

		P2 = 0x10;
		P0 = 0x01;
		P1 = 0xf0;
		delay(1);

		P2 = 0x20;
		P0 = 0x01;
		P1 = 0xe0;
		delay(1);

		P2 = 0x40;
		P0 = 0x03;
		P1 = 0xc0;
		delay(1);

		P2 = 0x80;
		P0 = 0x07;
		P1 = 0x80;
		delay(1);

		P2 = 0x00;  //消影

		P3 = 0x01;  //P3 口控制高 8 列,l8 ~l15
		P0 = 0x07;
		P1 = 0x80;
		delay(1);

		P3 = 0x02;
		P0 = 0x03;
		P1 = 0xc0;
	    delay(1);

		P3 = 0x04;
		P0 = 0x01;
		P1 = 0xe0;
		delay(1);

		P3 = 0x08;
		P0 = 0x01;
		P1 = 0xf0;
		delay(1);

		P3 = 0x10;
		P0 = 0x01;
		P1 = 0xf8;
		delay(1);

		P3 = 0x20;
		P0 = 0x03;
		P1 = 0xfc;
		delay(1);

		P3 = 0x40;
		P0 = 0x07;
		P1 = 0xfe;
		delay(1);

		P3 = 0x80;
		P0 = 0x0f;
		P1 = 0xff;
		delay(1);

		P3 = 0x00;  //消影
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章