<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        MSP430之ADC12之1602顯示

        作者:我行天下   來源:本站原創   點擊數:  更新時間:2014年03月30日   【字體:

        出自:http://user.qzone.qq.com/812294069/blog/1348237372


        #include <msp430x14x.h>
        /*兩路數據采集,其中一路很穩定,跳動一兩個字,但是另一路跳動就很大了,
        我的處理方法是:1 是將多余的通道都接上,采集后排序取中間的或中間
        的幾個相加再平均,適用于變化較大的輸入信號。2 是適用于比較平穩的
        輸入信號,可4次、8次、16次、32次、64次循環存儲平均。這樣比較穩定多了。
        本程序就是使用了32次循環存儲平均*/
        typedef unsigned char uchar;
        typedef unsigned int  uint;
        /**************宏定義***************/
        #define DataDir     P4DIR
        #define DataPort    P4OUT   
        #define Busy     0x80
        #define CtrlDir     P3DIR
        #define CLR_RS P3OUT&=~BIT0;    //RS = P3.0
        #define SET_RS P3OUT|=BIT0;
        #define CLR_RW P3OUT&=~BIT1; //RW = P3.1
        #define SET_RW P3OUT|=BIT1;
        #define CLR_EN P3OUT&=~BIT2; //EN = P3.2
        #define SET_EN P3OUT|=BIT2;
         
        static uint results[32];    //保存ADC轉換結果的數組
        void Trans_val(uint dat);
        /*******************************************
        函數名稱:delay
        功    能:延時一段時間
        參    數:time--延時長度
        ********************************************/
        void delay(uint time)
        {
            uint i;
            for(i = 0;i < time;i++)     _NOP();
        }                     
        /*******************************************
        函數名稱:Delay5ms 功    能:延時約5ms
        ********************************************/
        void Delay5ms(void)
        {
            uint i=40000;
            while (i != 0)
            {
                i--;
            }
        }
        /*******************************************
        函數名稱:WaitForEnable
        功    能:等待1602液晶完成內部操作
        ********************************************/
        void WaitForEnable(void)
        {
            P4DIR &= 0x00;  //將P4口切換為輸入狀態
            CLR_RS;
            SET_RW;
            _NOP();
            SET_EN;
            _NOP();
            _NOP();
         
            while((P4IN & Busy)!=0);  //檢測忙標志
            CLR_EN;
            P4DIR |= 0xFF;  //將P4口切換為輸出狀態
        }
        /*******************************************
        函數名稱:write_com
        功    能:向液晶模塊寫入命令
        ********************************************/
        void write_com(uchar cmd)
        {
            WaitForEnable();   // 檢測忙信號?
          
            CLR_RS;
            CLR_RW;
            _NOP();
            DataPort = cmd;             //將命令字寫入數據端口
            _NOP();    
          
            SET_EN;                     //產生使能脈沖信號
            _NOP();
            _NOP();
            CLR_EN;  
        }
         
        /*******************************************
        函數名稱:write_data
        功    能:向液晶顯示的當前地址寫入顯示數據
        參    數:data--顯示字符數據
        返回值  :無
        ********************************************/
        void write_data( uchar data )
        {
            WaitForEnable();        //等待液晶不忙
            SET_RS;
            CLR_RW;
            _NOP();
            DataPort = data;        //將顯示數據寫入數據端口
            _NOP();
            SET_EN;                 //產生使能脈沖信號
            _NOP();
            _NOP();
            CLR_EN; 
        }
        void Write1602(uchar add,uchar dat)
        {
         write_com(add);
         write_data(dat);
        }
         
        void zifuchuan(uchar *ch)
        {
          while(*ch!=0)
          write_data(*ch++);
          Delay5ms();
        }
         
        /*******************************************
        函數名稱:LcdReset
        功    能:對1602液晶模塊進行復位操作
        ********************************************/
        void LcdReset(void)
        {
            CtrlDir |= 0x07;  //控制線端口設為輸出狀態
            DataDir  = 0xFF;  //數據端口設為輸出狀態
         
            write_com(0x38);//規定的復位操作
            Delay5ms();
            write_com(0x38); 
            Delay5ms();
            write_com(0x38);
            Delay5ms();
            write_com(0x38);//顯示模式設置 
            write_com(0x06);//寫字符時整體不移動
            write_com(0x0c);//顯示開,不開游標,不閃爍
             write_com(0x01);//顯示清屏
           
           
        }
         
         /************************主函數****************************/
        void main(void)
        {
          WDTCTL = WDTPW+WDTHOLD;                   //關閉看門狗
         
          /*下面六行程序關閉所有的IO口*/
            P1DIR = 0XFF;P1OUT = 0XFF;
            P2DIR = 0XFF;P2OUT = 0XFF;
            P3DIR = 0XFF;P3OUT = 0XFF;
            P4DIR = 0XFF;P4OUT = 0XFF;
            P5DIR = 0XFF;P5OUT = 0XFF;
            P6DIR = 0XFF;P6OUT = 0XFF;
         
          P6DIR |= BIT2;P6OUT |= BIT2;//關閉電平轉換
           LcdReset(); //復位1602液晶
          // P6DIR&=~BIT0;//先把P6_1口設為輸入,上電就是這個狀態,這句可要可不要
          P6SEL |= 0x01;//把P6_1口設為ADC輸入通道
          ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打開ADC,設置采樣時間
          ADC12CTL1 = SHP+CONSEQ_2; // 使用采樣定時器
          ADC12IE = 0x01;// 使能ADC中斷
          ADC12CTL0 |= ENC; // 使能轉換
          ADC12CTL0 |= ADC12SC;// 開始轉換
           write_com(0x82);
          zifuchuan("The volt is:");
          _EINT();
          LPM0;
        }
        /*******************************************
        函數名稱:ADC12ISR
        功    能:ADC中斷服務函數,在這里用多次平均的
                  計算P6.0口的模擬電壓數值
        參    數:無     
        返回值  :無
        ********************************************/
        #pragma vector=ADC_VECTOR
        __interrupt void ADC12ISR (void)
        {
          static uint temp = 0;
          results[temp++] = ADC12MEM0;
          if(temp == 32)
          {
                uchar i;
                unsigned long sum = 0;
                temp = 0;
                for(i = 0; i < 32; i++)
                {
                    sum += results[i];
                }
                sum >>= 5;//除以32
              
                Trans_val(sum);
          }
        }
        /*******************************************
        函數名稱:Trans_val
        功    能:將16進制ADC轉換數據變換成三位10進制
                  真實的模擬電壓數據,并在液晶上顯示
        參    數:Hex_Val--16進制數據
                  n--變換時的分母等于2的n次方     
        返回值  :無
        ********************************************/
        void Trans_val(uint dat)
        {
            unsigned long temp;
            uint Curr_Volt;
            uchar ptr[3];  
            temp = dat;
            temp = (temp << 5) + dat;  //temp = dat * 33
            //移位比直接乘效率要高
            temp = (temp << 3) + (temp << 1); //temp = temp * 10
            //一個數左移N位等于這個數乘以2的N次方
            Curr_Volt = temp >> 12;//Curr_Volt = temp / 2^n一個數右移N位等于除以2的N次方
            ptr[0] = Curr_Volt/100;
            ptr[1] = Curr_Volt %100/10;
            ptr[2] = Curr_Volt%10;
              //在液晶上顯示變換后的結果
            Write1602(0x80+0x40,ptr[0]+0x30);
            Write1602(0x80+0x41,'.');
            Write1602(0x80+0x42,ptr[1]+0x30);
            Write1602(0x80+0x43,ptr[2]+0x30);
             Write1602(0x80+0x44,'V');
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮