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