日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

PIC16F84A實(shí)現(xiàn)非接觸式電容觸摸感應(yīng)試驗(yàn)成功

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

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


那就費(fèi)話少說.....直接上圖...上源代碼.....

1073571218686981.rar

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

//感應(yīng)輸入***********************************************************
#define       RcIn      RA3                                //感應(yīng)輸入

//輸出定義***********************************************************
#define       RcSu      TRISA3                             //方向輸出設(shè)置  

//公用變量***********************************************************
     unsigned char follow;                                 //跟蹤校準(zhǔn)

//*******************************************************************
//函數(shù)名字; PortInit();
//輸入?yún)?shù); 無
//輸出參數(shù); 無
//功能描述; 端口設(shè)置
//建造日期; 2008年08月14日
//*******************************************************************
void PortInit(void)
{
     PORTA = 0x00;                                         //  
     PORTB = 0x00;                                         //

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

     asm("nop");                                           //放電時間
  asm("nop");                                           //精確 5uS
  asm("nop");
  asm("nop");
  asm("nop");
}
  
//*******************************************************************
//函數(shù)名字; SurveyRc();
//輸入?yún)?shù); 無
//輸出參數(shù); 無
//功能描述; 測量充電時間
//建造日期; 2008年08月14日
//*******************************************************************
unsigned char SurveyRc(void)
{
     unsigned char time = 0;                               //時間計(jì)數(shù)
    
  DischargeOut();                                       //電容放電
    
  RcSu = 1;                                             //高阻輸入
    
  while (RcIn)                                          //充電計(jì)時
   {
    time++;                                             //計(jì)時增加
    asm("nop");                                         //精確10uS
  
    if (time > 250) break;                              //最大限時                  
      }
    
     return time;                                          //返回時間
}

//*******************************************************************
//函數(shù)名字; DataAdd(*buffer, size);
//輸入?yún)?shù); 緩沖區(qū)首址, 大小
//輸出參數(shù); 數(shù)據(jù)總和
//功能描述; 緩沖區(qū)所有數(shù)據(jù)相加
//建造日期; 2008年08月14日
//*******************************************************************  
unsigned int DataAdd(unsigned char *buffer, unsigned char size)
{
     unsigned int add;
     unsigned char i;
    
     add = 0;                                              //數(shù)據(jù)清零

     for (i = 0; i < size; i++)
      {
       add += buffer[i];                                   //數(shù)據(jù)相加
      }
  
     return add;                                           //返回總和                  
}

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

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

//*******************************************************************
//函數(shù)名字; DataEqually(idend, isor);
//輸入?yún)?shù); 被除數(shù),除數(shù)
//輸出參數(shù); 平均值
//功能描述; 數(shù)據(jù)平均
//建造日期; 2008年08月14日
//*******************************************************************
unsigned char DataEqually(unsigned int idend, unsigned char isor)
{
     return (idend / isor);                                //數(shù)據(jù)平均
}

//*******************************************************************
//函數(shù)名字; FilterData();
//輸入?yún)?shù); 無
//輸出參數(shù); 平均值
//功能描述; 取樣平均濾波
//建造日期; 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();                               //收集數(shù)據(jù)
      }
  
     sum = DataAdd(data, 5);                               //數(shù)據(jù)相加
     max = DataMax(data, 5);                               //取最大值
     min = DataMin(data, 5);                               //取最小值

     return (DataEqually((sum - max - min), 3));           //取平均值                
}    
  
//*******************************************************************
//函數(shù)名字; KeyState();
//輸入?yún)?shù); 無
//輸出參數(shù); 無
//功能描述; 按鍵處理
//建造日期; 2008年08月14日
//*******************************************************************
void KeyState(void)
{
     static unsigned char release = 0;                     //釋放記數(shù)
     static unsigned char count = 0;                       //按下記數(shù)
  static unsigned char valid = 0;                       //有效標(biāo)志
  static unsigned char reach = 0;                       //長按標(biāo)志
  static unsigned char trail = 0;                       //跟蹤記數(shù)
  
  if (valid == 1)                                       //是否有效
   {
    if (FilterData() > follow)                          //按鍵按下
     {
   release = 0;                                      //釋放清零
  
   if (reach == 0)                                   //長按無效
    {
     if (++count > 5)                                //防誤處理
      {
    reach = 1;                                    //長按置位
    PORTB ^= (1 << 7);                            //取反輸出
   }
    }
  }
  
    else if (++release > 5)                             //釋放記數(shù)
  {
   valid = 0;                                        //有效清零
   reach = 0;                                        //長按清零
   count = 0;                                        //記數(shù)清零
  }
   }
  
  else
   {
    if (FilterData() > follow)
     {
   trail = 0;                                        //數(shù)據(jù)清零
      valid = 1;                                        //有效置位  
     }
  
    else
     {
      if (++trail > 200)                                //漂移跟蹤
    {
     follow = FilterData();                          //更新誤差
     PORTB ^= (1 << 6);                              //跟蹤指示
     trail = 0;                                      //數(shù)據(jù)清零
    }
     }
   }  
}
  
//*******************************************************************
//函數(shù)名字; main();
//輸入?yún)?shù); 無
//輸出參數(shù); 無
//功能描述; 主程序
//建造日期; 2008年08月14日
//*******************************************************************
void main(void)
{      
  PortInit();                                           //端口設(shè)置
  follow = FilterData();                                //讀取誤差
        
     while (1)
      {
    KeyState();                                         //按鍵處理
    DelayMs(5);                                         //定時掃描
      }  
}
全部回復(fù)(13)
正序查看
倒序查看
2008-08-14 12:11
該版本軟件對按鍵按下,釋放的時間進(jìn)行優(yōu)化,響應(yīng)時間更快,在試驗(yàn)時沒有出現(xiàn)誤動作.......在連續(xù)2S沒有檢測到按鍵,就自動更新校準(zhǔn)參數(shù)...實(shí)現(xiàn)自動跟蹤漂移...在寬電壓范圍內(nèi)都可正常工作....歡迎大家進(jìn)行公測試驗(yàn).....提供改進(jìn)建議...
0
回復(fù)
nokia1234
LV.3
3
2008-08-14 13:48
@點(diǎn)點(diǎn)滴滴
該版本軟件對按鍵按下,釋放的時間進(jìn)行優(yōu)化,響應(yīng)時間更快,在試驗(yàn)時沒有出現(xiàn)誤動作.......在連續(xù)2S沒有檢測到按鍵,就自動更新校準(zhǔn)參數(shù)...實(shí)現(xiàn)自動跟蹤漂移...在寬電壓范圍內(nèi)都可正常工作....歡迎大家進(jìn)行公測試驗(yàn).....提供改進(jìn)建議...
樓主不錯,頂起來!!!
0
回復(fù)
renad
LV.4
4
2008-08-15 21:06
@點(diǎn)點(diǎn)滴滴
該版本軟件對按鍵按下,釋放的時間進(jìn)行優(yōu)化,響應(yīng)時間更快,在試驗(yàn)時沒有出現(xiàn)誤動作.......在連續(xù)2S沒有檢測到按鍵,就自動更新校準(zhǔn)參數(shù)...實(shí)現(xiàn)自動跟蹤漂移...在寬電壓范圍內(nèi)都可正常工作....歡迎大家進(jìn)行公測試驗(yàn).....提供改進(jìn)建議...
我前幾天才想到,你應(yīng)做出來了,比用AD轉(zhuǎn)換的軟硬件成本都低.
0
回復(fù)
2008-08-16 10:40
強(qiáng)烈要求加精.....
0
回復(fù)
2008-08-21 15:16
@點(diǎn)點(diǎn)滴滴
強(qiáng)烈要求加精.....
電源網(wǎng)要是多幾個像樓主這樣的人就好了,電源網(wǎng)已經(jīng)頹廢了
0
回復(fù)
2008-08-22 09:37
@luohongzhi
電源網(wǎng)要是多幾個像樓主這樣的人就好了,電源網(wǎng)已經(jīng)頹廢了
此帖已被刪除
0
回復(fù)
whatcall
LV.5
8
2008-08-23 14:01
@點(diǎn)點(diǎn)滴滴
此帖已被刪除
君之所嘆亦是我之所哀.
缺乏原創(chuàng)力是論壇的最大不足,當(dāng)然國內(nèi)技術(shù)行業(yè)的浮躁心態(tài)也是一個重要因素.
0
回復(fù)
2008-08-24 19:53
@whatcall
君之所嘆亦是我之所哀.缺乏原創(chuàng)力是論壇的最大不足,當(dāng)然國內(nèi)技術(shù)行業(yè)的浮躁心態(tài)也是一個重要因素.
這也是電源網(wǎng)里有些人的心態(tài)有問題,前幾天我說要免費(fèi)幫人家寫個程序,有個瘋狗就咬我了,大家看他給我的短信:
fengxz: 2008-08-21 15:08
老兄,你很傻很天真
luohongzhi: 2008-08-21 15:11
我是很傻很天真,比很黃很暴力強(qiáng)多了
fengxz: 2008-08-24 14:05
不知道比我強(qiáng)多少,我覺的一個傻帽和天真的人肯定不怎樣,至少這個世界沒錢肯定強(qiáng)不了
luohongzhi: 2008-08-24 19:47
你這個狗日的我怎么得罪你了,你他媽的別給你臉不要臉
0
回復(fù)
veloce
LV.4
10
2009-03-20 14:21
人才啊,兄弟我佩服的五體投地,如果加上用定時器去讀這個值,主程序還可以再處理一些其它功能,這樣單片機(jī)的功能利用就完全了.

QQ:285730977,TEL:13510917769,方先生,希望多交流.
0
回復(fù)
huayuguo
LV.3
11
2009-04-11 08:25
點(diǎn)兄,砸有碰見你了,哈哈.
0
回復(fù)
xqtkj
LV.4
12
2009-04-11 16:00
@luohongzhi
這也是電源網(wǎng)里有些人的心態(tài)有問題,前幾天我說要免費(fèi)幫人家寫個程序,有個瘋狗就咬我了,大家看他給我的短信:fengxz:2008-08-2115:08老兄,你很傻很天真luohongzhi:2008-08-2115:11我是很傻很天真,比很黃很暴力強(qiáng)多了fengxz:2008-08-2414:05不知道比我強(qiáng)多少,我覺的一個傻帽和天真的人肯定不怎樣,至少這個世界沒錢肯定強(qiáng)不了luohongzhi:2008-08-2419:47你這個狗日的我怎么得罪你了,你他媽的別給你臉不要臉
也許你這樣做對于他來說是不可思義,因?yàn)槟忝赓M(fèi)幫人設(shè)計(jì),而他是要錢或者是很多高的報酬才能做,所以他認(rèn)為你們是天敵……
0
回復(fù)
hxdjb
LV.4
13
2009-04-15 13:04
請勿見笑.如何理解端口電容和人體電容的接法.
0
回復(fù)
hxdjb
LV.4
14
2009-04-15 13:06
@hxdjb
請勿見笑.如何理解端口電容和人體電容的接法.
忘了發(fā)圖500) {this.resized=true; this.width=500; this.alt='這是一張縮略圖,點(diǎn)擊可放大。\n按住CTRL,滾動鼠標(biāo)滾輪可自由縮放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/76/147461239771980.jpg');}" onmousewheel="return imgzoom(this);">
0
回復(fù)
發(fā)