void AD(void)
{
SD16CTL = SD16SSEL_1 + SD16DIV_1; // SLCK=MCLK=1M 2分频 f=500KHz,OSR=1024,参考电源暂不开启,转换前开,转换后关。节能!
SD16CCTL0 = SD16DF + SD16OSR_1024 + SD16SNGL; // + SD16UNI // 输出格式为2的补码(8000--7FFF)+过采样速率1024+单次转换 双极性模式(默认模式)
SD16INCTL0 = SD16INTDLY_0; // 中断延时(4第四次采样中断)
SD16AE = SD16AE0+SD16AE1; // 设置通道0 因为通道0占用的脚是P1.0 P1.1
SD16INCTL0 |=SD16GAIN_32 + SD16INCH_0; // +增益为x32+通道为
SD16CTL |= SD16REFON; // 只打开1.2V参考源
Delay_us(100);
SD16CCTL0 |=(SD16SC + SD16IE); // 启动 SD16 进行转换并且允许 SD16 中断。
}
uchar check(void)
{
unsigned char sta;
SD16CCTL0 &= ~(SD16SC + SD16IE); //关闭AD
SD16AE &= ~(SD16AE0+SD16AE1);//关闭模拟输入
P1SEL &=~(BIT0+BIT1); //P1.0 P1.1设为普通IO,输入输出功能
P1REN &=~(BIT0+BIT1); //P1.0 P1.1上拉,下拉禁止
P1DIR |=BIT0; //P1.0 设为输出 1输出 0输入
P1DIR &=~BIT1; //P1.1 设为输入
P1OUT |=BIT0; //P1.0 输出高电平
_NOP();
_NOP();
_NOP();
_NOP();
if(P1IN & BIT1) //获取P1.1引脚电平
sta=0;//RTC 在线
else
sta=1;//断线
return sta;
}
void main()
{
BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz 校正数据
DCOCTL = CALDCO_1MHZ; // 校正
AD();
check(); //运行完成这函数后,AD再也得不到值??为什么 ??????????????单独AD对,单独IO电平检测对。切换后就不对!!求解
}
#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
SD16CCTL0 &= ~(SD16SC + SD16IE); // SD16停止转换,禁止中断及关闭采集电路的电源。
adc_last_val = SD16MEM0; // 保存 ADC 最后的结果
} |