stc15f104實現(xiàn)觸摸開關(guān)
想做個觸摸打開,延時關(guān)斷的小控制器
用普通的輕觸開關(guān)似乎很難看,而且開關(guān)也不方便 固定,總不好把控制板放在外面吧?
想使用觸摸的開關(guān),網(wǎng)上搜索了好久沒找到合適的,stc官方文檔上有個電容感應(yīng)開關(guān)
需要占用2個io,一個產(chǎn)生pwm信號,一個用于ad判斷,另外還需要2個電阻2個二極管和1個電容。
感覺有點復(fù)雜了,嘗試了一下,最后只用了一個io口,一個電阻和一個電容搞定了。
思路是這樣的:
一個2M電阻接電源和IO口(我用了p3.3)
一個33p電容接IO口和地。
IO口接一根線到金屬片什么的用來觸摸。
p3.3置0先把電容的電放掉,然后置高阻態(tài),這時候電源會通過電阻給電容充電,
時間常數(shù)2M*33p約66μs,使用定時器統(tǒng)計io口變成高電平的時間,
不用計時器的話擔(dān)心受中斷的影響,會有誤差。
這個時間可能需要做平滑處理避免干擾。
開機(jī)的時候沒有人觸摸,記錄下這個時候充電時間做為基準(zhǔn)。
如果有人觸摸,則充電時間加長,所以定時檢測下這個充電時間,
發(fā)現(xiàn)充電時間比基準(zhǔn)充電時間長很多(我用了2倍基準(zhǔn)時間來比較),就可以認(rèn)為是有人觸摸了。
已經(jīng)完工投入使用,目前看可靠性、抗干擾能力都可以滿足要求。
void mw(){//主工作循環(huán)
unsigned int i;
static unsigned int cdsj=0,bzz;//充電時間,標(biāo)準(zhǔn)值
static unsigned char csh=10;//初始化計數(shù)
T2H=T2L=0;//計數(shù)器2計數(shù)值初始化為0
P3M1 |=0x8;//p3.3置開漏狀態(tài)
P3M0 |=0x8;//
P3_3=0;//p3.3輸出清0
delay(100);
P3M1 |=0x8;//p3.3置高阻狀態(tài)
P3M0 &=0xf7;//
AUXR |= 0x10;
//開始計數(shù)器2運行
P3_3=1;//p3.3輸出為1,輸入狀態(tài)
IE1=0;//清外部中斷1的狀態(tài)
EX1=1;//打開外部中斷1
while(EX1);//外部中斷未執(zhí)行完畢循環(huán)等待
i=cdsj>>3;
cdsj=cdsj-i+T2L;//平滑處理
if(csh){
csh--;
if(csh==0){//初始10次計數(shù)結(jié)束,取當(dāng)前值為標(biāo)準(zhǔn)值
bzz=i+i;
};
return;
};
if(i>bzz){
此條件滿足表明開關(guān)被觸摸
};
}