久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機檢測交流電掉電程序(數碼分段開關)

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年03月01日   【字體:

燈飾配件中有一種控制器叫數碼分段開關,基本工作原理是利用墻壁開關通斷電來實現對多種負載的輪流亮滅,這其中就涉及到單片機如何檢測交流電掉電。首先,要把交流電的同步信號提取出來,形成單片機能識別的低壓信號,一般有2中方法,一種是直接利用電阻分壓法,把同步信號提取(適合非隔離型電路)。另外一種方法是利用光耦提取隔離的交流信號。2種方法如下所示:


光耦隔離取樣電路


電阻分壓取樣電路

所取得的交流信號如下圖:


本程序實現的功能是,第一次打開關,L1亮,L2滅,第二次打開關,L1滅,L2亮,第三次打開關,L1,L2全亮,第四次打開關,L1,L2全滅,如此循環。那么,單片機檢測交流電掉電,每隔一定時間檢測一次交流信號輸入口,如果是低電平,開始計時,如果12MS-15MS之后,還是低電平,說明交流電被斷過一次電,此時要做出相應的控制動作。所用單片機為PIC16F676,RA5上的腳作為交流檢測腳。RC2,RC3作為負載輸出控制端。程序如下:

#include<pic.h>
__CONFIG(0X1B4);
#define uchar unsigned char//宏定義,相當于uchar=unsigned char
#define uint unsigned int//宏定義,相當于uint=unsigned  int

 


uint key2_time_cnt;//按鍵去抖計數器
uchar key2_lock;//按鍵有效標志
uchar key2_num_s;//功能散轉變量
uchar key2_touch_s_flag;//交流斷電信號有效標志
uint shuzi;//時標計數變量
uchar SYS1MS;//時標開關標志

void PORT_init()
{
ANSEL=0X00;//普通端口設置
CMCON=0X07;//比較器關閉
TRISA=0b00110100;
TRISC=0b00110000;
PORTC=0X00;
PORTA=0X00;
T0CS=0;//定時器內部時鐘選擇
;
T0IF=0;//定時器中斷標志清零
T0IE=1;//定時器中斷使能
GIE=1;//全局中斷使能
TMR0=9;//定時器初值為零
}

void key_scan2()
{
if(RA5==1)//如果RA5上按鍵沒有按下
{
  key2_lock=0;//2號鍵標志清零
  key2_time_cnt=0;//去抖計數器清零
  if(key2_touch_s_flag==1)//如果交流斷電信號有效
  {
    
      key2_touch_s_flag=0;//清交流信號標志
      key2_num_s++;//功能號開始自加
      if(key2_num_s>3)key2_num_s=0;//一共4種功能
  }

}
else if(key2_lock==0)//如果有鍵第一次按下
{
   key2_time_cnt++;//去抖計數器開始計數
   if(key2_time_cnt>149)//當計數器值大于149,說明低電平持續的時間大于10MS,而交流電高低電平的持續時間是8——10MS,這就表示交流電被斷電了。
  {
     key2_touch_s_flag=1;//交流斷電有效,標志置一。
     key2_time_cnt=0;//清去抖動計數器
     key2_lock=1;//自鎖標志置1,避免一直觸發
    
  }
}
}

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()//定時器0中斷函數
{
      if((T0IE&T0IF)==1)//判斷定時器中斷
  {  
      T0IF=0;//清定時器中斷標志
            T0IE=0;//關定時器中斷
            TMR0=9;//從9加到256所用時間是250US
            shuzi++;
            if(shuzi==4)
            {
               shuzi=0;
               SYS1MS=1;
            }
          
           
            T0IE=1;//開定時器中斷
  }
}

 

本程序對于斷電檢測使用了
if()
{
第一區
}
else if()
{
第二區
}

        一開始,信號高電平階段,在第一區,要把各種標志清零,同時,要判斷斷電標志是否有效,這樣做的目的是為了消除,交流電斷電瞬間單片機會出現誤動作(閃燈) ,如果作為一般按鍵檢測的話,這里做判斷,并且做出相應的按鍵有效處理,實際上是,等待按鍵松手后才做有效的處理。當有低電平到來時,實際上 else if(key2_lock==0)這語句等同于else if((!RA5)&&(!key2_lock)),RA5為低,同時按鍵標志沒有被置1,確定上面2個條件同時成立,說明RA5端口起碼是低電平了,但不一定是斷電了。在第二區,然后讓去抖動計數器key2_time_cnt自加,當計數器大于149時候,認為斷電了(因為在一個周期內交流電低電平持續時間大概是100,所以要適當加寬低電平判斷范圍,)此時要馬上把斷電有效標志key2_touch_s_flag置1。
      對于交流電斷電檢測功能函數key2_scan()在整個程序的位置,第一,可以直接放到定時器中斷里面,每250US執行一次。第二,可以利用定時器設定一個時標比如1MS的時標,主程序中,根據時標來執行key2_scan()函數。最好不要直接放在主循環中,這樣會漏掉按鍵檢測的某個檔位。
        以上就是數碼分段器的基本控制程序。單片機交流檢測是本程序的難點。

關閉窗口

相關文章

主站蜘蛛池模板: 在线观看成人免费视频 | 欧美一区二区三区视频 | 亚洲va国产日韩欧美精品色婷婷 | 国产精品一区二区在线免费观看 | 欧美中文在线 | 亚洲精品高清视频在线观看 | 欧美日韩综合 | 欧美日韩精品久久久免费观看 | 亚洲一区视频在线 | 日韩色综合 | 久草免费电影 | 国产精品一区二区久久精品爱微奶 | 成年人在线视频 | 午夜天堂精品久久久久 | 中文字幕 国产精品 | 久久涩涩| 亚洲在线久久 | 福利国产 | 羞羞视频在线观看免费观看 | 一级黄色在线 | 99久久亚洲| 99re热精品视频 | 久久人人网 | 亚洲成人久久久 | 日韩a v在线免费观看 | 国产精品a久久久久 | 欧美精品一二三 | av一区在线 | 日韩欧美在线播放 | 人人叉 | 男人天堂手机在线视频 | 第四色播日韩第一页 | 国产美女视频黄a视频免费 国产精品福利视频 | 日韩影院在线观看 | 91高清免费观看 | 国产电影一区二区 | 久草青青 | 999久久久国产精品 欧美成人h版在线观看 | 国产精品污www在线观看 | 精品久久久久久久久久久 | 久久国产精品72免费观看 |