專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
十年專注單片機(jī)方案開發(fā)的方案公司英銳恩,分享普通I/O口實(shí)現(xiàn)測(cè)量可調(diào)電阻,調(diào)節(jié)LED的閃爍頻率。英銳恩現(xiàn)提供服務(wù)產(chǎn)品涉及主控芯片:8位單片機(jī)、16位單片機(jī)、32位單片機(jī)及各類運(yùn)算放大器等。
//引入頭文件*********************************************************
#include "delay.h"
#include "delay.c"
#include "pic1684.h"
//輸入定義***********************************************************
#define Key RA0 //按鍵輸入
#define InRc RA1 //測(cè)量輸入
//輸出定義***********************************************************
#define RcSu TRISA1 //輸出設(shè)置
//公用變量***********************************************************
unsigned char cycle = 0; //計(jì)時(shí)母數(shù)
unsigned char coune = 0; //時(shí)間計(jì)數(shù)
//*******************************************************************
//函數(shù)名稱:port_init();
//輸入?yún)?shù):無
//輸出參數(shù):無
//功能描述:端口設(shè)置
//建造日期:2008.07.08
//*******************************************************************
void PortInit(void)
{
PORTA = 0x00; //
PORTB = 0x00; //
TRISA = 0x01; //A 口設(shè)置
TRISB = 0x00; //B 口設(shè)置
}
//*******************************************************************
//函數(shù)名稱:IdsInit();
//輸入?yún)?shù):無
//輸出參數(shù):無
//功能描述:中斷設(shè)置
//建造日期:2008.07.08
//*******************************************************************
void IdsInit(void)
{
OPTION = 0x87; //分頻因子
TMR0 = 0x3d; //定時(shí)初值
T0IE = 1; //開啟定時(shí)
GIE = 1; //準(zhǔn)許中斷
}
//*******************************************************************
//函數(shù)名稱:DischargeOut();
//輸入?yún)?shù):無
//輸出參數(shù):無
//功能描述:電容放電
//建造日期:2008.07.08
//*******************************************************************
void DischargeOut(void)
{
InRc = 0; //置低電平
RcSu = 0; //開始放電
DelayMs(1); //放電時(shí)間
}
//*******************************************************************
//函數(shù)名稱:SurveyRc();
//輸入?yún)?shù):無
//輸出參數(shù):充電時(shí)間
//功能描述:測(cè)量充電時(shí)間
//建造日期:2008.07.08
//*******************************************************************
unsigned char SurveyRc(void)
{
unsigned char count = 0; //時(shí)間計(jì)數(shù)
DischargeOut(); //電容放電
RcSu = 1; //輸入設(shè)置
while (!InRc)
{
count++; //開始計(jì)時(shí)
if (count == 100) break; //最大限時(shí)
}
return count; //返回時(shí)間
}
//*******************************************************************
//函數(shù)名稱:DataAdd(*buffer, size);
//輸入?yún)?shù):緩沖區(qū)首址, 大小
//輸出參數(shù):數(shù)據(jù)總和
//功能描述:緩沖區(qū)所有數(shù)據(jù)相加
//建造日期:2008.07.08
//*******************************************************************
unsigned int DataAdd(unsigned char *buffer, unsigned char size)
{
unsigned int add;
unsigned char i;
add = 0; //數(shù)據(jù)清零
for (i = 0; i < size; i++)
{
add += buffer[i]; //數(shù)據(jù)相加
}
return add; //返回總和
}
//*******************************************************************
//函數(shù)名稱:DataMax(*buffer, size);
//輸入?yún)?shù):緩沖區(qū)首址, 大小
//輸出參數(shù):數(shù)據(jù)最大值
//功能描述:選出緩沖區(qū)最大值
//建造日期:2008.07.08
//*******************************************************************
unsigned char DataMax(unsigned char *buffer, unsigned char size)
{
unsigned char max, i;
max = buffer[0]; //假設(shè)最大
for (i = 1; i < size; i++)
{
if (max < buffer[i]) max = buffer[i]; //對(duì)比最大
}
return max; //最大數(shù)據(jù)
}
//*******************************************************************
//函數(shù)名稱:DataMin(*buffer, size);
//輸入?yún)?shù):緩沖區(qū)首址, 大小
//輸出參數(shù):數(shù)據(jù)最小大值
//功能描述:選出緩沖區(qū)最小值
//建造日期:2008.07.08
//*******************************************************************
unsigned char DataMin(unsigned char *buffer, unsigned char size)
{
unsigned char min, i;
min = buffer[0]; //假設(shè)最小
for (i = 1; i < size; i++)
{
if (min > buffer[i]) min = buffer[i]; //對(duì)比最小
}
return min; //最小數(shù)據(jù)
}
//*******************************************************************
//函數(shù)名稱:DataEqually(idend, isor);
//輸入?yún)?shù):被除數(shù),除數(shù)
//輸出參數(shù):平均值
//功能描述:使所數(shù)據(jù)相等
//建造日期:2008.07.08
//*******************************************************************
unsigned char DataEqually(unsigned int idend, unsigned char isor)
{
return (idend / isor); //數(shù)據(jù)平均
//*******************************************************************
//函數(shù)名稱:FilterData();
//輸入?yún)?shù):無
//輸出參數(shù):平均值
//功能描述:取樣平均濾波
//建造日期: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(); //收集數(shù)據(jù)
sum = DataAdd(data, 10); //數(shù)據(jù)相加
max = DataMax(data, 10); //取最大值
min = DataMin(data, 10); //取最小值
return (DataEqually((sum - max - min), 8)); //取平均值
}
//*******************************************************************
//函數(shù)名稱:MonitorRC();
//輸入?yún)?shù):無
//輸出參數(shù):無
//功能描述:監(jiān)測(cè)電位器
//建造日期:2008.07.08
//*******************************************************************
void MonitorRC(void)
{
static unsigned char value[8];
unsigned char i, update;
update = DataEqually((DataAdd(value, 8)), 8); //數(shù)據(jù)平均
if (update != cycle) //數(shù)據(jù)變動(dòng)
{
cycle = update; //更新周期
coune = 0; //計(jì)數(shù)清零
}
for (i = 0; i < 7; i++) value[i] = value[i + 1]; //數(shù)據(jù)左移
value[7] = FilterData(); //采集數(shù)據(jù)
}
//*******************************************************************
//函數(shù)名稱:TimeInt();
//輸入?yún)?shù):無
//輸出參數(shù):無
//功能描述:定時(shí)中斷服務(wù)
//建造日期:2008.07.08
//*******************************************************************
void interrupt TimeInt(void)
{
coune++; //周期遞增
if (coune == cycle) //是否相等
{
coune = 0; //周期清零
PORTB ^= 0x80; //輸出指示
}
TMR0 = 0x3d; //定時(shí)初值
T0IF = 0; //清除標(biāo)志
}
//*******************************************************************
//函數(shù)名稱:main();
//輸入?yún)?shù):無
//輸出參數(shù):無
//功能描述:主要程序
//建造日期:2008.07.08
//*******************************************************************
void main(void)
{
PortInit(); //腳位設(shè)置
IdsInit(); //中數(shù)設(shè)置
while (1)
{
MonitorRC(); //啟動(dòng)監(jiān)測(cè)
DelayMs(5); //監(jiān)測(cè)周期
}
}
(文源網(wǎng)絡(luò),侵刪)