技术热线: 4007-888-234
设计开发

专注差异化嵌入式产品解决方案 给智能产品定制注入灵魂给予生命

开发工具

提供开发工具、应用测试 完善的开发代码案例库分享

技术支持

从全面的产品导入到强大技术支援服务 全程贴心伴随服务,创造无限潜能!

新品推广

提供新的芯片及解决方案,提升客户产品竞争力

新闻中心

提供最新的单片机资讯,行业消息以及公司新闻动态

普通IO口实现测量可调电阻,调节LED闪烁频率

更新时间: 2019-03-23
阅读量:2725

十年专注单片机方案开发的方案公司英锐恩,分享普通I/O口实现测量可调电阻,调节LED的闪烁频率。英锐恩现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。

//引入头文件*********************************************************
#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[i];                                   //数据相加
      }
  
     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[i]) max = buffer[i];               //对比最大 
      }
  
     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[i]) min = buffer[i];               //对比最小 
      }
  
     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[i] = 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[i] = 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);                                         //监测周期
      }  
 } 

(文源网络,侵删)