💖 作者簡介:大家好,我是澤奀,🏆全堆疊領域新星創作者 作者周榜:81 總排名:6434 👑
📝 個人主頁:weixin_52632755的博客_澤奀_CSDN博客
🎉 點贊?評論?收藏 == 養成習慣😊
📣 系列專欄:【51單片機】系列_澤奀的博客-CSDN博客
💬 總結:希望你看完之后,能對你有所幫助,不足請指正!共同學習交流 🖊
?? 我們并非登上我們所選擇的舞臺,演出并非我們所選擇的劇本,
目錄
🎃獨立按鍵介紹
🏓獨立按鍵原理圖
🎡獨立按鍵控制LED燈亮滅
🎉C51資料運算
🎉C51基本陳述句C51數C51資料運算C51資料運算據運算
🎄獨立按鍵控制LED燈狀態
🎋按鍵的抖動
🏒獨立按鍵控制LED顯示二進制
🥍獨立按鍵控制LED燈移位
🎃獨立按鍵介紹
- 輕觸按鍵:相當于是一種電子開關,按下時開關接通,松開時開關斷開,實作原理是通過輕觸按鍵內部的金屬彈片受力彈動來實作接通和斷開,
- 英文:independent press button
- 了解:獨立按鍵具有四個"頭",獨立按鍵主要有四個部分:1、底座,2、金屬彈片(這個金屬彈片是鼓起來的,當你按下去的時候它會變平,松手的時候又會鼓起來的),3、就是按鍵的頭,4、就是金屬的蓋子,那么在相同的兩個引腳當中其實它就是內部連接起來的金屬片,無論你按不按下去,它前后的兩個引腳都是連接起來的,就是始終都是具有導通性質的,向外具有兩個接觸的點,按下的時候四個引腳全部都是連接的,松手的時候兩邊分別連接,之間是斷開的,
- 如下圖實物所示:
🏓獨立按鍵原理圖

- 這里總共有四個獨立按鍵,它們公共的一段都接到了GND電源的負極,另一端引出了四個編號是連接到單片機板子中的MCU上面,還有一段是接到了IO口上,如下圖所示:
- 那我們就知道了單片機上電的時候所有的IO口默認都是高電平,那么就是當是如果按鍵沒有按下的時候那么這個IO口保證的就是高電平,按下的話那么這個IO口就變成低電平了,暫存器會檢測IO口的電平,然后在讀回來這個暫存器當中,如果按鍵松開"我"因該去讀取這個暫存器那么它其實就是一個高電平默認為1的一個高電平,反之,那么根據這個現象我們可以得知我們的獨立按鍵是不是被按下了,
🎡獨立按鍵控制LED燈亮滅
#include <REGX52.H>
int main(void)
{
while(1)
{
if(P3_1==0 || P3_0==0) //如果K1按鍵或K2按鍵按下
{
P2_0=0; //LED1輸出0,點亮
}
else
{
P2_0=1; //LED1輸出1,熄滅
}
}
}
注意:獨立按鍵K1按鍵與K2按鍵按鍵網路編號是相反的,K1=P3_1、K2=P3_0,
🎉C51資料運算

算術運算子:加減沒什么好說的,乘法和除法注意一下符號!以及除法是取整的不是四舍五入按照數學的運算來的,比方舉個例子:五除以二,按照數學的方式是:2.5,在C語言當中是2取最小整數,當然這是int資料型別當中是這個樣子,也有單精度浮點型(float)和雙精度浮點型(double)它們依舊是等于2.5的,那么取余(%)是什么意思呢?其實很簡單就是還是以五除以二的話在小學當中是2...1,那么這個其實就是5%2=1了,再比方說102/10 = 10...2 那么102%10 = 2,所以除號與取余就是這個意思了,賦值就是把右邊得出的值或者說是結果賦值到你左邊的這個變數,
判斷運算子:這個沒什么好說的,就是在運算式的值經常有判斷運算式,如果你的運算式的值為真,那么就執行運算式里面大括號(作用域)里面的內容,在這里注意下等于的判斷運算式的符號,
邏輯運算子:假設 a = 1,b = 0;
- && 稱為邏輯與運算子,如果兩個運算元都非零,則條件為真,(A && B) 為假,
- || 稱為邏輯或運算子,如果兩個運算元中有任意一個非零,則條件為真 (A || B) 為真,
- ! 稱為邏輯非運算子,用來逆轉運算元的邏輯狀態,如果條件為真則邏輯非運算子將使其為假,!(A && B) 為真,
位運算:
- 按位與操作,按二進制位進行"與"運算,運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
按位或運算子,按二進制位進行"或"運算,運算規則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
異或運算子,按二進制位進行"異或"運算,運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
取反運算子,按二進制位進行"取反"運算,運算規則:~0001 = 1110;
<< 二進制左移運算子,將一個運算物件的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)
>> 二進制右移運算子,將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄,
🎉C51基本陳述句C51數C51資料運算C51資料運算據運算
這些陳述句都是單片機以及變成語言比較重要的陳述句!像這個判斷陳述句if以及switch陳述句,以及while和for的回圈陳述句在單片機中都是很重要的,這些都是必須要掌握的知識點!大家可以多上手代碼,熟練掌握這些判斷陳述句和回圈陳述句,任何復雜的程式都可以由順序、選擇、回圈來進行程式代碼的實作,上面的代碼就是典型的if—else的陳述句,
🎄獨立按鍵控制LED燈狀態
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
int main(void)
{
while(1)
{
if(P3_1==0) //如果K1按鍵按下
{
Delay(20); //延時消抖
while(P3_1==0); //松手檢測
Delay(20); //延時消抖
P2_0=~P2_0; //LED1取反
}
}
}
🎋按鍵的抖動
- 對于機械開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開,所以在開關閉合及斷開的瞬間會伴隨一連串的抖動,
在按鍵閉合的時候會產生一些抖動,沒有按鍵按下的話它就是一個高電平(1)(單片機上電的時候所有的IO口默認都是高電平),在我們按下按鍵的時候它就會變成(0),并且由于它的是機械觸電會彈開,然后上下抖動幾下,然后才會穩定的變成(0),抖動的時間上面圖中也表示的是(5~10)ms,當抖動消失的時候進入了一個穩定的低電平(0),這個持續時間是看你手什么時候松開這個按鍵,在松手的時候也會產生抖動,它也不會突然變成高電平(1),也會抖動產生時間為(5~10)ms,最后,松手,
按鍵的消抖有兩種方法:
- 加個線,把這個線通過這些電路里面進行一些觸發器等等,通過一些電路來進行操作,把這個抖動進行一些過沖,然后再給我們單片機進行點上,比較麻煩!
- 通過軟體來進行一個延遲函式,把這個消抖進行操作!
🏒獨立按鍵控制LED顯示二進制
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
int main(void)
{
unsigned char LEDNum = 0;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
- 這里用 unsigned char 型別是因為:無符號字符型(所占1位元組 = 8bit位)剛好對應著8位二進制的資料,那這八位二進制的正好這個P2口和這個暫存器51單片機保持一致,
- 注意:P2口上電之后和單片機的IO上電一樣都是默認的是高電平! 1111 1111
- LEDNum取反給P2的話,其實變數取反給P2的值上它是并不會改變這個變數的值,它的值還是沒有取反的值,在等號右邊的話,它并不會改變LEDNum的值,其實就是取反當中你取反的值是右值就不會被改變,
🥍獨立按鍵控制LED燈移位
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
int main(void)
{
unsigned char LEDNum = 0;//進行初始化
P2 = 0xFE;
while(1)
{
if(P3_1 == 0) //如果當獨立按鍵K1按下的話 —— LED燈移位
{
Delay(20); //按鍵消抖
while(P3_1 == 0); //檢測松手
Delay(20); //按鍵消抖
LEDNum++; //自增++
if(LEDNum>=8)
{
LEDNum=0;
}
P2 = ~(0x01<<LEDNum);
}
if(P3_0 == 0) //第二種情況:如果當獨立按鍵K2按下的話 —— LED燈移位
{
Delay(20); //按鍵消抖
while(P3_0 == 0); //檢測松手
Delay(20); //按鍵消抖
if(LEDNum == 0)
{
LEDNum=7;
}
else
{
LEDNum--;//自減--
}
P2 = ~(0x01<<LEDNum);
}
}
}
- P2口當中的P一定是要大寫的,識別符號一定要嚴格區分大小寫!
- 當你在定義一個區域變數的時候一定要注意賦值初始值,在全域變數定義的話默認為0!
- 這里的K1和K2是接錯了,K1 = P3_1;K2 = P3_0;K3 = P3_2;K4 = P3_3;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/375032.html
標籤:其他



這些陳述句都是單片機以及變成語言比較重要的陳述句!像這個判斷陳述句if以及switch陳述句,以及while和for的回圈陳述句在單片機中都是很重要的,這些都是必須要掌握的知識點!大家可以多上手代碼,熟練掌握這些判斷陳述句和回圈陳述句,任何復雜的程式都可以由順序、選擇、回圈來進行程式代碼的實作,上面的代碼就是典型的if—else的陳述句,