打印
[PIC®/AVR®/dsPIC®产品]

请教各位哥哥姐姐,关于PIC16F883单片机ADC转换后输出有误...

[复制链接]
1757|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robinny|  楼主 | 2015-6-18 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟是新手,用PIC16F883单片机控制外围电路LC震荡及线圈接收信号,将外围检测电路检测到的模拟信号送至单片机AN3端口进行AD转换,电路能够看到没有噪声的模拟信号,但是程序最后转换结果输出都是0x00FF,USART通信,使用奇校验,代码是这样的:#include<pic.h>
#include"adc.h"
#include"usart.h"
#define uchar unsigned char
#define uint  unsigned int
__CONFIG(XT & DEBUGEN & WDTDIS & LVPDIS);
uchar p,temp;
uint i;
unsigned short a_new,a_max;
void putch()
{       
       
        uchar a_maxh,a_maxl;


        a_maxh=(a_max>>8);
        a_maxl=(a_max&0X00FF);
        while(!TXIF)       
                continue;               
        TXREG = a_maxh;                       
        TXIF=0;  
        while(!TXIF)       
                continue;            
        TXREG = a_maxl;                       
}
void init_a2d(void){
        ADCON0=0;        // select Fosc/2,二分频
        ADCON1=0X80;        // select left justify result. A/D port configuration 0----右对齐?
        ADON=1;                // turn on the A2D conversion module--使能ADC
        SPBRG=11;
        TXSTA=0X24;
        TXEN=1;
        SYNC=0;
        SPEN=1;
}
/* Return an 8 bit result */
unsigned char read_a2d(){
        /*channel&=0x07;        // truncate channel to 3 bits
        ADCON0&=0xC5;        // clear current channel select
        ADCON0|=(channel<<3);        // apply the new channel select*/
        ADCON0=0X0D;
        RB0=1;
        GODONE=1;        // initiate conversion on the selected channel
        while(GODONE)continue;
        RB0=0;
        return((ADRESH<<8)+(ADRESL));        // return 8 MSB of the result
}
unsigned char compare_a2d()
{       
        uint b;
        for(b=0;b<50;b++)
        {
        a_new=read_a2d();
        if(a_new > a_max)
        a_max=a_new;
        }
        return a_max;
}
void init(void);//初始化函数
void main()
{
        init();
        TXREG=0x00;//发送数据寄存器清零
        while(!TRMT);//  TRMT:发送移位寄存器状态位
                 //  1 = TSR(发送移位寄存器)为空
                 //  0 = TSR(发送移位寄存器)为满
        while(1);
}

void init()
{
        PORTC=0Xff;
        ANS0=0;
        ANSELH=0X00;

        PORTC=0Xff;
        ANS0=0;
        ANSELH=0X00;
        .......省略了端口常规定义
        TXSTA=0x65;                //9位数据发送形式
//        TXSTA=0x24;     //8位数据发送形式
//        RCSTA=0x90;     //接收8位数据使能
        RCSTA=0xD0;                //接收9位数据使能
        SPBRG=11;
        GIE=1;  //全局中断允许
        PEIE=1; //外设中断允许
        RCIE=1; //允许ESUART接收中断
        RC1=0;  //以下为给电容充电的过程
        delay(100);
        RC1=1;
        delay(42);//给电容充电42ms,可以使电压达到充消磁电压达到36V
        RC1=0;
}
oid interrupt com(void)
{
        if(RCIF==1)         //接收到数据产生中断
        {                       
                RCIF=0;//清中断标志位
                temp=RCREG;
                        if(temp==0X00)//控制补光灯上电
                                {
                                        if(RX9D==1)
                                        {
                                                RC2=0;
                                                TX9D=0;
                                                TXREG=0X01;
                                        }       
                                }

                else if(temp==0X80)//获取磁通量
                                {
                                        if(RX9D==0)
                                        {
                                                RA0=1;
                        delay_I(370);
                        RA0=0;
                                                init_a2d();
                                                a_new=0;
                                                a_max=0;       
                                                compare_a2d();                // sample the analog value on RA0
                                                putch();
                                        }       
                                }

                while(!TXIF); /*等待发送完成*/

        }
                       
}
              这些是ADC部分的代码,参考VDD电压5v,小弟真的被困着了,描述的可能不够清晰,烦请大神帮忙,指点小弟应该怎么改动,万分感谢!
沙发
robinny|  楼主 | 2015-6-19 10:21 | 只看该作者

使用特权

评论回复
板凳
JY-DX-JY| | 2015-6-19 10:32 | 只看该作者
先把AD搞好,再加其他功能。

使用特权

评论回复
地板
mcumail| | 2015-9-17 13:24 | 只看该作者
楼上正解,建议先把AD弄好,再做其他功能,否则一旦出现问题不好检查

使用特权

评论回复
5
wangtao478552| | 2015-9-21 17:23 | 只看该作者
先把AD搞好,再加其他功能。

使用特权

评论回复
6
mahaokai| | 2015-10-22 14:54 | 只看该作者
本帖最后由 mahaokai 于 2015-11-12 10:04 编辑

你好,我们有一款兼容PIC16F883的 单片机,价格只要2块多, 有兴趣的话加我QQ给你发规格书,QQ:2355910802

EN8F883_V1.4.pdf

3.38 MB

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝