点灯合集(点亮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;  //消影
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章