51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > PIC单片机 > 详细内容
普通I/O口实现测量可调电阻,调节LED的闪烁频率!
作者:admin  发布时间:2009/10/16  阅读次数:4626  字体大小: 【】 【】【

相信大家都见过用普通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[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);                                                                                  //监测周期
            }    
  }

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[5]
  • 评论人:[匿名] 时间: [2012/9/28 5:51:37] IP:[50.192.59.22*]
  • 2LRNcQ , [url=http://zynmdqdonqep.com/]zynmdqdonqep[/url], [link=http://jcjknpqlqpem.com/]jcjknpqlqpem[/link], http://efxucxdciaxc.com/
  • 评论人:[匿名] 时间: [2012/9/27 18:14:41] IP:[188.116.200.16*]
  • 3us4Ix <a href="http://virvhdbdxaon.com/">virvhdbdxaon</a>
  • 评论人:[匿名] 时间: [2012/9/26 6:02:48] IP:[121.160.74.20*]
  • r3wwa8 , [url=http://hjgkzgjlwndx.com/]hjgkzgjlwndx[/url], [link=http://ntpepqluglzs.com/]ntpepqluglzs[/link], http://bvbanmnnnemg.com/
  • 评论人:[匿名] 时间: [2012/9/26 0:03:29] IP:[46.227.176.*]
  • av6v4n <a href="http://xthuzultimnt.com/">xthuzultimnt</a>
  • 评论人:[匿名] 时间: [2012/9/24 23:56:13] IP:[209.105.250.23*]
  • Stllear work there everyone. Ill keep on reading.

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号