男女午夜激情_www.天堂av.com_亚洲综合小说区_亚洲欧美自拍视频_成年精品_久久www免费人成—看片_激情综合五月天_久久高潮视频_最新国产成人ab网站_国产精品卡一

機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發
培訓信息
贊助商
PIC16F84A實現非接觸式電容觸摸感應試驗成功
PIC16F84A實現非接觸式電容觸摸感應試驗成功
 更新時間:2009-7-22 16:39:06  點擊數:0
【字體: 字體顏色
/script>

說到電容非接觸摸技術相信大家并不陌生......

     由于人體就是導體,通過大地回路形成一個很小的電容.在人體接近感應區域時,人體電容和IO口內部的電容并聯,可以通過RC充電方式測量出這個電容,在人體沒有接近時,只有IO口內部電容,通過軟件處理后可識別是否有人體接近... 由于電容很小,所以電阻要很大才行,現在這里用4M7的電阻.......

那就費話少說.....直接上圖...上源代碼.....


此主題相關圖片如下:


此主題相關圖片如下:


此主題相關圖片如下:


此主題相關圖片如下:

//引入頭文件*********************************************************
#include   "delay.h"
#include   "delay.c"
#include      <pic1684.h>

//感應輸入***********************************************************
#define       RcIn      RA3                                //感應輸入

//輸出定義***********************************************************
#define       RcSu      TRISA3                             //方向輸出設置  

//公用變量***********************************************************
     unsigned char follow;                                 //跟蹤校準
 
//*******************************************************************
//函數名字; PortInit();
//輸入參數; 無
//輸出參數; 無
//功能描述; 端口設置
//建造日期; 2008年08月14日
//*******************************************************************
void PortInit(void)
 {
     PORTA = 0x00;                                         //  
     PORTB = 0x00;                                         //

     TRISA = 0xff;                                         //A 口設置    
     TRISB = 0x00;                                         //B 口設置
 }
 
//*******************************************************************
//函數名字; DischargeOut();
//輸入參數; 無
//輸出參數; 無
//功能描述; 電容放電
//建造日期; 2008年08月14日
//*******************************************************************
void DischargeOut(void)
 {
     RcIn = 1;                                             //置高電平
     RcSu = 0;                                             //開始放電

     asm("nop");                                           //放電時間
  asm("nop");                                           //精確 5uS
  asm("nop");
  asm("nop");
  asm("nop");
 }
 
//*******************************************************************
//函數名字; SurveyRc();
//輸入參數; 無
//輸出參數; 無
//功能描述; 測量充電時間
//建造日期; 2008年08月14日
//*******************************************************************
unsigned char SurveyRc(void)
 {
     unsigned char time = 0;                               //時間計數
    
  DischargeOut();                                       //電容放電
   
  RcSu = 1;                                             //高阻輸入
   
  while (RcIn)                                          //充電計時
   {
    time++;                                             //計時增加
    asm("nop");                                         //精確10uS
  
    if (time > 250) break;                              //最大限時                 
      }
   
     return time;                                          //返回時間
 }
 
//*******************************************************************
//函數名字; DataAdd(*buffer, size);
//輸入參數; 緩沖區首址, 大小
//輸出參數; 數據總和
//功能描述; 緩沖區所有數據相加
//建造日期; 2008年08月14日
//*******************************************************************  
unsigned int DataAdd(unsigned char *buffer, unsigned char size)
 {
     unsigned int add;
     unsigned char i;
    
     add = 0;                                              //數據清零
 
     for (i = 0; i < size; i++)
      {
       add += buffer[i];                                   //數據相加
      }
 
     return add;                                           //返回總和                  
 }

//*******************************************************************
//函數名字; DataMax(*buffer, size);
//輸入參數; 緩沖區首址, 大小
//輸出參數; 數據最大值
//功能描述; 選出緩沖區最大值
//建造日期; 2008年08月14日
//*******************************************************************
unsigned char DataMax(unsigned char *buffer, unsigned char size)
 {
     unsigned char max, i;
    
     max = buffer[0];                                      //假設最大
    
     for (i = 1; i < size; i++)
      {
       if (max < buffer[i]) max = buffer[i];               //對比最大
      }
 
     return max;                                           //最大數據                  
 }

//*******************************************************************
//函數名字; DataMin(*buffer, size);
//輸入參數; 緩沖區首址, 大小
//輸出參數; 數據最小大值
//功能描述; 選出緩沖區最小值
//建造日期; 2008年08月14日
//*******************************************************************
unsigned char DataMin(unsigned char *buffer, unsigned char size)
 {
     unsigned char min, i;
    
     min = buffer[0];                                      //假設最小
    
     for (i = 1; i < size; i++)
      {
       if (min > buffer[i]) min = buffer[i];               //對比最小
      }
 
     return min;                                           //最小數據
 }

//*******************************************************************
//函數名字; DataEqually(idend, isor);
//輸入參數; 被除數,除數
//輸出參數; 平均值
//功能描述; 數據平均
//建造日期; 2008年08月14日
//*******************************************************************
unsigned char DataEqually(unsigned int idend, unsigned char isor)
 {
     return (idend / isor);                                //數據平均
 }
 
//*******************************************************************
//函數名字; FilterData();
//輸入參數; 無
//輸出參數; 平均值
//功能描述; 取樣平均濾波
//建造日期; 2008年08月14日
//*******************************************************************
unsigned char FilterData(void)
 {
     unsigned char i, max, min, data[5];
     unsigned int sum;
 
     for (i = 0; i < 5; i++)
   {
    data[i] = SurveyRc();                               //收集數據
      }
  
     sum = DataAdd(data, 5);                               //數據相加
     max = DataMax(data, 5);                               //取最大值
     min = DataMin(data, 5);                               //取最小值

     return (DataEqually((sum - max - min), 3));           //取平均值                
 }   
 
//*******************************************************************
//函數名字; KeyState();
//輸入參數; 無
//輸出參數; 無
//功能描述; 按鍵處理
//建造日期; 2008年08月14日
//*******************************************************************
void KeyState(void)
 {
     static unsigned char release = 0;                     //釋放記數
     static unsigned char count = 0;                       //按下記數
  static unsigned char valid = 0;                       //有效標志
  static unsigned char reach = 0;                       //長按標志
  static unsigned char trail = 0;                       //跟蹤記數
 
  if (valid == 1)                                       //是否有效
   {
    if (FilterData() > follow)                          //按鍵按下
     {
   release = 0;                                      //釋放清零
  
   if (reach == 0)                                   //長按無效
    {
     if (++count > 5)                                //防誤處理
      {
    reach = 1;                                    //長按置位
    PORTB ^= (1 << 7);                            //取反輸出
   }
    }
  }
  
    else if (++release > 5)                             //釋放記數
  {
   valid = 0;                                        //有效清零
   reach = 0;                                        //長按清零
   count = 0;                                        //記數清零
  } 
   }
 
  else
   {
    if (FilterData() > follow)
     {
   trail = 0;                                        //數據清零
      valid = 1;                                        //有效置位  
     }
  
    else
     {
      if (++trail > 200)                                //漂移跟蹤
    {
     follow = FilterData();                          //更新誤差
     PORTB ^= (1 << 6);                              //跟蹤指示
     trail = 0;                                      //數據清零
    }
     }
   }  
 }
  
//*******************************************************************
//函數名字; main();
//輸入參數; 無
//輸出參數; 無
//功能描述; 主程序
//建造日期; 2008年08月14日
//*******************************************************************
void main(void)
 {      
  PortInit();                                           //端口設置
  follow = FilterData();                                //讀取誤差
        
     while (1)
      {
    KeyState();                                         //按鍵處理
    DelayMs(5);                                         //定時掃描
      }  
 }

  • 上一篇: 使用PIC單片機的低功耗的一些探討
  • 下一篇: 觸摸傳感器QST108與PIC單片機的接口設計
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發消息66821730(技術支持)點擊這里給我發消息66821730(廣告投放) 點擊這里給我發消息41031197(編輯) 點擊這里給我發消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業自行提供,該企業負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(濱江)機電一體化學會
    中國行業電子商務100強網站

    網站經營許可證:浙B2-20080178-1
    主站蜘蛛池模板: 西充县| 交口县| 讷河市| 高雄县| 西城区| 宁陵县| 禹州市| 莎车县| 罗源县| 衡阳市| 建湖县| 铅山县| 刚察县| 桃源县| 霸州市| 双辽市| 海盐县| 通州区| 屯昌县| 荥阳市| 辽源市| 武胜县| 莱阳市| 招远市| 铁力市| 府谷县| 盐池县| 文化| 上虞市| 新化县| 鹤山市| 出国| 望城县| 南宁市| 新源县| 门源| 吴忠市| 民县| 克什克腾旗| 霞浦县| 海晏县|