新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430F149定時數據采集程序

        MSP430F149定時數據采集程序

        作者: 時間:2016-11-13 來源:網絡 收藏
        #include <msp430x14x.h>

        #define RS_H P5OUT |=BIT3 //Data Register is selected
        #define RS_L P5OUT &=~BIT3 //Instruction Register is selected
        #define READ P5OUT |= BIT2 //讀LCD
        #define WRITE P5OUT &= ~BIT2 //寫LCD
        #define EN_H P5OUT |= BIT1 //Enable Read/Write Operation
        #define EN_L P5OUT &=~BIT1 //Disable Read/Write Operation

        unsigned char a[]="AD&DA change!";
        int AD_result;
        void Init_CLK(void); //時鐘初始化函數
        void Init_ADC(void); //AD轉換函數
        void Init_TimerA(void);
        void DATransfer(unsigned DA_data);//DA轉換子函數
        void Init_Port()
        {
        P3SEL=0x00; //LCD所需端口設置
        P3DIR=0xFF;
        P3OUT&=~BIT5; //74HC245的DIR為低電平,輸入方向由B端到A端

        P5SEL=0x00; //P5輸出
        P5DIR=0xFF;
        P5OUT=0x00;

        P4SEL=0x00; //P4輸出
        P4DIR=0xFF;
        P4OUT=0x00;

        P6SEL=0xF0; //P6.4-p6.5作為AD輸入通道,P6.0-P6.3作為一般的IO口
        P6DIR=0xFF;
        P6OUT=0x00;
        }

        void Delay(unsigned int i) //延時子程序
        {
        while(i--); //延時時間為i*5+6個時鐘周期
        }

        void Write_Command(unsigned char command )
        {
        P4OUT=command;
        RS_L; //選擇程序寄存器
        WRITE; //允許寫操作
        EN_H; //液晶使能
        Delay(50);//延時
        EN_L; //液晶讀寫操作禁止
        Delay(50);
        }

        void Write_Data(unsigned char data )
        {
        P4OUT=data;
        RS_H; //選擇數據寄存器
        WRITE; //允許寫操作
        EN_H; //液晶使能
        Delay(50); //延時
        EN_L ; //液晶讀寫操作禁止
        Delay(50);
        }

        void Clear_Second_Line() //用于刪除2*16字符液的晶第二行的函數
        {
        int i=16;
        Write_Command(0xC0); //設置DDRAM的初始地址
        while(i--)
        {
        P4OUT=0x20;
        RS_H; //選擇數據寄存器
        WRITE; //允許寫操作
        EN_H; //液晶使能
        Delay(50); //延時
        EN_L ; //液晶讀寫操作禁止
        Delay(50);
        }
        }

        void Init_LCD(void)
        {

        Write_Command( 0x38 );//8位總線接口,雙行顯示,5*7點陣型
        Delay(100);
        Write_Command(0x0F);//開顯示,開光標,光標閃爍
        Delay(100);
        Write_Command(0x01);//清屏,將空格字符ASCII碼20H寫入到所有的DDRAM單元
        Delay(2500);
        Write_Command(0x06);//設置進入方式,DDRAM自增,整個顯示右移
        Delay(100);
        Write_Command(0x80);//設置DDRAM的初始地址

        }

        void Init_ADC(void)
        {
        //P6SEL = BIT7; //設置P6.7為模擬輸入A7
        ADC12CTL0 &= ~(ENC); //設置ENC為0,從而可以修改ADC12寄存器的值
        ADC12CTL0 += ADC12ON+MSH; //開A/D轉換,允許多次采樣
        ADC12MCTL7 = EOS+INCH_7;//ADC12MCTL7的輸入通道為A7,參考電壓分別為AVSS和AVCC
        ADC12CTL1 = 0X00; //轉換的起始地址為:ADCMEM7
        ADC12CTL1 = CSTARTADD0+CSTARTADD1+CSTARTADD2;
        ADC12CTL1 += SHP; //采樣脈沖來自采樣定時器
        ADC12CTL1 += CONSEQ_2; //單通道多次轉換
        ADC12CTL1 += ADC12SSEL0; //ADC12內核時鐘源為ACLK

        ADC12IE = 0x00; //關閉各個通道的轉換中斷

        ADC12CTL0 |= ENC; //使能ADC轉換
        return;
        }

        void Init_TimerA(void)
        {

        TACTL = TASSEL0 + TACLR; // 選擇ACLK:32K,清除TAR

        TACTL +=ID1; // 1/8 SMCLK
        TACTL +=ID0;
        CCTL0 = CCIE; // CCR0 中斷允許

        CCR0 = 2000; // 時間間隔為 0.5S

        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
        }

        #pragma vector=TIMERA0_VECTOR //定時器A0的中斷函數
        __interrupt void TimerA_ISR(void)
        {
        float AD_data;
        char a;
        char b;
        int m;
        int n;
        // 讀出轉換結果
        P5OUT^=BIT6;
        while((ADC12IFG & BIT7)==0) ; //判斷有沒有轉換結束
        _NOP();
        ADC12CTL0 &= ~ENC; // 關閉轉換
        P5OUT^=BIT5;
        AD_result = ADC12MEM7; //讀到AD轉換的12位二進制數
        DATransfer(AD_result);
        if((ADC12IFG & BIT7)==0)
        {P5OUT^=BIT4;}
        AD_data=AD_result*3.3/4095; //將讀到的12位二進制數轉化為對應的電壓
        m=(int)AD_data;
        n=(int)(AD_data*10-m*10);
        a=48+m; //將符點型的電壓值轉化為字符數,便于液晶顯示
        b=48+n;
        Clear_Second_Line(); //刪除16*2字符液晶的第二行數據
        Write_Command(0x06); // 設置液晶進入方式,DDRAM自增,整個顯示右移
        Delay(100);
        Write_Command(0xC0); //設置液晶DDRAM的初始地址
        Write_Data(a);
        Delay(100);
        Write_Command(0x06);//設置進入方式,DDRAM自增,整個顯示右移
        Write_Data(.);
        Delay(100);
        Write_Command(0x06);//設置進入方式,DDRAM自增,整個顯示右移
        Delay(100);
        Write_Data(b);
        ADC12CTL0 |= ENC; // 允許AD轉換
        ADC12CTL0|=ADC12SC; //開始新的轉換
        }

        void DATransfer(unsigned DA_data) //DAC轉換子程序
        {
        int i;
        unsigned int da_data;
        P6OUT&=~BIT0; //CS為低電平
        for(i=0;i<16;i++)
        {
        P6OUT&=~BIT2; //SCLK為低電平
        P6OUT&=~BIT1;
        da_data=0x3000+(DA_data&0x0fff); //送入待轉換的數字量,并選中A通道輸出
        da_data=((da_data>>(15-i))&0x0001)<<1;
        P6OUT|=da_data ; //輸出一位二進制數
        Delay(10);
        P6OUT|=BIT2; //SCLK為高電平
        Delay(10);
        }
        P6OUT&=~BIT2; //SCLK為低電平
        P6OUT|=BIT0; //CS為高電平,開始轉換數據
        Delay(10);
        }


        void main(void)
        {
        WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗
        _DINT(); // 關閉中斷
        Delay(50000);
        Init_Port();
        Init_LCD();
        Init_CLK(); // 初始化
        Init_ADC();
        Init_TimerA();
        _EINT(); // 打開中斷

        for(unsigned int i=0;a!= 主站蜘蛛池模板: 阳城县| 大厂| 池州市| 上杭县| 古田县| 磐石市| 搜索| 闸北区| 兴海县| 平遥县| 文成县| 茂名市| 湄潭县| 轮台县| 甘南县| 张家港市| 广水市| 石家庄市| 临西县| 包头市| 克拉玛依市| 美姑县| 应城市| 长泰县| 巴彦县| 嘉善县| 专栏| 安丘市| 张家川| 攀枝花市| 墨竹工卡县| 墨玉县| 瑞昌市| 乌什县| 景德镇市| 崇州市| 清涧县| 晋城| 浦东新区| 安乡县| 武宣县|