日常連載8
單片機(jī)最小系統(tǒng): 晶振:
有源晶振:信號(hào)質(zhì)量好精度高,價(jià)格較高,依賴特定的工作電壓。 無(wú)源晶振:需要外部電路,價(jià)格低,不依賴于電壓(有電壓就能起振),依賴電容,又稱為晶體。
復(fù)位電路: 1、上電復(fù)位分析 2、復(fù)位時(shí)間計(jì)算 t = 1.2RC(1.2*電阻*電容) 3、手動(dòng)復(fù)位分析 圖中R 60是當(dāng)按鍵按下的一瞬間,電容需要放電,如果沒(méi)有這個(gè)電阻,會(huì)產(chǎn)生很大的電流產(chǎn)生電磁干擾,降低系統(tǒng)的穩(wěn)定性,故加了這個(gè)電阻給電容放電保持系統(tǒng)的穩(wěn)定。
按鍵消抖的更優(yōu)方法1: http://www.360doc.com/showweb/0/0/782209534.aspx(在此網(wǎng)址有詳細(xì)介紹,這里只作簡(jiǎn)短介紹)  
單片機(jī)源程序:
- /*————備注:———————*
- 平臺(tái):Keil4 STC89C52RC
- 功能:
- 作者:西片
- 聯(lián)系方式:18724145220@163.com
- 日期:2018/ /
- 備注: 晶振12MHz
- 更有效率的消抖方法
- *——————————————————*/
-
-
- //====頭文件定義===*
- #include<reg52.h>
- #include<intrins.h>
- //=================*
-
-
- //====宏定義=======*
- #define uchar unsigned char
- #define uint unsigned int
- //=================*
-
-
- //====引腳說(shuō)明=====*
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit key1=P1^7;//將矩陣鍵盤(pán)變?yōu)楠?dú)立按鍵,讓第一行的按鍵左端均為低電平,然后通過(guò)列的一個(gè)高低電平判斷按鍵是否按下
- sbit KEY=P1^3;//第一個(gè)按鍵對(duì)應(yīng)的列
- //=================*
-
- bit KeySta=1;//按鍵狀態(tài)標(biāo)志位
-
- //====全局變量=====*
- //=================*
-
-
- //====編碼數(shù)組=====*
- uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0~F,加無(wú)顯示碼
- //=================*
-
-
- //====定時(shí)器0設(shè)定==*
- void SetT0()
- {
- TMOD=0x01;
- TH0=0xf8;
- TL0=0x30;
- EA=1;
- ET0=1;
- TR0=1;
- }
- //=================*
-
-
- //====要添加的函數(shù)=*
- //=================*
-
-
- //====主函數(shù)=======*
- void main()
- {
- bit backup = 1;//備份上一次的狀態(tài),判斷狀態(tài)是否變化,和怎樣變化。從0到1表示已經(jīng)松開(kāi),從1到0表示在按下
- uchar cnt=0;
- LSA=0;
- LSB=0;
- LSC=0;//點(diǎn)亮第一個(gè)數(shù)碼管(最右邊的)
- key1=0;
- P0=smgduan[cnt];
- SetT0();
- while(1)
- {
- if(KeySta != backup)
- {
- if(backup == 0) //從0到1的變化表示按鍵已經(jīng)松開(kāi),可以執(zhí)行操作
- {
- cnt++;
- if(cnt >= 16)
- {
- cnt = 0;
- }
- P0 = smgduan[cnt];
- }
- backup = KeySta;//記錄上一次的狀態(tài)留作下一次的對(duì)比
- }
- }
- }
- //=================*
-
-
- //====定時(shí)器0中斷==*
- void Timer0()interrupt 1
- {
- static uchar keybuf = 0xFF;//定義一個(gè)靜態(tài)變量以記錄按鍵8次狀態(tài)是否都相同,相同則為穩(wěn)定態(tài),認(rèn)定不是抖動(dòng)。按鍵掃描緩沖區(qū),保存一段時(shí)間內(nèi)的掃描值。
-
- TH0=0xf8;//每2ms刷新一次狀態(tài)記錄,刷新8次即可得到一個(gè)字節(jié)(8次)的狀態(tài)(由于人按下按鍵的最快時(shí)間一般不低于20ms,所以16ms可以滿足檢測(cè))
- TL0=0x30;
-
- keybuf = (keybuf <<1) |KEY;//移位加或進(jìn)行狀態(tài)記錄
- if(keybuf == 0x00)//八位全為0為按下轉(zhuǎn)態(tài)
- {
- KeySta = 0;
- }
- else if(keybuf == 0xFF)//八位全為1認(rèn)為彈起狀態(tài)
- {
- KeySta = 1;
- }
- else//其余情況KeySta不變,認(rèn)為抖動(dòng)狀態(tài)
- {
- }
-
- }
- //=================*
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
08-單片機(jī)最小系統(tǒng)和消抖.docx
(222.77 KB, 下載次數(shù): 10)
2018-10-5 20:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|