金牌会员
- 积分
- 1084
- 威望
- 595
- 贡献
- 203
- 兑换币
- 48
- 注册时间
- 2011-8-1
- 在线时间
- 143 小时
|
本人新手,想把AD模块转换过来得值通过串口发在电脑上显示,主函数除了初始化外如下:
for(;;)
{
while(!ATD0STAT2_CCF0); // 等待转换结束while(ATDOSTAT2_CCF0==1)
while(!SCI0SR1_TDRE);
SCI0DRL=ATD0DR0L;
}
但是在AD0通道不接任何模拟量的情况下,串口上显示的确实FC 而非00
接在其他通道同样如此,求解高手指点一二
完整源程序如下:
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define unint unsigned int
/*****延时***********/
void delay(unint n) {
while(n--);
}
void long_delay(unint i,unint j) {
while(i--) delay(j);
}
/******SCI初始化***************/
void SCI_init()
{
SCI0CR1=0X00;
SCI0CR2=0X0C; //发送器,接收器使能
SCI0BDH=0X00;
SCI0BDL=0X34; //总线时钟8MHZ,波特率为9600
}
//--------------初始化函数----------------//
//-----时钟初始化程序--------//
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{ //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1; //总线时钟=48/2=24MHz
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x80;
}
//-----ATD初始化程序--------//
void AD_Init(void)
{
ATD0CTL1=0x00; //选择AD通道为外部触发,8位精度,采样前不放电
ATD0CTL2=0x40; //标志位自动清零,禁止外部触发, 禁止中断
ATD0CTL3=0xa0; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转
ATD0CTL4=0x01; //采样时间为4个AD时钟周期,PRS=1,ATDClock=6MHz
ATD0CTL5=0x20; //特殊通道禁止,连续转换 ,多通道转换,起始通道为0转换4个通道
ATD0DIEN=0x00; //禁止数字输入
}
//-----读取AD转换结果--------//
void AD_GetValue(word *AD_wValue)
{
*AD_wValue=ATD0DR0; //读取结果寄存器的值
}
//-----主函数--------//
void main(void)
{
PLL_Init();
AD_Init();
SCI_init();
DDRB=0xFF;
PORTB=0x00;
EnableInterrupts;
for(;;)
{
while(!ATD0STAT2_CCF0); // 等待转换结束while(ATDOSTAT2_CCF0==1)
while(!SCI0SR1_TDRE);
SCI0DRL=ATD0DR0L;
PORTB=ATD0DR0;
long_delay(5,60000);
}
} |
|