原创 MPLAB C18学习 简单的AD中断程序

2009-7-22 14:17 3976 1 1 分类: MCU/ 嵌入式
注意,本人新学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下的仿真结果:

e481c405-51d9-45d0-a79d-fbdbffff3508.JPG
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /3 下一条