X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
单片机
[讨论] 大家看看使用单片机如何测量电阻值?
leslie
2009-11-30 14:53
楼主
普通I/O口实现测量可调电阻,调节LED的闪烁频率!
相信大家都见过用普通I/O口测量电阻方案,一直以来没有亲自动手制作.今天终于制作成功!实现用普通I/O测量可调电阻,调节LED闪烁频率!现与大家一起分享!
来源:PIC单片机交流论坛
点赞
回复评论 (2)
沙发
leslie
//引入头文件*********************************************************
#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); //监测周期
}
}
11111.rar
(34.21 KB)
(下载次数: 51, 2009-11-30 14:54 上传)
点赞
2009-11-30 14:54
板凳
597543289
点赞
2012-12-6 16:25
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
新手,怎么用12864去显示
求助:usrRoot已经执行完,看不到蓝屏的boot界面?
MSP430G2553比较器CAOUT怎么作为TA计数器的输入?
vhdl代码综合warning
STC89C52 RC XDATA问题
usbavrjtag cp210x_driver
2407A的调试???
精巧实用的震感报警器
E金币购买的钱包
2009年全国大学生电子设计竞赛G题低频功率放大器题解分享
你的嵌入式之旅到那步了呢?
请教大家电路板电源模块旁并联的电容问题
恩智浦在全球智能识别市场稳居领先地位
内存泄露!!
本周精彩博文分享
微波简史
给大家推荐一个福禄克本月招聘信息
求助:MSP430 每次不while(1)循环,执行到特殊位置卡死,...
multisim函数信号发生器仿真出现错误,求大神指点急
艾曼usb+cpld板
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复