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

📄 main.c

📁 《MSP430单片机常用模块与综合系统实例精讲》整书的源代码有30个
💻 C
字号:

#include "adc.h"

int nStart;
int nADC_Count;
int nADC_Flag;
int ADC_BUF_Temp[32];
int ADC_BUF[32];
void main(void)
{ 
    int i;
    int pBuf[32];
    int sum;
    int nTemp;
    float fVal;
    // 关闭看门狗 
    WDTCTL = WDTPW + WDTHOLD;      
    // 关闭中断
    _DINT();	
    
    //变量初始化
    nADC_Count = 0;
    nADC_Flag = 0;
    nStart = 0;
    fVal = 0;
    
    //时钟初始化
    Init_CLK();
    //端口初始化
    Init_Port();
    //定时器A初始化
    Init_TimerA();
    
    //循环处理
    for(;;)
    {
        //采集完成
        if(nADC_Flag == 1)
        {
            //清除标志
            nADC_Flag = 0;
            //取出数据
            for(i = 0;i < 32;i++)
            {
                pBuf[i] = ADC_BUF_Temp[i];
            }
            
            //取平均值,sum为测量的值
            sum =0;
            for(i = 0;i < 32;i++)
            {
                sum += pBuf[i];
            }
            sum >>= 5;
            
            //判断增益是否合适,407对应0。3V
            if(sum < 407)
            {
                nTemp = getGain();
                nTemp *= 10;
                setGain(nTemp);
            }
            else 
            {
                //测量结束
                nStart = 0;
                sum *= 3;
                fVal = (float)(sum) / 4096;
                fVal *= 1000;
                nTemp = getGain();
                //电阻值
                fVal /= nTemp;
                //LED显示
                P1OUT |= BIT3;
            }
        }
    }
}

//////////////////////////////////////////////
// 定时器中断,完成 ADC 转换
#if __VER__ < 200
    interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
#else
    #pragma vector=TIMERA0_VECTOR
    __interrupt void TimerA_ISR(void)
#endif
{
    int i;
    
    if(nStart == 1) 
    {
        // 关闭转换
        ADC12CTL0 &= ~ENC;		      
          	
        // 读出转换结果 
        ADC_BUF[nADC_Count] = ADC12MEM0; 
            
        nADC_Count += 1;     
        if(nADC_Count == 32)
        {
             //设置标志
             nADC_Flag = 1;            
             nADC_Count = 0; 
             // 将数据倒向数据缓冲区
             for(i = 0;i < 32;i++) 
             {
                 ADC_BUF_Temp[i] = ADC_BUF[i];
             }             
        }
    
        // 开启转换
        ADC12CTL0 |= ENC + ADC12SC;	
    }
       
}
#if __VER__ < 200
    interrupt [PORT1_VECTOR] void PORT_ISR(void)
#else
    #pragma vector=PORT1_VECTOR
    __interrupt void PORT_ISR(void)
#endif
{
    Delay_us(100);
    if(P1IFG & BIT2)
    {
        //设置初始增益为1
        setGain(1);
        //设置标志
    	nStart = 1;
        // 清除中断标志位
    	P1IFG &= ~(BIT2);	
    	Delay_us(100);
        //LED不显示
        P1OUT &= ~(BIT3);
    }
}

⌨️ 快捷键说明

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