//程序?qū)崿F(xiàn)A/D轉(zhuǎn)換功能,A/D采用中斷方式。該程序通過(guò)pic單片機(jī)p18f458的RA2模擬通道送入一直流電壓, //當(dāng)送入的直流電壓大于2.5V時(shí),與PORTD口相連的8個(gè)發(fā)光二極管閃動(dòng),當(dāng)直流電壓恢復(fù)到 //http://www.51hei.com單片機(jī)網(wǎng)提供此ad轉(zhuǎn)換程序,有問(wèn)題請(qǐng)聯(lián)系本站。 //2.5V以下時(shí),發(fā)光二極管停止閃動(dòng),且只有低四個(gè)發(fā)光。
#include "p18f458.h"
union adres { int y1; unsigned char adre[2]; }adresult; //定義一個(gè)共用體,用于存放A/D轉(zhuǎn)換的結(jié)果
unsigned char i; unsigned int j;
void InterruptHandlerHigh(void);
//系統(tǒng)各I/O口初始化子程序 void initial() { TRISD=0X00; //D口為輸出 i=0x00; }
//A/D轉(zhuǎn)化初始化子程序 void adinitial() { INTCON=0X00; //禁止總中斷和外圍中斷 ADCON0=0x51; //選擇A/D通道為RA2,打開(kāi)A/D轉(zhuǎn)換器 //在工作狀態(tài),且使A/D轉(zhuǎn)換時(shí)鐘為8tosc ADCON1=0X80; //轉(zhuǎn)換結(jié)果右移,及ADRESH寄存器的高6位為"0" //且把RA2口設(shè)置為模擬量輸入方式 PIR1bits.ADIF=0; //清除A/D轉(zhuǎn)換標(biāo)志 PIE1bits.ADIE=1; //A/D轉(zhuǎn)換中斷允許 INTCONbits.PEIE=1; //外圍中斷允許 IPR1bits.ADIP=1; //B口變位中斷高優(yōu)先級(jí) RCONbits.IPEN=1; //使能中斷優(yōu)先級(jí) PORTAbits.RA2=1; //設(shè)置RA2為輸入方式 }
//延時(shí)子程序 void delay() { for(j=5535;--j;) continue; }
//報(bào)警子程序 void alarm() { i=i^0xFF; //通過(guò)異或方式每次把i的各位值取反 PORTD=i; //D口輸出i的值 }
//高優(yōu)先級(jí)中斷向量, #pragma code InterruptVectorHigh=0x08 void InterruptVectorHigh (void) { _asm goto InterruptHandlerHigh //跳到中斷程 _endasm }
//高優(yōu)先級(jí)中斷服務(wù)程序 #pragma code #pragma interrupt InterruptHandlerHigh void InterruptHandlerHigh () { PIR1bits.ADIF=0; //清除中斷標(biāo)志 adresult.adre[0]=ADRESL; adresult.adre[1]=ADRESH; //讀取并存儲(chǔ)A/D轉(zhuǎn)換結(jié)果,A/D轉(zhuǎn)換的結(jié)果通過(guò)共 //用體的形式放入了變量y1中 if(adresult.y1>0x200) { alarm(); //如果輸入的模擬量大于2.5V(對(duì)應(yīng)數(shù)字量 //0X200h),則調(diào)用報(bào)警子程序 delay(); //調(diào)用延時(shí)子程序,使電壓檢測(cè)不要過(guò)于頻繁 } else PORTD=0XF0 ; //如果輸入的模擬量小于2.5V,則與D口相連的 //8個(gè)發(fā)光二極管的低4個(gè)發(fā)亮,表示系統(tǒng)正常 ADCON0bits.GO=1; //啟動(dòng)下一次A/D轉(zhuǎn)換 }
//主程序 main() { adinitial(); //A/D轉(zhuǎn)換初始化 initial(); //系統(tǒng)各I/O口初始化 INTCONbits.GIE=1; //總中斷允許 ADCON0bits.GO=1; //啟動(dòng)A/D轉(zhuǎn)換 while(1) { ; } //等待中斷,在中斷中循環(huán)檢測(cè)外部電壓 }
|