1. 程式人生 > >PIC18F4520微控制器AD轉換程式與註釋

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;
}