一、点亮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; //消影
}
}
转载:https://blog.csdn.net/qq_44526422/article/details/106484369
查看评论