|
/script> 相信大家都見過(guò)用普通I/O口測(cè)量電阻方案,一直以來(lái)沒有親自動(dòng)手制作.今天終于制作成功!實(shí)現(xiàn)用普通I/O測(cè)量可調(diào)電阻,調(diào)節(jié)LED閃爍頻率!現(xiàn)與大家一起分享! 此主題相關(guān)圖片如下:
此主題相關(guā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ù):無(wú) //輸出參數(shù):無(wú) //功能描述:端口設(shè)置 //建造日期:2008.07.08 //******************************************************************* void PortInit(void) { PORTA = 0x00; // PORTB = 0x00; // TRISA = 0x01; //A 口設(shè)置 TRISB = 0x00; //B 口設(shè)置 }
//******************************************************************* //函數(shù)名稱:IdsInit(); //輸入?yún)?shù):無(wú) //輸出參數(shù):無(wú) //功能描述:中斷設(shè)置 //建造日期:2008.07.08 //******************************************************************* void IdsInit(void) { OPTION = 0x87; //分頻因子 TMR0 = 0x3d; //定時(shí)初值 T0IE = 1; //開啟定時(shí) GIE = 1; //準(zhǔn)許中斷 }
//******************************************************************* //函數(shù)名稱:DischargeOut(); //輸入?yún)?shù):無(wú) //輸出參數(shù):無(wú) //功能描述:電容放電 //建造日期:2008.07.08 //******************************************************************* void DischargeOut(void) { InRc = 0; //置低電平 RcSu = 0; //開始放電
DelayMs(1); //放電時(shí)間 }
//******************************************************************* //函數(shù)名稱:SurveyRc(); //輸入?yún)?shù):無(wú) //輸出參數(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ù):無(wú) //輸出參數(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ù):無(wú) //輸出參數(shù):無(wú) //功能描述:監(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ù):無(wú) //輸出參數(shù):無(wú) //功能描述:定時(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ù):無(wú) //輸出參數(shù):無(wú) //功能描述:主要程序 //建造日期:2008.07.08 //******************************************************************* void main(void) { PortInit(); //腳位設(shè)置 IdsInit(); //中數(shù)設(shè)置
while (1) { MonitorRC(); //啟動(dòng)監(jiān)測(cè) DelayMs(5); //監(jiān)測(cè)周期 } } |