<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

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

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

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

        燈飾配件中有一種控制器叫數碼分段開關,基本工作原理是利用墻壁開關通斷電來實現對多種負載的輪流亮滅,這其中就涉及到單片機如何檢測交流電掉電。首先,要把交流電的同步信號提取出來,形成單片機能識別的低壓信號,一般有2中方法,一種是直接利用電阻分壓法,把同步信號提。ㄟm合非隔離型電路)。另外一種方法是利用光耦提取隔離的交流信號。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热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮