⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc12.c

📁 SP430C语言程序: 11-1的功能为利用MSP430的ADC12进行单通道单次转换
💻 C
字号:
/****************************************************************************
文件名:adc12.c
编写者:czhang
描述:ADC12模块程序。用于14xx系列。
      MCLK:DCO   ACLK:32.768kHz
版本:2005-4 V1.0
*****************************************************************************/
#include <msp430x14x.h>
#include "adc12.h"

unsigned char Wait=0;  		//等待转换结束的标志位  0:没有结束    1:结束
unsigned int AdMem[16];  	//转换结果缓冲区
#define AD_CI 10
unsigned char AdCi=AD_CI;  //单通道或者序列多次转换的转换次数
#define DUO_CI  1	   //0:单通道或者序列单次转换  1:单通道或者序列多次转换
/****************************************************************************
初始化
****************************************************************************/
void Adc12Init()
{
	ADC12CTL0 &= ~ENC;										//使AD模块处于初始状态
	ADC12CTL0 = MSC+REFON+REF2_5V+SHT0_15+SHT1_15; 	//使用内部2.5V参考电压,使用采样保持器。
}

/****************************************************************************
打开或关闭ADC12模块
doit:0:打开    100:关闭
****************************************************************************/
void Adc12Open(unsigned char doit)
{
	if(doit==0)
	{
		ADC12CTL0 |= ADC12ON;
		ADC12CTL0 |= ENC; 	//允许转换
	}
	else if(doit==100)
	{
		ADC12CTL0 &= ~ADC12ON; 	//不允许转换
		ADC12CTL0 &= ~ENC;
	}
}

/****************************************************************************
设置转换模式
adr:转换的首地址。取值范围为0~15
mod:转换模式。0:单通道单次  1:序列通道单次  2:单通道多次  3:序列通道多次
****************************************************************************/
void AdcDo(unsigned int adr,unsigned char mod)
{
	ADC12CTL1 = (adr<<12)+SHP+(mod<<1);   //SHP表示由采样定时器控制采样
}

/****************************************************************************
设置通道
tongdao:选择的模拟输入通道,取值范围为0~15
eos:0表示序列没有结束,0x80表示在序列转换时,表示本次转换结束后,本转换序列结束。
mem:转换存储器控制寄存器,取值范围为0~15
verf:参考电压,取值范围为0~7
inter:0:本通道转换完后不引发中断    1:本通道转换完后引发中断
****************************************************************************/
void SetTongDao(unsigned char tongdao,unsigned char eos,unsigned char mem,unsigned char verf,unsigned char inter)
{
	char *pmem_ctl= ADC12MCTL;
	pmem_ctl += mem;
	*pmem_ctl = tongdao+ eos + (verf<<4);
	if(inter==0)
		ADC12IE &= ~(0x1<<mem);
	else
		ADC12IE |= (0x1<<mem);
}

/****************************************************************************
软件引发转换开始
****************************************************************************/
void Adc12Go()
{
	unsigned char q0;

	for(q0=0;q0<16;q0++)
		AdMem[q0]=0;
	Wait=0;
	ADC12CTL0 |= ENC+ADC12SC;	//转换开始
	while(Wait==0)            	//等待转换结束
	;
}

/*****************************************************************************
AD转换器中断函数
******************************************************************************/

#pragma vector=ADC_VECTOR
__interrupt void Adc()
{
#if DUO_CI==0   			//单通道或者序列单次转换
   unsigned char q0;
	int *pmem=ADC12MEM;

	Wait=1;				//转换结束的标志位置位
	for(q0=0;q0<16;q0++)
	{
		AdMem[q0]= *pmem;
		pmem++;
	}
#elif DUO_CI==1 			//单通道或者序列多次转换
	unsigned char q0;
	unsigned int iq0;
	int *pmem=ADC12MEM;

	if(Wait==0)
	{
		for(q0=0;q0<16;q0++)
		{
			AdMem[q0] += *pmem;
			pmem++;
		}

		AdCi--;
		if(AdCi==0)
		{
		   Adc12Open(100);  	//关闭ADC12模块
			Wait=1;		//转换结束的标志位置位
			for(q0=0;q0<16;q0++)
			{
				AdMem[q0] = AdMem[q0]/AD_CI;
			}
			AdCi=AD_CI;
		}
	}
	else
	{
		for(q0=0;q0<16;q0++)
		{
			iq0 += *pmem;
			pmem++;
		}
	}
#endif

}

/****************************************************************************
从ADC12MEM中读出转换结果,本函数读出了ADC12MEM所有的16个寄存器,可根据需要进行
修改,不读出所有的寄存器。
padc:读出的结果保存在数组中,padc为指向此数组的指针
****************************************************************************/
void AdcGet(unsigned int *padc)
{
	unsigned char q0;
	for(q0=0;q0<16;q0++)
	{
		*padc= AdMem[q0];
		padc++;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -