欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> 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');
}

關閉窗口

相關文章