<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          MSP430之ADC12之1602顯示

          作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò) 收藏
          #include <msp430x14x.h>
          /*兩路數(shù)據(jù)采集,其中一路很穩(wěn)定,跳動(dòng)一兩個(gè)字,但是另一路跳動(dòng)就很大了,
          我的處理方法是:1 是將多余的通道都接上,采集后排序取中間的或中間
          的幾個(gè)相加再平均,適用于變化較大的輸入信號(hào)。2 是適用于比較平穩(wěn)的
          輸入信號(hào),可4次、8次、16次、32次、64次循環(huán)存儲(chǔ)平均。這樣比較穩(wěn)定多了。
          本程序就是使用了32次循環(huán)存儲(chǔ)平均*/
          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轉(zhuǎn)換結(jié)果的數(shù)組
          void Trans_val(uint dat);
          /*******************************************
          函數(shù)名稱:delay
          功 能:延時(shí)一段時(shí)間
          參 數(shù):time--延時(shí)長(zhǎng)度
          ********************************************/
          void delay(uint time)
          {
          uint i;
          for(i = 0;i < time;i++) _NOP();
          }
          /*******************************************
          函數(shù)名稱:Delay5ms 功 能:延時(shí)約5ms
          ********************************************/
          void Delay5ms(void)
          {
          uint i=40000;
          while (i != 0)
          {
          i--;
          }
          }
          /*******************************************
          函數(shù)名稱:WaitForEnable
          功 能:等待1602液晶完成內(nèi)部操作
          ********************************************/
          void WaitForEnable(void)
          {
          P4DIR &= 0x00; //將P4口切換為輸入狀態(tài)
          CLR_RS;
          SET_RW;
          _NOP();
          SET_EN;
          _NOP();
          _NOP();

          while((P4IN & Busy)!=0); //檢測(cè)忙標(biāo)志
          CLR_EN;
          P4DIR |= 0xFF; //將P4口切換為輸出狀態(tài)
          }
          /*******************************************
          函數(shù)名稱:write_com
          功 能:向液晶模塊寫入命令
          ********************************************/
          void write_com(uchar cmd)
          {
          WaitForEnable(); // 檢測(cè)忙信號(hào)?

          CLR_RS;
          CLR_RW;
          _NOP();
          DataPort = cmd; //將命令字寫入數(shù)據(jù)端口
          _NOP();

          SET_EN; //產(chǎn)生使能脈沖信號(hào)
          _NOP();
          _NOP();
          CLR_EN;
          }

          /*******************************************
          函數(shù)名稱:write_data
          功 能:向液晶顯示的當(dāng)前地址寫入顯示數(shù)據(jù)
          參 數(shù):data--顯示字符數(shù)據(jù)
          返回值 :無(wú)
          ********************************************/
          void write_data( uchar data )
          {
          WaitForEnable(); //等待液晶不忙
          SET_RS;
          CLR_RW;
          _NOP();
          DataPort = data; //將顯示數(shù)據(jù)寫入數(shù)據(jù)端口
          _NOP();
          SET_EN; //產(chǎn)生使能脈沖信號(hào)
          _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();
          }

          /*******************************************
          函數(shù)名稱:LcdReset
          功 能:對(duì)1602液晶模塊進(jìn)行復(fù)位操作
          ********************************************/
          void LcdReset(void)
          {
          CtrlDir |= 0x07; //控制線端口設(shè)為輸出狀態(tài)
          DataDir = 0xFF; //數(shù)據(jù)端口設(shè)為輸出狀態(tài)

          write_com(0x38);//規(guī)定的復(fù)位操作
          Delay5ms();
          write_com(0x38);
          Delay5ms();
          write_com(0x38);
          Delay5ms();
          write_com(0x38);//顯示模式設(shè)置
          write_com(0x06);//寫字符時(shí)整體不移動(dòng)
          write_com(0x0c);//顯示開,不開游標(biāo),不閃爍
          write_com(0x01);//顯示清屏


          }

          /************************主函數(shù)****************************/
          void main(void)
          {
          WDTCTL = WDTPW+WDTHOLD; //關(guān)閉看門狗

          /*下面六行程序關(guān)閉所有的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;//關(guān)閉電平轉(zhuǎn)換
          LcdReset(); //復(fù)位1602液晶
          // P6DIR&=~BIT0;//先把P6_1口設(shè)為輸入,上電就是這個(gè)狀態(tài),這句可要可不要
          P6SEL |= 0x01;//把P6_1口設(shè)為ADC輸入通道
          ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打開ADC,設(shè)置采樣時(shí)間
          ADC12CTL1 = SHP+CONSEQ_2; // 使用采樣定時(shí)器
          ADC12IE = 0x01;// 使能ADC中斷
          ADC12CTL0 |= ENC; // 使能轉(zhuǎn)換
          ADC12CTL0 |= ADC12SC;// 開始轉(zhuǎn)換
          write_com(0x82);
          zifuchuan("The volt is:");
          _EINT();
          LPM0;
          }
          /*******************************************
          函數(shù)名稱:ADC12ISR
          功 能:ADC中斷服務(wù)函數(shù),在這里用多次平均的
          計(jì)算P6.0口的模擬電壓數(shù)值
          參 數(shù):無(wú)
          返回值 :無(wú)
          ********************************************/
          #pragmavector=ADC_VECTOR
          __interrupt void ADC12ISR (void)
          {
          static uint temp = 0;
          results[temp++] = ADC12MEM0;
          if(temp == 32)
          {
          uchar i;
          unsignedlongsum = 0;
          temp = 0;
          for(i = 0; i < 32; i++)
          {
          sum += results[i];
          }
          sum >>= 5;//除以32

          Trans_val(sum);
          }
          }
          /*******************************************
          函數(shù)名稱:Trans_val
          功 能:將16進(jìn)制ADC轉(zhuǎn)換數(shù)據(jù)變換成三位10進(jìn)制
          真實(shí)的模擬電壓數(shù)據(jù),并在液晶上顯示
          參 數(shù):Hex_Val--16進(jìn)制數(shù)據(jù)
          n--變換時(shí)的分母等于2的n次方
          返回值 :無(wú)
          ********************************************/
          void Trans_val(uint dat)
          {
          unsignedlongtemp;
          uint Curr_Volt;
          uchar ptr[3];
          temp = dat;
          temp = (temp << 5) + dat; //temp = dat * 33
          //移位比直接乘效率要高
          temp = (temp << 3) + (temp << 1); //temp = temp * 10
          //一個(gè)數(shù)左移N位等于這個(gè)數(shù)乘以2的N次方
          Curr_Volt = temp >> 12;//Curr_Volt = temp / 2^n一個(gè)數(shù)右移N位等于除以2的N次方
          ptr[0] = Curr_Volt/100;
          ptr[1] = Curr_Volt %100/10;
          ptr[2] = Curr_Volt%10;
          //在液晶上顯示變換后的結(jié)果
          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);
          }


          關(guān)鍵詞: MSP430ADC121602顯

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();