//熟悉AD轉換模塊的使用
//軟件規(guī)劃
// 3路AD轉換結果送D口LED顯示
// 只顯示AD轉換結果的低8位
// 4次轉換結果求平均值
// 由T3按10MS時間間隔觸發(fā)采樣并轉換
// RA12,RA13,RA14決定顯示3路中哪一路送顯示(RA12 - RB4 RA13 - RB5 RA14 - RB6)
//硬件規(guī)劃
// 撥碼開關S1置ON
// 撥碼開關S2第6,7,8開
// 撥碼開關S3置ON
#include //dsPIC30F6014標準頭文件
_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍頻晶振,F(xiàn)ailsafe 時鐘關閉
_FWDT(WDT_OFF); //關閉看門狗定時器
_FBORPOR(PBOR_OFF & MCLR_EN); //掉電復位禁止,MCLR復位使能。
_FGS(CODE_PROT_OFF); //代碼保護禁止
unsigned int adresult[]={1,2,3};
void init();
void initT3();
void initad();
void adchange();
void display();
void init()
{
TRISB=0x0070; //RB4,B5,B6設置為輸入(AD輸入口),其他輸出
TRISA=0X7000; //RA12,RA13,RA14置為輸入,其他輸出
TRISD=0XFF00; //RD口低8位輸出,高8位輸入
}
void initT3()
{
T1CON=0; //T3做定時器。分頻比1:1
TMR3=0;
PR3=0X2710; //10MS時間
}
void initad()
{
ADPCFG=0xFF8F; //RB4-RB6做AD輸入口,其他位做普通I/O口
ADCON1=0X0044; //采用T3比較結束采樣并開始轉換
ADCON2=0X042C; //掃描輸入,每12個采樣中斷一次(即每個輸入采樣4次求平均數(shù))
ADCON3=0X000F; //Tad=8Tcy
ADCSSL=0X0070; //在引腳AN4,AN5,AN4掃描輸入
ADCON1bits.ADON=1; //開啟AD轉換
}
void adchange()
{
while(!IFS0bits.ADIF); //等待AD轉換完成
IFS0bits.ADIF=0; //清除AD中斷標志位
adresult[0]=ADCBUF0+ADCBUF3+ADCBUF6+ADCBUF9; //4次RB4轉換的結果和
adresult[0]=adresult[0]>>2; //平均值
adresult[1]=ADCBUF1+ADCBUF4+ADCBUF7+ADCBUFA;
adresult[1]=adresult[1]>>2;
adresult[2]=ADCBUF2+ADCBUF5+ADCBUF8+ADCBUFB;
adresult[2]=adresult[2]>>2;
}
void display()
{
PORTD=0X0000; //清除所有顯示
if(!PORTAbits.RA12) PORTD=adresult[0]&0x00ff; //RA12按下則顯示RB4轉換結果
if(!PORTAbits.RA13) PORTD=adresult[1]&0x00ff; //RA13按下則顯示RB5轉換結果
if(!PORTAbits.RA14) PORTD=adresult[2]&0x00ff; //RA14按下則顯示RB6轉換結果
}
int main (void)
{
init(); //I/O口初試化函數(shù)
initT3(); //T3初試化函數(shù)
initad(); //AD轉換初始化函數(shù)
T3CONbits.TON=1; //開啟T3定時器
while(1)
{
adchange(); //AD轉換函數(shù)
display(); //結果顯示函數(shù)
}
}