PIC單片機的A/D轉(zhuǎn)換
//A/D轉(zhuǎn)換
//★★★★★★★★★A/D轉(zhuǎn)換★★★★★★★★★★★\
//單片機型號:PIC16F877A
//功能描述:選擇RAO做為模擬輸入通道;
// 連續(xù)轉(zhuǎn)換5次再求平均值做為轉(zhuǎn)換結(jié)果
// 最后結(jié)構(gòu)只取低8位
// 結(jié)果送數(shù)碼管的低3位顯示
#include
__CONFIG(0xf73a); //芯片配置字
const char disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90};//0~9譯碼
void display(int x); //顯示子程序
//===============================================================================
//函數(shù)功能:延時子程序
//函數(shù)名稱:void delay()
void delay()
{
int i;
for(i=0x100;i>0;i--);
}
//===============================================================================
//函數(shù)功能:初始化子程序
//函數(shù)名稱:void init()
void init()
{
PORTA=0xff; //讓數(shù)碼管都不工作
PORTD=0xff; //清數(shù)碼管顯示
TRISA=0x01; //PA1作為輸入,其他口作為輸出,用作數(shù)碼管位選
TRISD=0x00; //PD口作為輸出,用作數(shù)碼管段選
ADCON1=0x8e; //轉(zhuǎn)換結(jié)果左對齊,RA0做模擬輸入口,其它做普通I/O
ADCON0=0x41; //系統(tǒng)時鐘Fosc/8,選擇RA0通道,允許ADC工作
delay(); //保證采樣延時
}
//===============================================================================
//函數(shù)功能:顯示子程序
//函數(shù)名稱:void display(int x)
void display(int x)
{
int bai,shi,ge,temp; //定義4個臨時變量
temp=x; //暫存AD轉(zhuǎn)換的結(jié)果
bai=temp/100; //求顯示的百位
shi=(temp%100)/10; //求顯示的十位
ge=(temp%100)%10; //求顯示的個位
PORTA=0x37; //RA3輸出低電平,點亮百位顯示
PORTD=disp[bai]; //查表得百位顯示的代碼
delay(); //延時一定時間,保證顯示亮度
PORTA=0x2f; //RA4輸出低電平,點亮十位顯示
PORTD=disp[shi]; //查表得十位顯示的代碼
delay(); //延時一定時間,保證亮度
PORTA=0x1f; //RA5輸出低電平,點亮個位顯示
PORTD=disp[ge]; //求個位顯示的代碼
delay(); //延時一定時間,保證亮度
}
//===============================================================================
//函數(shù)功能:主程序
//函數(shù)名稱:main()
main()
{
int result=0x00; //定義轉(zhuǎn)換結(jié)果寄存器
while(1) //死循環(huán)
{
int i; //定義循環(huán)次數(shù)控制寄存器
result=0x00; //轉(zhuǎn)換結(jié)果清0
for(i=5;i>0;i--) //求5次轉(zhuǎn)換結(jié)果的平均值
{
init(); //調(diào)用初始化函數(shù)
ADGO=0x1; //開啟轉(zhuǎn)換過程
while(ADGO) //等待轉(zhuǎn)換完成
result=result+ADRESL; //累計轉(zhuǎn)換結(jié)果
}
result=result/5; //求5次結(jié)果的平均值
display(result); //調(diào)用顯示函數(shù)
}
}