小弟是新手,用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,小弟真的被困着了,描述的可能不够清晰,烦请大神帮忙,指点小弟应该怎么改动,万分感谢!
|