相信大家都见过用普通I/O口测量电阻方案,一直以来没有亲自动手制作.今天终于制作成功!实现用普通I/O测量可调电阻,调节LED闪烁频率!现与大家一起分享! 
 
//引入头文件********************************************************* 
#include          "delay.h" 
#include          "delay.c" 
#include     <pic1684.h> 
 
//输入定义*********************************************************** 
#define       Key       RA0                                //按键输入 
#define       InRc      RA1                                //测量输入                                   
 
//输出定义*********************************************************** 
#define       RcSu      TRISA1                             //输出设置 
 
//公用变量*********************************************************** 
     unsigned char cycle = 0;                              //计时母数 
     unsigned char coune = 0;                              //时间计数 
 
//******************************************************************* 
//函数名称:port_init(); 
//输入参数:无 
//输出参数:无 
//功能描述:端口设置 
//建造日期:2008.07.08 
//******************************************************************* 
void PortInit(void) 
{ 
     PORTA = 0x00;                                         // 
     PORTB = 0x00;                                         // 
   
     TRISA = 0x01;                                         //A 口设置    
     TRISB = 0x00;                                         //B 口设置 
} 
 
//******************************************************************* 
//函数名称:IdsInit(); 
//输入参数:无 
//输出参数:无 
//功能描述:中断设置 
//建造日期:2008.07.08 
//******************************************************************* 
void IdsInit(void) 
{ 
     OPTION = 0x87;                                        //分频因子 
     TMR0 = 0x3d;                                          //定时初值   
     T0IE = 1;                                             //开启定时        
     GIE = 1;                                              //准许中断 
} 
 
//******************************************************************* 
//函数名称:DischargeOut(); 
//输入参数:无 
//输出参数:无 
//功能描述:电容放电 
//建造日期:2008.07.08 
//******************************************************************* 
void DischargeOut(void) 
{ 
     InRc = 0;                                             //置低电平 
     RcSu = 0;                                             //开始放电 
 
     DelayMs(1);                                           //放电时间 
} 
 
//******************************************************************* 
//函数名称:SurveyRc(); 
//输入参数:无 
//输出参数:充电时间 
//功能描述:测量充电时间 
//建造日期:2008.07.08 
//******************************************************************* 
unsigned char SurveyRc(void) 
{ 
     unsigned char count = 0;                              //时间计数 
      
     DischargeOut();                                       //电容放电 
     RcSu = 1;                                             //输入设置 
     
     while (!InRc)  
      { 
       count++;                                            //开始计时 
       if (count == 100) break;                            //最大限时   
      } 
     
     return count;                                         //返回时间  
} 
 
//******************************************************************* 
//函数名称:DataAdd(*buffer, size); 
//输入参数:缓冲区首址, 大小 
//输出参数:数据总和 
//功能描述:缓冲区所有数据相加 
//建造日期:2008.07.08 
//******************************************************************* 
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;                                   //数据相加 
      } 
   
     return add;                                           //返回总和                    
} 
 
//******************************************************************* 
//函数名称:DataMax(*buffer, size); 
//输入参数:缓冲区首址, 大小 
//输出参数:数据最大值 
//功能描述:选出缓冲区最大值 
//建造日期:2008.07.08 
//******************************************************************* 
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) max = buffer;               //对比最大  
      } 
   
     return max;                                           //最大数据                    
} 
 
//******************************************************************* 
//函数名称:DataMin(*buffer, size); 
//输入参数:缓冲区首址, 大小 
//输出参数:数据最小大值 
//功能描述:选出缓冲区最小值 
//建造日期:2008.07.08 
//******************************************************************* 
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) min = buffer;               //对比最小  
      } 
   
     return min;                                           //最小数据 
} 
 
//******************************************************************* 
//函数名称:DataEqually(idend, isor); 
//输入参数:被除数,除数 
//输出参数:平均值 
//功能描述:使所数据相等 
//建造日期:2008.07.08 
//******************************************************************* 
unsigned char DataEqually(unsigned int idend, unsigned char isor) 
{ 
     return (idend / isor);                                //数据平均 
} 
 
//******************************************************************* 
//函数名称:FilterData();  
//输入参数:无  
//输出参数:平均值  
//功能描述:取样平均滤波 
//建造日期:2008.07.08 
//******************************************************************* 
unsigned char FilterData(void) 
{ 
     unsigned char i, max, min, data[10]; 
     unsigned int sum; 
   
     for (i = 0; i < 10; i++) data = SurveyRc();        //收集数据 
    
     sum = DataAdd(data, 10);                              //数据相加 
     max = DataMax(data, 10);                              //取最大值 
     min = DataMin(data, 10);                              //取最小值 
 
     return (DataEqually((sum - max - min), 8));           //取平均值              
}   
 
//******************************************************************* 
//函数名称:MonitorRC(); 
//输入参数:无 
//输出参数:无 
//功能描述:监测电位器 
//建造日期:2008.07.08 
//******************************************************************* 
void MonitorRC(void) 
{    
     static unsigned char value[8];  
     unsigned char i, update; 
      
     update = DataEqually((DataAdd(value, 8)), 8);         //数据平均 
 
     if (update != cycle)                                  //数据变动 
      { 
       cycle = update;                                     //更新周期 
       coune = 0;                                          //计数清零  
      }   
     
     for (i = 0; i < 7; i++) value = value[i + 1];      //数据左移 
 
     value[7] = FilterData();                              //采集数据 
} 
 
//******************************************************************* 
//函数名称:TimeInt(); 
//输入参数:无 
//输出参数:无 
//功能描述:定时中断服务 
//建造日期:2008.07.08 
//******************************************************************* 
void interrupt TimeInt(void) 
{    
     coune++;                                              //周期递增 
      
     if (coune == cycle)                                   //是否相等 
      { 
       coune = 0;                                          //周期清零 
       PORTB ^= 0x80;                                      //输出指示 
      }   
    
     TMR0 = 0x3d;                                          //定时初值 
     T0IF = 0;                                             //清除标志 
} 
 
//******************************************************************* 
//函数名称:main(); 
//输入参数:无 
//输出参数:无 
//功能描述:主要程序 
//建造日期:2008.07.08 
//******************************************************************* 
void main(void) 
{    
     PortInit();                                           //脚位设置 
     IdsInit();                                            //中数设置 
 
     while (1) 
      { 
       MonitorRC();                                        //启动监测 
       DelayMs(5);                                         //监测周期 
      }   
} 
 
  
(原文件名 ED0.jpg)  
 
  
(原文件名 ED1.jpg)  
 
  
(原文件名 ED2.jpg)  
 
点击此处下载 ourdev_343267.rar(文件大小:34K) (原文件名 ED.rar) |  
  
 
 
 
 
 |   
 |  
  
 |