久久久久久久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()函數。最好不要直接放在主循環中,這樣會漏掉按鍵檢測的某個檔位。
        以上就是數碼分段器的基本控制程序。單片機交流檢測是本程序的難點。

關閉窗口

相關文章

主站蜘蛛池模板: 色噜噜色综合 | 精品99爱视频在线观看 | 欧美在线观看黄色 | 国产精品久久 | 亚洲视频在线一区 | 欧美成年人网站 | 天天天久久久 | 国产三级一区二区 | 密桃av| www.一区二区三区 | 一二三四在线视频观看社区 | 日韩国产欧美一区 | 黄视频欧美 | 99久久婷婷 | 九色国产 | 国产欧美日韩在线一区 | 成人一区二区三区 | 黄片毛片免费看 | 午夜午夜精品一区二区三区文 | 91精品国产综合久久婷婷香蕉 | 精品在线观看一区二区 | 欧美日批 | 欧美性猛交一区二区三区精品 | 精品欧美一区二区三区免费观看 | 一区二区三区精品 | 无码一区二区三区视频 | 国产乱码精品一品二品 | 免费午夜剧场 | 精品av| 久久成人av电影 | 亚洲风情在线观看 | 日韩精品久久久久久 | 在线成人免费av | 亚洲一区二区三区免费观看 | 国产成人精品久久二区二区 | 久久久99国产精品免费 | 欧美激情在线精品一区二区三区 | 在线观看日本高清二区 | 操久久 | 欧美中文字幕在线观看 | 中日av|