PIC18F4520微控制器AD轉換程式與註釋
/*包含標頭檔案:
該標頭檔案位於D:\Program Files\Microchip\mplabc18\v3.40\h下,這下面是不同型號的微控制器
的標頭檔案定義,使用時把相應的標頭檔案包含進來就可以了
*/
#include<p18f4520.h>
const unsigned char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共陰型資料管0-9的欄位碼,共陽的我沒有寫,用到時可以再改
/**************************************************************
功能:延時函式
引數:unsigned 16位數,取值範圍0-65535
*/
void delay(unsigned dly)
{
unsigned char temp=200;
for(;temp>0;temp--)
for(;dly>0;dly--);
}
/*************************************************************
功能:片上AD轉換器初始化設定函式
引數:無
說明:設定使用通道0進行AD轉換,轉換後的資料採用右對齊的格式
ADCON1與ADCON2的設定的意義可參看晶片說明書
*/
void init_ad()
{
// TRISA=0X07;//這個可以註釋掉,沒有用
ADCON1=0X0C;
ADCON2=0X94;
ADCON0bits.ADON=1;
// ADCON0bits.CHS0=0;//可通過位設定來選擇AD轉換通道
// ADCON0bits.CHS1=0;
// ADCON0bits.CHS2=0;
ADCON0bits.CHS=1;//也可以使用CHS來設定AD轉換的通道,當然也可以同進進行多路AD轉化
//只需要簡單地修改get_result函式即可。
}
/*************************************************************
功能:獲取AD轉換結果函式
引數:返回16位轉換結果資料--只有低10位是有效的轉換資料
*/
unsigned int get_result()
{
unsigned int dat=0;
ADCON0bits.GO_DONE=1;
while(ADCON0bits.GO_DONE);
PIR1bits.ADIF=0;
dat=ADRESH;
dat=dat<<8;
dat =dat+ADRESL;
return dat;
}
/*************************************************************
功能:數碼管顯示函式
引數:無符號型char
說明:引數為i*5/1024 *10,顯示時程式自動在第一個數碼管後加了個小數點,所以傳入的引數
會乘以10,如些做是為了方便顯示資料
*/
void disp_num(unsigned char tmp)
{
unsigned char i=0;
/*如果在實物電路板中使用時,當發生資料碼顯示亮度不合適時,可以修改for迴圈中的i<**,
增大或減小**;或者修改for迴圈過程中呼叫的delay函式的引數,調整延時時間
*/
for(i=0;i<30;i++)
{
PORTCbits.RC0=0;
PORTD=seg[tmp%10];
delay(100);
PORTCbits.RC0=1;
PORTCbits.RC1=0;
PORTD=seg[tmp/10]|0x80;
delay(100);
PORTCbits.RC1=1;
}
}
/*******************************************************************
功能:數碼管引腳初始化函式
引數:無
說明:模擬中使用的數碼管為共陰型,使用微控制器的D口作為段碼,使用C口的0,1位作為位選碼
*/
void init_num()
{
TRISD=0x00;
TRISCbits.TRISC0=0;
TRISCbits.TRISC1=0;
PORTCbits.RC0=1;
PORTCbits.RC1=1;
}
/*main函式*/
int main()
{
unsigned int tmp=0;
unsigned char i=0;
init_num();
init_ad();
while(1)
{
tmp=get_result();
disp_num(tmp*50/1024);
/*
關於上面disp_num函式的引數的說明:
可定義一個1024個元素的陣列,然後把i*50/1024取整後對號放到這
個數組中,然後通過查表來得到欲顯示的資料,這樣可以減少微控制器的運算時間,
同時顯示誤差更小,但是會增大儲存空間的開銷。
當然也可以增加資料管的位數,比如使用4個數碼管來顯示,但程式需要小做修改。
*/
}
return 0;
}