本程序选用的是八路ADC单次收集的形式,依据装备,在单次的形式下转化完成后ADC12SC会主动复位,因而需求在循环中进行ADC12CTL0 |= ADC12SC;操作,而假如装备成接连收集的形式,只需求在程序开端将ADC12SC置位一次就能够,可是就需求留意当进入中止后假如不手动制止中止会一向停留在循环中,因而在收集到需求的数据后需求将ADC封闭或许中止使能制止才干从头回到主函数,这一点需求留意。
八路单次收集的程序如下:
八路AD多路单次收集诺基亚5110液晶显现
收集形式:多路单次
#include
#include“LCD5110.h”
#defineuintunsignedint
#defineucharunsignedchar
unsignedcharad0[]=“1:0.0V”;
unsignedcharad1[]=“2:0.0V”;
unsignedcharad2[]=“3:0.0V”;
unsignedcharad3[]=“4:0.0V”;
unsignedcharad4[]=“5:0.0V”;
unsignedcharad5[]=“6:0.0V”;
unsignedcharad6[]=“7:0.0V”;
unsignedcharad7[]=“8:0.0V”;
ucharflag=1;
uinttemp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
voidInit_Clk()
{
uchari;
BCSCTL1&=~XT2OFF;//翻开XT振动器
do
{
IFG1&=~OFIFG;//铲除振动过错标志
for(i=0;i《100;i++)
_NOP();//延时等候
}
while((IFG1&OFIFG)!=0);//假如标志为1持续循环等候
IFG1&=~OFIFG;
BCSCTL2|=SELM1+SELS;//MCLK8MandSMCLK1M
}
voidInit_ADC()
{
P6SEL|=0XFF;//信号收集端口挑选第二功用
ADC12CTL0=ADC12ON+SHT0_8+MSC;//翻开ADC+设置采样时刻
ADC12CTL1=SHP+CONSEQ_1;//运用采样时序电路信号+多路单次形式
//上面的寄存器装备采样坚持触发源挑选时ADC12SC,收集信号运用采样时序电路发生的信号
//转化形式为多路单次复转化上面的设置必须在ENC=0的情况下设置
//设置每个通道的输入端口和参阅电压,参阅电压默以为AVCC3.3V
ADC12MCTL0=INCH_0;
ADC12MCTL1=INCH_1;
ADC12MCTL2=INCH_2;
ADC12MCTL3=INCH_3;
ADC12MCTL4=INCH_4;
ADC12MCTL5=INCH_5;
ADC12MCTL6=INCH_10;
ADC12MCTL7=INCH_11+EOS;//最终一个通道
ADC12IE=BIT7;//最终一个通道转化完成后使能ADC中止
ADC12CTL0|=ENC;//使能转化
}
/*******************************************
函数称号:Trans_val
功用:将16进制ADC转化数据改换成三位10进制
实在的模仿电压数据,并在液晶上显现
参数:Hex_Val–16进制数据
n–改换时的分母等于2的n次方
返回值:无
********************************************/
voidTrans_val(ucharptr[6],uintHex_Val)
{
unsignedlongcaltmp;
uintCurr_Volt;
caltmp=Hex_Val;
caltmp=(caltmp《《5)+Hex_Val;//caltmp=Hex_Val*3
Curr_Volt=caltmp》》12;//Curr_Volt=caltmp/2^n
//参阅电压为3.3V,所以核算公式应该为Hex_val*3.3/2^n
//乘除核算经过移位来进行能够有用的进步程序运转功率
ptr[2]=(Curr_Volt/10)+0x30;//个位
ptr[4]=(Curr_Volt%10)+0x30;//小数位
}
voidmain()
{
Init_Clk();
Init_ADC();
WDTCTL=WDTPW+WDTHOLD;
LCD_init();
LCD_showsh(0,0,“电压收集:”);
_EINT();//敞开大局中止
P5DIR|=BIT5;
P3OUT|=~BIT5;
while(1)
{
ADC12CTL0|=ADC12SC;
LCD_prints(0,2,ad0);
LCD_prints(8,2,ad1);
LCD_prints(0,3,ad2);
LCD_prints(8,3,ad3);
LCD_prints(0,4,ad4);
LCD_prints(8,4,ad5);
LCD_prints(0,5,ad6);
LCD_prints(8,5,ad7);
}
}
/*******************************************
函数称号:ADC12ISR
功用:ADC中止服务函数
参数:无
返回值:无
********************************************/
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
temp0=ADC12MEM0;
Trans_val(ad0,temp0);
temp1=ADC12MEM1;
Trans_val(ad1,temp1);
temp2=ADC12MEM2;
Trans_val(ad2,temp2);
temp3=ADC12MEM3;
Trans_val(ad3,temp3);
temp4=ADC12MEM4;
Trans_val(ad4,temp4);
temp5=ADC12MEM5;
Trans_val(ad5,temp5);
temp6=ADC12MEM6;
Trans_val(ad6,temp6);
temp7 = ADC12MEM7;