A/D转换的应用 A/D转换初始化程序 //A/D转换初始化子程序 void adinitial( ) { ADCON0 = 0x51; //选择A/D通道为RA2,打开A/D转换器 //在工作状态,且使AD转换时钟为8tosc ADCON1 = 0X80; //转换结果右移,及ADRESH寄存器的高6位为"0" //且把RA2口设置为模拟量输入方式 PIE1 = 0X00; PIE2 = 0X00; ADIE = 1; //A/D转换中断允许 PEIE = 1; //外围中断允许 TRISA2=1; //设置RA2为输入方式 } 程序清单 下面给出一个调试通过的例程,可作为读者编制程序的参考。该程序中用共用体的方式把A/D转换的10位结果组合在一起。有关共用体的详细资料请参考本书相关章节。 # include <pic.h> union adres {int y1; unsigned char adre[2]; }adresult; //定义一个共用体,用于存放A/D转换的结果 unsigned char i; unsigned int j; //系统各I/O口初始化子程序 void initial() { TRISD=0X00; //D口为输出 i=0x00; } //A/D转化初始化子程序 void adinitial() { ADCON0=0x51; //选择A/D通道为RA2,打开A/D转换器 //在工作状态,且使A/D转换时钟为8tosc ADCON1=0X80; //转换结果右移,及ADRESH寄存器的高6位为"0" //且把RA2口设置为模拟量输入方式 PIE1=0X00; PIE2=0X00; ADIE=1; //A/D转换中断允许 PEIE=1; //外围中断允许 TRISA2=1; //设置RA2为输入方式 } //延时子程序 void delay() { for(j=5535;--j;) continue; } //报警子程序 void alarm() { i=i^0xFF; //通过异或方式每次把i的各位值取反 PORTD=i; //D口输出i的值 } //中断服务程序 void interrupt adint(void) { ADIF=0; //清除中断标志 adresult.adre[0]=ADRESL; adresult.adre[1]=ADRESH; //读取并存储A/D转换结果,A/D转换的结果通过共 //用体的形式放入了变量y1中 if(adresult.y1>0x200) { alarm(); //如果输入的模拟量大于2.5V(对应数字量 //0X200h),则调用报警子程序 delay(); //调用延时子程序,使电压检测不要过于频繁 } else PORTD=0XF0 ; //如果输入的模拟量小于2.5V,则与D口相连的 //8个发光二极管的低4个发亮,表示系统正常 ADGO=1; //启动下一次A/D转换 } //主程序 main() { adinitial(); //A/D转换初始化 initial(); //系统各I/O口初始化 ei(); //总中断允许 ADGO=1; //启动A/D转换 while(1) { ; } //等待中断,在中断中循环检测外部电压 }
|