注意,本人新学C18,不能保证代码质量。代码基于PIC18Fxx20系列,和PIC18Fxx2系列在寄存器上有不小差异,不能通用,具体请参照数据手册。
#include <p18cxxx.h>
#include <delays.h> //需要用到其中的延时函数
#pragma config WDT = OFF
void ADCInt(void);
#pragma code HighVecter = 0x08 //高优先级中断向量
void ADC(void)
{
_asm
goto ADCInt
_endasm
}
#pragma code
volatile union res //保存AD结果的联合
{
int resault;
unsigned char res[2];
}resault;
#pragma interrupt ADCInt //高优先级中断服务程序
void ADCInt(void)
{
resault.res[0] = ADRESH; //读取AD结果
resault.res[1] = ADRESL;
PIR1bits.ADIF = 0; //清除AD中断标志
Delay10TCYx(3); //延时,等待AD转换。根据数据手册,每次
//采集前至少需等待2*1.6μs。Delay10TCYx
//函数即为延时10xX个机器周期,在delays.h
//中定义
ADCON0bits.GO = 1; //继续下次采集
}
void main(void)
{
ADCON1bits.PCFG3 = 1; //配置引脚。此处定义AN0为模拟输入,其余
ADCON1bits.PCFG2 = 1; //均为IO口
ADCON1bits.PCFG1 = 1;
ADCON1bits.PCFG0 = 0;
ADCON1bits.VCFG1 = 0; //定义VREF+为AVDD,VREF-为AVSS
ADCON1bits.VCFG0 = 0;
ADCON0bits.CHS3 = 0; //选择通道AN0
ADCON0bits.CHS2 = 0;
ADCON0bits.CHS1 = 0;
ADCON0bits.CHS0 = 0;
ADCON2bits.ADCS2 = 0; //选择时钟分频,此处为8分频
ADCON2bits.ADCS1 = 0;
ADCON2bits.ADCS0 = 1;
ADCON2bits.ADFM = 1; //把转换结果设置为右对齐(高位置0)
ADCON0bits.ADON = 1; //打开AD转换
PIR1bits.ADIF = 0; //清除AD中断标志
PIE1bits.ADIE = 1; //使能AD中断
INTCONbits.PEIE = 1; //打开外部中断使能
INTCONbits.GIE = 1; //打开全局中断使能
Delay10TCYx(3); //延时等待采集结束
ADCON0bits.GO = 1; //开始转换
while(1);
}
在Proteus下的仿真结果:
文章评论(0条评论)
登录后参与讨论