💖 作者簡介:大家好,我是澤奀。🏆全棧領(lǐng)域新星創(chuàng)作者 ?作者周榜:81 ?總排名:6434 👑?
網(wǎng)站的建設(shè)成都創(chuàng)新互聯(lián)公司專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為成都衛(wèi)生間隔斷等企業(yè)提供專業(yè)服務(wù)。📝 個(gè)人主頁:weixin_52632755的博客_澤奀_博客
🎉 點(diǎn)贊?評(píng)論?收藏 == 養(yǎng)成習(xí)慣😊
📣 系列專欄:【51單片機(jī)】系列_澤奀的博客-博客
💬 總結(jié):希望你看完之后,能對(duì)你有所幫助,不足請(qǐng)指正!共同學(xué)習(xí)交流 🖊
???我們并非登上我們所選擇的舞臺(tái),演出并非我們所選擇的劇本。
目錄
🎃獨(dú)立按鍵介紹?
🏓獨(dú)立按鍵原理圖
🎡獨(dú)立按鍵控制LED燈亮滅
🎉C51數(shù)據(jù)運(yùn)算?
🎉C51基本語句C51數(shù)C51數(shù)據(jù)運(yùn)算C51數(shù)據(jù)運(yùn)算據(jù)運(yùn)算
🎄獨(dú)立按鍵控制LED燈狀態(tài)
🎋按鍵的抖動(dòng)
🏒獨(dú)立按鍵控制LED顯示二進(jìn)制
🥍獨(dú)立按鍵控制LED燈移位
🏓獨(dú)立按鍵原理圖
- 輕觸按鍵:相當(dāng)于是一種電子開關(guān),按下時(shí)開關(guān)接通,松開時(shí)開關(guān)斷開,實(shí)現(xiàn)原理是通過輕觸按鍵內(nèi)部的金屬彈片受力彈動(dòng)來實(shí)現(xiàn)接通和斷開。
- 英文:independent press button
- 了解:獨(dú)立按鍵具有四個(gè)"頭",獨(dú)立按鍵主要有四個(gè)部分:1、底座,2、金屬彈片(這個(gè)金屬彈片是鼓起來的,當(dāng)你按下去的時(shí)候它會(huì)變平,松手的時(shí)候又會(huì)鼓起來的),3、就是按鍵的頭,4、就是金屬的蓋子。那么在相同的兩個(gè)引腳當(dāng)中其實(shí)它就是內(nèi)部連接起來的金屬片,無論你按不按下去,它前后的兩個(gè)引腳都是連接起來的。就是始終都是具有導(dǎo)通性質(zhì)的,向外具有兩個(gè)接觸的點(diǎn)。按下的時(shí)候四個(gè)引腳全部都是連接的,松手的時(shí)候兩邊分別連接,之間是斷開的。
- 如下圖實(shí)物所示:
🎡獨(dú)立按鍵控制LED燈亮滅
- 這里總共有四個(gè)獨(dú)立按鍵,它們公共的一段都接到了GND電源的負(fù)極,另一端引出了四個(gè)編號(hào)是連接到單片機(jī)板子中的MCU上面,還有一段是接到了IO口上。如下圖所示:
- 那我們就知道了單片機(jī)上電的時(shí)候所有的IO口默認(rèn)都是高電平,那么就是當(dāng)是如果按鍵沒有按下的時(shí)候那么這個(gè)IO口保證的就是高電平,按下的話那么這個(gè)IO口就變成低電平了。寄存器會(huì)檢測IO口的電平,然后在讀回來這個(gè)寄存器當(dāng)中。如果按鍵松開"我"因該去讀取這個(gè)寄存器那么它其實(shí)就是一個(gè)高電平默認(rèn)為1的一個(gè)高電平,反之。那么根據(jù)這個(gè)現(xiàn)象我們可以得知我們的獨(dú)立按鍵是不是被按下了。
#includeint main(void)
{
while(1)
{
if(P3_1==0 || P3_0==0) //如果K1按鍵或K2按鍵按下
{
P2_0=0; //LED1輸出0,點(diǎn)亮
}
else
{
P2_0=1; //LED1輸出1,熄滅
}
}
}
🎉C51數(shù)據(jù)運(yùn)算?注意:獨(dú)立按鍵K1按鍵與K2按鍵按鍵網(wǎng)絡(luò)編號(hào)是相反的,K1=P3_1、K2=P3_0。
🎉C51基本語句C51數(shù)C51數(shù)據(jù)運(yùn)算C51數(shù)據(jù)運(yùn)算據(jù)運(yùn)算算術(shù)運(yùn)算符:加減沒什么好說的,乘法和除法注意一下符號(hào)!以及除法是取整的不是四舍五入按照數(shù)學(xué)的運(yùn)算來的,比方舉個(gè)例子:五除以二,按照數(shù)學(xué)的方式是:2.5,在C語言當(dāng)中是2取最小整數(shù),當(dāng)然這是int數(shù)據(jù)類型當(dāng)中是這個(gè)樣子。也有單精度浮點(diǎn)型(float)和雙精度浮點(diǎn)型(double)它們依舊是等于2.5的。那么取余(%)是什么意思呢?其實(shí)很簡單就是還是以五除以二的話在小學(xué)當(dāng)中是2...1,那么這個(gè)其實(shí)就是5%2=1了。再比方說102/10 = 10...2 那么102%10 = 2,所以除號(hào)與取余就是這個(gè)意思了。賦值就是把右邊得出的值或者說是結(jié)果賦值到你左邊的這個(gè)變量。
判斷運(yùn)算符:這個(gè)沒什么好說的,就是在表達(dá)式的值經(jīng)常有判斷表達(dá)式,如果你的表達(dá)式的值為真,那么就執(zhí)行表達(dá)式里面大括號(hào)(作用域)里面的內(nèi)容。在這里注意下等于的判斷表達(dá)式的符號(hào)。
邏輯運(yùn)算符:假設(shè) a = 1,b = 0;
- &&?稱為邏輯與運(yùn)算符。如果兩個(gè)操作數(shù)都非零,則條件為真。(A && B) 為假。
- ||? ?稱為邏輯或運(yùn)算符。如果兩個(gè)操作數(shù)中有任意一個(gè)非零,則條件為真 (A || B) 為真。
- !? ??稱為邏輯非運(yùn)算符。用來逆轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如果條件為真則邏輯非運(yùn)算符將使其為假。!(A && B) 為真。
位運(yùn)算:
- 按位與操作,按二進(jìn)制位進(jìn)行"與"運(yùn)算。運(yùn)算規(guī)則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
按位或運(yùn)算符,按二進(jìn)制位進(jìn)行"或"運(yùn)算。運(yùn)算規(guī)則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
異或運(yùn)算符,按二進(jìn)制位進(jìn)行"異或"運(yùn)算。運(yùn)算規(guī)則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
取反運(yùn)算符,按二進(jìn)制位進(jìn)行"取反"運(yùn)算。運(yùn)算規(guī)則:~0001 = 1110;
<
>>二進(jìn)制右移運(yùn)算符。將一個(gè)數(shù)的各二進(jìn)制位全部右移若干位,正數(shù)左補(bǔ)0,負(fù)數(shù)左補(bǔ)1,右邊丟棄。
🎄獨(dú)立按鍵控制LED燈狀態(tài)這些語句都是單片機(jī)以及變成語言比較重要的語句!像這個(gè)判斷語句if以及switch語句,以及while和for的循環(huán)語句在單片機(jī)中都是很重要的。這些都是必須要掌握的知識(shí)點(diǎn)!大家可以多上手代碼,熟練掌握這些判斷語句和循環(huán)語句。任何復(fù)雜的程序都可以由順序、選擇、循環(huán)來進(jìn)行程序代碼的實(shí)現(xiàn),上面的代碼就是典型的if—else的語句。
#includevoid 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); //延時(shí)消抖
while(P3_1==0); //松手檢測
Delay(20); //延時(shí)消抖
P2_0=~P2_0; //LED1取反
}
}
}
🎋按鍵的抖動(dòng)🏒獨(dú)立按鍵控制LED顯示二進(jìn)制
- 對(duì)于機(jī)械開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開,所以在開關(guān)閉合及斷開的瞬間會(huì)伴隨一連串的抖動(dòng)。
在按鍵閉合的時(shí)候會(huì)產(chǎn)生一些抖動(dòng),沒有按鍵按下的話它就是一個(gè)高電平(1)(單片機(jī)上電的時(shí)候所有的IO口默認(rèn)都是高電平)。在我們按下按鍵的時(shí)候它就會(huì)變成(0),并且由于它的是機(jī)械觸電會(huì)彈開,然后上下抖動(dòng)幾下,然后才會(huì)穩(wěn)定的變成(0)。抖動(dòng)的時(shí)間上面圖中也表示的是(5~10)ms。當(dāng)抖動(dòng)消失的時(shí)候進(jìn)入了一個(gè)穩(wěn)定的低電平(0),這個(gè)持續(xù)時(shí)間是看你手什么時(shí)候松開這個(gè)按鍵。在松手的時(shí)候也會(huì)產(chǎn)生抖動(dòng),它也不會(huì)突然變成高電平(1),也會(huì)抖動(dòng)產(chǎn)生時(shí)間為(5~10)ms。最后,松手。?
按鍵的消抖有兩種方法:
- 加個(gè)線,把這個(gè)線通過這些電路里面進(jìn)行一些觸發(fā)器等等,通過一些電路來進(jìn)行操作,把這個(gè)抖動(dòng)進(jìn)行一些過沖,然后再給我們單片機(jī)進(jìn)行點(diǎn)上。比較麻煩!
- 通過軟件來進(jìn)行一個(gè)延遲函數(shù),把這個(gè)消抖進(jìn)行操作!
#includevoid 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;
}
}
}
🥍獨(dú)立按鍵控制LED燈移位
- 這里用?unsigned char 類型是因?yàn)椋簾o符號(hào)字符型(所占1字節(jié) = 8bit位)剛好對(duì)應(yīng)著8位二進(jìn)制的數(shù)據(jù),那這八位二進(jìn)制的正好這個(gè)P2口和這個(gè)寄存器51單片機(jī)保持一致。
- 注意:P2口上電之后和單片機(jī)的IO上電一樣都是默認(rèn)的是高電平! 1111 1111
- LEDNum取反給P2的話,其實(shí)變量取反給P2的值上它是并不會(huì)改變這個(gè)變量的值。它的值還是沒有取反的值。在等號(hào)右邊的話,它并不會(huì)改變LEDNum的值。其實(shí)就是取反當(dāng)中你取反的值是右值就不會(huì)被改變。
#includevoid 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;//進(jìn)行初始化
P2 = 0xFE;
while(1)
{
if(P3_1 == 0) //如果當(dāng)獨(dú)立按鍵K1按下的話 —— LED燈移位
{
Delay(20); //按鍵消抖
while(P3_1 == 0); //檢測松手
Delay(20); //按鍵消抖
LEDNum++; //自增++
if(LEDNum>=8)
{
LEDNum=0;
}
P2 = ~(0x01<
- P2口當(dāng)中的P一定是要大寫的,標(biāo)識(shí)符一定要嚴(yán)格區(qū)分大小寫!
- 當(dāng)你在定義一個(gè)局部變量的時(shí)候一定要注意賦值初始值,在全局變量定義的話默認(rèn)為0!
- 這里的K1和K2是接錯(cuò)了,K1 = P3_1;K2 = P3_0;K3 = P3_2;K4 = P3_3;
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧