打印

两路AD转换 有问题求教大侠们!

[复制链接]
811|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jxwhf2007|  楼主 | 2014-8-3 22:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<pic.h>
#include<eeprom_routines.h>
#define uchar unsigned char
#define uint  unsigned int

__CONFIG(0xFF32);

uint initnum;                                //定义一个溢出中断的变量
uchar receive;
uchar SJ;                                        //eeprom数据
uchar AD_HIGH,AD_LOW;                //AD转换结果
uint  adval;                                //16位AD转换结果

bit flag;
bit flag_write;

//-------------------------------------------------------
//延时子程序
void delay(uint dat)
{
        unsigned int k;
        for(k=0;k<dat;k++);
}
//--------------------------------------------------------------------------------
void init()                       
{
//-----------普通I/O口设置---------------------------------------------------------
//        ADCON0=0X00;                //关闭PORTA及E口AD功能
//        ADCON1=0X06;                //PORTA口及E口全设置为I/O口
//--------------------------------------------------------------------------------
//----------AD口设置---------------------------------------------------------------
        ADCON0=0X41;                //转换速度FOSC/8,选择模拟通道0(RA0/AN0),使能AD功能
        ADCON1=0X84;                //右对齐,端口配置RA0/RA1/RA3为A口,其余为D口
        AD_HIGH=0X00;
        AD_LOW=0X00;
        adval=0x0000;
        delay(1200);
//---------------------------------------------------------------------------------
        CMCON=0x07;                //比较器关闭,RA0-RA3为IO
        CVRCON=0x00;                //比较器电源关闭       
       
        TRISA=0B00001011;                //RA0/AN0/RA1/RA3口作为模拟口,设置为输入
        TRISB=0x00;
        TRISC=0XCF;                //串口用时 RC7/RC6必须是输入
        TRISD=0X00;                               
        TRISE=0X00;

        PORTA=0X3F;
        PORTB=0XFF;
        PORTC=0XFF;
        PORTD=0XFF;
        PORTE=0X07;
       
        INTCON=0xc0;                                //设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第一外设允许中断
        PIE1=0x01;                                //使能定时器1为00000001开中断,始终只用一最后一个其他的不用理会
        TMR1L=(65536-50000)%256;        //装初傎,因为定时器1是16位的,要装满65536个数后才满加1(也就是65536us),如果设50ms(50000us)就加1,则要先装一个初值65536-50000
        TMR1H=(65536-50000)/256;        //又因为要将初值分开装在低八位和高位里,而八位只有256个数,所以对256求模得整数看有多少个256装在高八位,余下的属于低八位的就求余
        T1CON=0x01;                                //00000001在初始化中只用到最后一位就是开始启到动定时器1(设置预分频器和后分频器)
        flag=0;
        SJ=0xFF;
        flag_write=0;


        SPBRG=71;                        //设置波特率为9600BPS
        TXSTA=0X24;                //使能串口发送,选择高速波特率                //0010 0100
        RCSTA=0X90;                //使能串口工作,连续接收                        //1001 0000
        RCIE=1;                        //使能接收中断                                        //0000 0001
        RC5=0;

        receive=0xff;
}
//-----------AD转换------------------------------------------
void AD_ZH(void)
{
        GO_DONE=1;
        while(GO_DONE);
        AD_HIGH=ADRESH;
        AD_LOW=ADRESL;
        adval=AD_HIGH;
        adval=adval<<8|AD_LOW;
}
//-------------------------中断-----------------------------------------------------
void interrupt time1()                        //定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{   
        if(TMR1IF)  
                {                                                                
                 TMR1IF=0;                                                //先清零,同时知道是用TMR1定时器
                 TMR1L=(65536-50000)%256;                //也要重新装一次初值,从这个初值的基础上加
                TMR1H=(65536-50000)/256;
                initnum++;                                        //加一
                if(initnum==60)                                //它每50ms产生溢出中断,20次则是一秒
                        {
                        initnum=0;                                //到了1s后清零
                           flag=1;                                        //取反,再到第二次溢出又取反电平
                        }
                }
        if(RCIE&&RCIF)                                        //判断是否为串口接收中断
                {
                RCIF=0;
                receive=RCREG;                                //接收数据并存储
                flag_write=1;
                RC5=1;
                TXREG=receive;
                while(!TRMT);                       
                RC5=0;
                }
}
//-------------------------------------------------------------------------------
void main()               
{
        init();
        SJ=EEPROM_READ(0);
        RC4=0;
        delay(10000);
        RC4=1;
         while(1)
        {
        PORTB=SJ;
//-------------------------------------------------
        if(adval>512)                RE0=0;
        else                        RE0=1;
//--------------------------------------------------
        if((flag_write==1)&&(RC0==0))
                {
                flag_write=0;
                EEPROM_WRITE(0,receive);
                RC4=0;       
                delay(10000);
                SJ=EEPROM_READ(0);
                RC4=1;
//-------------------------------------------------
                ADCON0=0X41;
                AD_ZH();
                RC5=1;
                TXREG=AD_HIGH;
                while(!TRMT);       
                TXREG=AD_LOW;
                while(!TRMT);       
                RC5=0;
//-----------------------------------------------
                ADCON0=0X49;
                AD_ZH();
                RC5=1;
                TXREG=AD_HIGH;
                while(!TRMT);       
                TXREG=AD_LOW;
                while(!TRMT);       
                RC5=0;
                }               
        if(flag==1)
                {
                flag=0;
//                RA1=!RA1;
                RA2=!RA2;
//                RA3=!RA3;
                RA4=!RA4;
                RA5=!RA5;
                RE1=!RE1;
                RE2=!RE2;
                PORTD=~PORTD;
                }
        }
}

本人是PIC初学者,学习AD转换时,当只设置RA0口为A口时,AD转换功能正常,当按如上程序设计时,RA0和RA1转换时,结果就有相互影响,不知道为什么,请教大侠们什么问题,研究了很久,无果!!
沙发
tozxq| | 2014-8-4 08:43 | 只看该作者
建议你修改程序顺序如下:
调用AD转换-->切换通道-->延时等待-->调用AD转换-->切换通道-->延时等待--
<--------------------------------------------------------------------   循环回去

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

37

帖子

0

粉丝