该例程是利用249的P6.3/A3口来采集电池电压的,故其想换程序代码如下:
void ad_init()
{
P6SEL = 0x08;
ADC12CTL0 &= ~ENC; //使AD模块处于初始状态
ADC12CTL0|=MSC+ADC12ON+SHT0_2+REF2_5V+REFON; //采样保持时间为16个ADC12CLK
}
/****************************************************************************
设置转换模式
adr:转换的首地址。取值范围为0~15
mod:转换模式。0:单通道单次 1:序列通道单次 2:单通道多次 3:序列通道多次
****************************************************************************/
void AdcDo(unsigned int adr,unsigned char mod)
{
ADC12CTL1 = (adr<<12)+SHP+(mod<<1); //SHP表示由采样定时器控制采样
}
void ad_open(uint x)
{
ad_flag =1;
AdcDo(3,0); //开始转换的寄存器为ADC12MEM2
ADC12CTL0 &= ~ENC;
ADC12MCTL3 = SREF_1 + x + 0x80; // 参考电压选择,输入通道
ADC12IE |=0x08; //使能转换中断
ADC12CTL0 |= ENC; //允许转换
ADC12CTL0 |= ENC+ADC12SC; //转换开始
}
//读取转换结果的底层程序:
uint ad_read()
{
task_uart0.flag =0x01;
wdt_number =0;
wdt_temp =30;
inter_flag1 =0x01;
TBCCTL0 |=CCIE;
while(ad_flag) //等待转换完 ,最长1.5s,若没转换完,直接跳过
{
if(task_uart0.flag ==0)
ad_flag =0;
}
task_uart0.flag =0;
return ad_value;
}
//关闭ADC模块底层程序:
void ad_close()
{
ADC12CTL0 &= ~(ADC12ON+REFON); //不允许转换
ADC12CTL0 &= ~ENC;
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
ad_value=ADC12MEM3;//读取ADC值
ad_flag=0;
}
unsigned int adc_voltage[11]; //主程序中调用上述采集子程序将采集的结果存入该RAM中
for(char k=0;k<11;k++)
{
ad_open(3);
wdt_time =0;
adc_voltage[k]=ad_read();
for(int i=0;i<1000;i++);
}
ad_close();
注意,要改用其他端口采集的时候,一定要注意各个寄存器的配置 |