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

📄 jiaoliu.c

📁 TI公司的MSP430单片机程序
💻 C
字号:
#include <msp430x14x.h>

char nADC_Flag;
int nADC_Count;
int ADC_BUF[40];

void Init_CLK(void);
void Init_ADC(void);
void Init_TimerA(void);

void Init_ADC(void)
{
	//设置P6.0为模拟输入通道
    P6SEL = 0X01;                 
    //设置ENC为0,从而修改ADC12寄存器的值
    ADC12CTL0 &= ~(ENC);         
    //设置参考电压分别为AVSS和AVCC,输入通道为A0
    ADC12MCTL0 = INCH_0 + EOS;            
    //转换的起始地址为:ADCMEM0
    ADC12CTL1 = 0X00;
    ADC12CTL1 += CSTARTADD_0;
	//采样脉冲由采用定时器产生
    ADC12CTL1 += SHP;	
	//转换模式为:多通道、多次转换
    ADC12CTL1 += CONSEQ_1;	
	//内部时钟源
    ADC12CTL1 += ADC12SSEL_0;
	//时钟分频为1
    ADC12CTL1 += ADC12DIV_0;		
    
    ADC12CTL0 += 8 * 0x100;
    ADC12CTL0 += MSC;
    ADC12CTL0 += ADC12ON;
    
    ADC12IE = 0;
	//关闭各个通道的转换中断
    ADC12IE |= 0X00;			
    //使能ADC转换
    ADC12CTL0 |= ENC;			
    return;
}
void Init_TimerA(void)
{
	// 选择SMCLK,清除TAR
    TACTL = TASSEL1 + TACLR; 
	// 1/8 SMCLK
    TACTL += ID1;
    TACTL += ID0;    	 
	// CCR0 中断允许
    CCTL0 = CCIE;
	
	// 时间间隔为 500us
    CCR0 = 500;
	// 增记数模式
    TACTL |= MC0;			
    return;
}
void Init_CLK(void)
{
    unsigned int i;
    BCSCTL1 = 0X00;	//将寄存器的内容清零
					//XT2震荡器开启
					//LFTX1工作在低频模式
					//ACLK的分频因子为1
					
    do 
    {
	IFG1 &= ~OFIFG;                       // 清除OSCFault标志
	for (i = 0x20; i > 0; i--);                
    }
    while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   
					
    BCSCTL2 = 0X00;			//将寄存器的内容清零
    BCSCTL2 += SELM1;		//MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;		//SMCLK的时钟源为TX2CLK,分频因子为1
}

interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
{
    int results;
	// 关闭转换
    ADC12CTL0 &= ~ENC;			
    // 读出转换结果
    results = ADC12MEM0;		                           
    ADC_BUF[nADC_Count] = results;
    // 计数器加1
    nADC_Count += 1;
	// 采集完40个点
    if(nADC_Count == 40)
    {
		// 设置标志
        nADC_Flag = 1;
		// 计数器清0
        nADC_Count = 0;
    }	 
	// 开启转换
    ADC12CTL0 |= ENC + ADC12SC;		
}

void main(void)
{
	int ADC_BUF_Temp[40];
	int i;
	// 关闭看门狗
	WDTCTL = WDTPW + WDTHOLD;   
	// 关闭中断
    _DINT();			
    
    // 初始化
    Init_CLK();
    Init_ADC();
    Init_TimerA();

	// 打开中断
	_EINT(); 
	// 循环处理
	for(;;)
	{
		if(nADC_Flag == 1)
		{
			nADC_Flag = 0;
			for(i = 0;i < 40;i++)
			{
				ADC_BUF_Temp[i] = ADC_BUF[i];
			}
		}
	}
}

⌨️ 快捷键说明

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