目錄
1案例視頻效果展示
1.1例子1:LED燈表示按鍵狀態(兩種方式)
1.2例子2:按鍵控制兩排LED小燈閃爍移位
1.3例子3:按鍵控制LED燈逐個點亮/分組點亮/全部熄滅
1.4例子4:4*4矩陣按鍵實現帶狀LED燈控制
2例子1:LED燈表示按鍵狀態(兩種方式)
2.1電路原理圖
2.1.1電路組成及接線
2.2控制程序
2.2.1控制程序步驟
2.2.2源代碼
3例子2:按鍵控制兩排LED小燈閃爍移位
3.1電路原理圖
3.1.1電路組成及接線
3.2控制程序
3.2.1控制程序步驟
3.2.2源代碼
4例子3:按鍵控制LED燈逐個點亮/分組點亮/全部熄滅
4.1電路原理圖
4.1.1電路組成及接線
4.2控制程序
4.2.1控制程序步驟
4.2.2源代碼
5例子4:4*4矩陣按鍵實現帶狀LED燈控制
5.1電路原理圖
5.1.1電路組成及接線
5.2控制程序
5.2.1控制程序步驟
5.2.2源代碼
?7 硬件工程師筆試面試相關文章鏈接(部分鏈接)
摘要:本文介紹了基于AT89C51單片機的4種LED控制案例:1)按鍵狀態顯示(即時/觸發兩種模式);2)兩排LED燈移位控制(上下左右四個方向);3)LED分組控制(逐個點亮、上下半區控制、全滅);4)4×4矩陣按鍵控制LED燈帶(按鍵值決定亮燈數量)。所有案例均采用I/O口電平檢測控制LED電路,包含完整的電路原理圖(含晶振、復位、按鍵和LED模塊)和C語言源代碼實現,通過延時函數、位操作和鍵盤掃描等技術實現交互控制功能。
1案例視頻效果展示
1.1例子1:LED燈表示按鍵狀態(兩種方式)
例子6:LED燈表示按鍵狀態(兩種方式)
1.2例子2:按鍵控制兩排LED小燈閃爍移位
例子7:按鍵控制兩排LED小燈閃爍移位
1.3例子3:按鍵控制LED燈逐個點亮/分組點亮/全部熄滅
例子8:按鍵控制LED燈逐個點亮/分組點亮/全部熄滅
1.4例子4:4*4矩陣按鍵實現帶狀LED燈控制
例子9:4*4矩陣按鍵實現帶狀LED燈控制
2例子1:LED燈表示按鍵狀態(兩種方式)
實現功能:K1、K2按下時LED點亮,松開時熄滅, K3、K4按下并釋放時LED點亮,再次按下并釋放時熄滅。
本質:單片機的某些I/O 口輸入高/低電平作為判斷條件控制其他I/O 口輸出高/低電平,去驅動一個LED。
2.1電路原理圖
2.1.1電路組成及接線
名稱 | 接線 |
AT89C51單片機 | XTAL1/XTAL2—>連接晶振電路 RST—>連接復位電路 P0.0-P0.3—>連接共陽極LED小燈電路 P1.4-P1.7—>連接按鍵電路 |
復位電路 | |
晶振電路 | |
按鍵電路 | |
共陽極LED小燈電路 |
2.2控制程序
2.2.1控制程序步驟
庫文件與引腳定義
延時函數
主程序(按鍵狀態作為輸入(判斷條件),LED狀態作為輸出)
2.2.2源代碼
//功能:K1、K2按下時LED點亮,松開時熄滅, K3、K4按下并釋放時LED點亮,再次按下并釋放時熄滅;#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit LED4=P0^3;sbit K1=P1^4;sbit K2=P1^5;sbit K3=P1^6;sbit K4=P1^7;//延時void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}??????//主程序void main(){P0=0xff;P1=0xff;while(1){LED1=K1;LED2=K2;if(K3==0){while(K3==0);LED3=~LED3;}if(K4==0){while(K4==0);LED4=~LED4;}DelayMS(10);}}
3例子2:按鍵控制兩排LED小燈閃爍移位
實現功能:按下K1時,P0口LED上移一位;按下K2時,P0口LED下移一位;按下K3時,P2口LED上移一位;按下K4時,P2口LED下移一位;
本質:單片機的某些I/O 口輸入高/低電平作為判斷條件控制其他I/O 口輸出高/低電平,去驅動一個LED。
3.1電路原理圖
3.1.1電路組成及接線
名稱 | 接線 |
AT89C51單片機 | XTAL1/XTAL2—>連接晶振電路 RST—>連接復位電路 P0.0-P0.7—>連接共陽極左側LED小燈電路 P2.0-P2.7—>連接共陽極右側LED小燈電路 P1.4-P1.7—>連接按鍵電路 |
復位電路 | |
晶振電路 | |
按鍵電路 | |
共陽極LED小燈電路 |
3.2控制程序
3.2.1控制程序步驟
庫文件
延時函數
按鍵控制LED燈閃爍移動函數
主程序
3.2.2源代碼
//功能:按下K1時,P0口LED上移一位;按下K2時,P0口LED下移一位;按下K3時,P2口LED上移一位;按下K4時,P2口LED下移一位;#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延時void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}??????//根據P1口的按鍵移動LEDvoid Move_LED(){if???? ((P1&0x10)==0) P0=_cror_(P0,1);? //K1else if((P1&0x20)==0) P0=_crol_(P0,1);? //K2else if((P1&0x40)==0) P2=_cror_(P2,1);? //K3else if((P1&0x80)==0) P2=_crol_(P2,1);? //K4}//主程序void main(){uchar Recent_Key;? //最近按鍵P0=0xfe;P2=0xfe;P1=0xff;Recent_Key=0xff;while(1){if(Recent_Key!=P1){Recent_Key=P1;????? ? //保存最近按鍵Move_LED();DelayMS(10);}}}
4例子3:按鍵控制LED燈逐個點亮/分組點亮/全部熄滅
實現功能:每次按下K1時遞增點亮一只LED,全亮時再次按下則再次循環開始,K2按下后點亮上面4只LED,K3按下后點亮下面4只LED,K4按下后關閉所有LED
本質:單片機的某些I/O 口輸入高/低電平作為判斷條件控制其他I/O 口輸出高/低電平,去驅動一個LED。
4.1電路原理圖
4.1.1電路組成及接線
名稱 | 接線 |
AT89C51單片機 | XTAL1/XTAL2—>連接晶振電路 RST—>連接復位電路 P0.0-P0.7—>連接共陽極LED小燈電路 P1.4-P1.7—>連接按鍵電路 |
復位電路 | |
晶振電路 | |
按鍵電路 | |
共陽極LED小燈電路 |
4.2控制程序
4.2.1控制程序步驟
庫文件
延時函數
主程序(獲取按鍵狀態——>switch case函數選擇執行命令)
4.2.2源代碼
//功能:每次按下K1時遞增點亮一只LED,全亮時再次按下則再次循環開始,K2按下后點亮上面4只LED,K3按下后點亮下面4只LED,K4按下后關閉所有LED#include<reg51.h>#define uchar unsigned char#define uint unsigned int//延時void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}??????//主程序void main(){uchar k,t,Key_State;P0=0xff;P1=0xff;while(1){t=P1;if(t!=0xff){DelayMS(10);if(t!=P1) continue;//取得4位按鍵值,由模式XXXX1111(X中有一位為0,其他均為1)//變為模式0000XXXX(X中有一位為1,其他均為0)Key_State=~t>>4;k=0;//檢查1所在位置,累加獲取按鍵號kwhile(Key_State!=0){k++;Key_State>>=1;}//根據按鍵號k進行4種處理switch(k){case 1:???? if(P0==0x00) P0=0xff;P0<<=1;DelayMS(200);break;case 2:???? P0=0xf0;break;case 3:???? P0=0x0f;break;case 4:???? P0=0xff;}}}}
5例子4:4*4矩陣按鍵實現帶狀LED燈控制
實現功能:亮起和按鍵上數字相同數量的LED燈
本質:單片機的某些I/O 口輸入高/低電平作為判斷條件控制其他I/O 口輸出高/低電平,去驅動一個LED。
5.1電路原理圖
5.1.1電路組成及接線
名稱 | 接線 |
AT89C51單片機 | XTAL1/XTAL2—>連接晶振電路 RST—>連接復位電路 P2.0-P0.7/ P2.0-P0.7—>連接共陽極LED燈帶電路 P1.0-P1.7—>連接4*4矩陣按鍵電路 |
復位電路 | |
晶振電路 | |
4*4矩陣按鍵電路 | |
共陽極LED燈帶電路 |
5.2控制程序
5.2.1控制程序步驟
庫文件
和按鍵數字一一對應的16進制數字
延時函數
鍵盤掃描函數
主函數(按鍵數字和LED燈亮起相同數量)
5.2.2源代碼
//功能:運行本例時,按下的按鍵值越大點亮的LED越多。#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//矩陣鍵盤按鍵特征碼表uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//延時void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}??????//鍵盤掃描uchar Keys_Scan(){uchar sCode,kCode,i,k;//低4位置0,放入4行P1=0xf0;//若高4位出現0,則有鍵按下if((P1&0xf0)!=0xf0){DelayMS(2);if((P1&0xf0)!=0xf0){??????sCode=0xfe;???????????????????? //行掃描碼初值for(k=0;k<4;k++)???? //對4行分別進行掃描{P1=sCode;if((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i<16;i++)????? //查表得到按鍵序號并返回if(kCode==KeyCodeTable[i])???return(i);}elsesCode=_crol_(sCode,1);}}?}return(-1);}//主程序void main(){uchar i,P2_LED,P3_LED;uchar KeyNo=-1;????????????? //按鍵序號,-1表示無按鍵while(1){KeyNo=Keys_Scan();??????? //掃描鍵盤獲取按鍵序號KeyNoif(KeyNo!=-1){P2_LED=0xff;P3_LED=0xff;for(i=0;i<=KeyNo;i++)????? //鍵值越大,點亮的LED越多{if(i<8)P3_LED>>=1;elseP2_LED>>=1;}P3=P3_LED; ?????????? //點亮條形LEDP2=P2_LED;}}}
?7 硬件工程師筆試面試相關文章鏈接(部分鏈接)
更多文章可前往主頁觀看
1、硬件工程師筆面試真題匯總(2025版本)_硬件工程師面試題-CSDN博客https://blog.csdn.net/XU157303764/article/details/140742900?spm=1011.2415.3001.5331硬件工程師筆試面試高頻考點匯總——(2025版)_電容或者電感對鎖存器的影響-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1488349782、硬件工程師筆試面試匯總(2025版本)_硬件工程師面試題-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1419048583、硬件工程師筆試面試學習匯總——器件篇目錄(2025版本)_【【硬件工程師煉成之路】器件篇(更新中。。。)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/142316204
硬件工程師筆記——電子器件匯總大全-CSDN博客https://blog.csdn.net/XU157303764/article/details/147342935?spm=1011.2415.3001.5331Multisim14使用教程詳盡版--(2025最新版)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/147197406?spm=1011.2415.3001.5331