點燈合集
一、點亮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; //消影
}
}