|
燈飾配件中有一種控制器叫數(shù)碼分段開(kāi)關(guān),基本工作原理是利用墻壁開(kāi)關(guān)通斷電來(lái)實(shí)現(xiàn)對(duì)多種負(fù)載的輪流亮滅,這其中就涉及到單片機(jī)如何檢測(cè)交流電掉電。首先,要把交流電的同步信號(hào)提取出來(lái),形成單片機(jī)能識(shí)別的低壓信號(hào),一般有2中方法,一種是直接利用電阻分壓法,把同步信號(hào)提取(適合非隔離型電路)。另外一種方法是利用光耦提取隔離的交流信號(hào)。2種方法如下所示:
psb(285).jpeg (50.69 KB, 下載次數(shù): 127)
下載附件
2014-2-20 22:01 上傳
光耦隔離取樣電路
psb(286).jpeg (70.3 KB, 下載次數(shù): 113)
下載附件
2014-2-20 22:01 上傳
電阻分壓取樣電路
所取得的交流信號(hào)如下圖:
psb(287).jpeg (35.75 KB, 下載次數(shù): 117)
下載附件
2014-2-20 22:01 上傳
本程序?qū)崿F(xiàn)的功能是,第一次打開(kāi)關(guān),L1亮,L2滅,第二次打開(kāi)關(guān),L1滅,L2亮,第三次打開(kāi)關(guān),L1,L2全亮,第四次打開(kāi)關(guān),L1,L2全滅,如此循環(huán)。那么,單片機(jī)檢測(cè)交流電掉電,每隔一定時(shí)間檢測(cè)一次交流信號(hào)輸入口,如果是低電平,開(kāi)始計(jì)時(shí),如果12MS-15MS之后,還是低電平,說(shuō)明交流電被斷過(guò)一次電,此時(shí)要做出相應(yīng)的控制動(dòng)作。所用單片機(jī)為PIC16F676,RA5上的腳作為交流檢測(cè)腳。RC2,RC3作為負(fù)載輸出控制端。程序如下:
#include<pic.h>
__CONFIG(0X1B4);
#define uchar unsigned char//宏定義,相當(dāng)于uchar=unsigned char
#define uint unsigned int//宏定義,相當(dāng)于uint=unsigned int
uint key2_time_cnt;//按鍵去抖計(jì)數(shù)器
uchar key2_lock;//按鍵有效標(biāo)志
uchar key2_num_s;//功能散轉(zhuǎn)變量
uchar key2_touch_s_flag;//交流斷電信號(hào)有效標(biāo)志
uint shuzi;//時(shí)標(biāo)計(jì)數(shù)變量
uchar SYS1MS;//時(shí)標(biāo)開(kāi)關(guān)標(biāo)志
void PORT_init()
{
ANSEL=0X00;//普通端口設(shè)置
CMCON=0X07;//比較器關(guān)閉
TRISA=0b00110100;
TRISC=0b00110000;
PORTC=0X00;
PORTA=0X00;
T0CS=0;//定時(shí)器內(nèi)部時(shí)鐘選擇
;
T0IF=0;//定時(shí)器中斷標(biāo)志清零
T0IE=1;//定時(shí)器中斷使能
GIE=1;//全局中斷使能
TMR0=9;//定時(shí)器初值為零
}
void key_scan2()
{
if(RA5==1)//如果RA5上按鍵沒(méi)有按下
{
key2_lock=0;//2號(hào)鍵標(biāo)志清零
key2_time_cnt=0;//去抖計(jì)數(shù)器清零
if(key2_touch_s_flag==1)//如果交流斷電信號(hào)有效
{
key2_touch_s_flag=0;//清交流信號(hào)標(biāo)志
key2_num_s++;//功能號(hào)開(kāi)始自加
if(key2_num_s>3)key2_num_s=0;//一共4種功能
}
}
else if(key2_lock==0)//如果有鍵第一次按下
{
key2_time_cnt++;//去抖計(jì)數(shù)器開(kāi)始計(jì)數(shù)
if(key2_time_cnt>149)//當(dāng)計(jì)數(shù)器值大于149,說(shuō)明低電平持續(xù)的時(shí)間大于10MS,而交流電高低電平的持續(xù)時(shí)間是8——10MS,這就表示交流電被斷電了。
{
key2_touch_s_flag=1;//交流斷電有效,標(biāo)志置一。
key2_time_cnt=0;//清去抖動(dòng)計(jì)數(shù)器
key2_lock=1;//自鎖標(biāo)志置1,避免一直觸發(fā)
}
}
}
void key_service2()
{
switch(key2_num_s)
{
case 0:
RC2=1;
RC3=0;
RA0=0;
RA1=0;
//key2_num_s=0;
break;
case 1:
RC2=0;
RC3=1;
RA0=0;
RA1=0;
//key2_num_s=0;
break;
case 2:
RC2=1;
RC3=1;
RA0=0;
RA1=0;
// key2_num_s=0;
break;
case 3:
RC2=0;
RC3=0;
RA0=0;
RA1=0;
//key2_num_s=0;
break;
}
}
void main()
{
PORT_init();
while(1)
{
if(SYS1MS==1)
{
SYS1MS=0;
key_scan2();
}
key_service2();
}
}
void interrupt isr()//定時(shí)器0中斷函數(shù)
{
if((T0IE&T0IF)==1)//判斷定時(shí)器中斷
{
T0IF=0;//清定時(shí)器中斷標(biāo)志
T0IE=0;//關(guān)定時(shí)器中斷
TMR0=9;//從9加到256所用時(shí)間是250US
shuzi++;
if(shuzi==4)
{
shuzi=0;
SYS1MS=1;
}
T0IE=1;//開(kāi)定時(shí)器中斷
}
}
本程序?qū)τ跀嚯姍z測(cè)使用了
if()
{
第一區(qū)
}
else if()
{
第二區(qū)
}
一開(kāi)始,信號(hào)高電平階段,在第一區(qū),要把各種標(biāo)志清零,同時(shí),要判斷斷電標(biāo)志是否有效,這樣做的目的是為了消除,交流電斷電瞬間單片機(jī)會(huì)出現(xiàn)誤動(dòng)作(閃燈) ,如果作為一般按鍵檢測(cè)的話(huà),這里做判斷,并且做出相應(yīng)的按鍵有效處理,實(shí)際上是,等待按鍵松手后才做有效的處理。當(dāng)有低電平到來(lái)時(shí),實(shí)際上 else if(key2_lock==0)這語(yǔ)句等同于else if((!RA5)&&(!key2_lock)),RA5為低,同時(shí)按鍵標(biāo)志沒(méi)有被置1,確定上面2個(gè)條件同時(shí)成立,說(shuō)明RA5端口起碼是低電平了,但不一定是斷電了。在第二區(qū),然后讓去抖動(dòng)計(jì)數(shù)器key2_time_cnt自加,當(dāng)計(jì)數(shù)器大于149時(shí)候,認(rèn)為斷電了(因?yàn)樵谝粋(gè)周期內(nèi)交流電低電平持續(xù)時(shí)間大概是100,所以要適當(dāng)加寬低電平判斷范圍,)此時(shí)要馬上把斷電有效標(biāo)志key2_touch_s_flag置1。
對(duì)于交流電斷電檢測(cè)功能函數(shù)key2_scan()在整個(gè)程序的位置,第一,可以直接放到定時(shí)器中斷里面,每250US執(zhí)行一次。第二,可以利用定時(shí)器設(shè)定一個(gè)時(shí)標(biāo)比如1MS的時(shí)標(biāo),主程序中,根據(jù)時(shí)標(biāo)來(lái)執(zhí)行key2_scan()函數(shù)。最好不要直接放在主循環(huán)中,這樣會(huì)漏掉按鍵檢測(cè)的某個(gè)檔位。
以上就是數(shù)碼分段器的基本控制程序。單片機(jī)交流檢測(cè)是本程序的難點(diǎn)。
|
|