找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2322|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

求助關(guān)于用MSP430F149測(cè)量溫濕度和風(fēng)速的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:111131 發(fā)表于 2016-4-8 21:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)于用MSP430F149測(cè)溫濕度和風(fēng)速的問(wèn)題,溫濕度傳感器用的是DHT11(直接輸出數(shù)字信號(hào)),風(fēng)速采集的是模擬信號(hào)經(jīng)過(guò)AD轉(zhuǎn)換后輸出,F(xiàn)在問(wèn)題是用串口調(diào)試助手調(diào)試時(shí)顯示的全是0(完全沒(méi)有 按指定的數(shù)據(jù)幀格式輸出,不過(guò)在測(cè)試時(shí)風(fēng)速傳感器沒(méi)有接單片機(jī)(不知道有沒(méi)有影響)),但如果把風(fēng)速那塊程序注釋掉,又可以按指定的格式輸出。代碼如下:
#include <msp430x14x.h>
//#include "dht11.h"
//#include "uart0.h"
#include "Config.h"
#include <stdio.h>

char s[40];
void delayus(unsigned int n);
typedef unsigned int    U16;
typedef unsigned char   U8;
unsigned char  U8FLAG,k;
unsigned char  U8count,U8temp;
unsigned char  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned char  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char  U8comdata;
unsigned char  outdata[5];  //定義發(fā)送的字節(jié)數(shù)          
unsigned char  indata[5];
unsigned char  count, count_r=0;
unsigned int   U16temp1,U16temp2;
uint TEMP0=0;                            //ADC值暫存變量
uchar   Value[9];
uint Count=0;                           //時(shí)間計(jì)數(shù)變量


void Voltage_do(uchar temp0,uchar temp1,uchar temp2,uchar temp3,uint temp4)
{
  Value[0]=0XAA;
  Value[1]=0X05;
  Value[2]=temp0;
  Value[3]=temp1;
  Value[4]=temp2;
  Value[5]=temp3;
  Value[6]=temp4>>8;
  Value[7]=temp4;
  Value[8]=0xBB;
}
//*************************************************************************
//        ADC初始化程序,用于配置ADC相關(guān)寄存器
//*************************************************************************
void ADC_Init()
{
  P6SEL|=0x01;                                    //選擇ADC通道
//  ADC12CTL0|= ADC12ON + SHT0_2 + REF2_5V + REFON + MSC; //ADC電源控制開(kāi),16個(gè)CLK,內(nèi)部基準(zhǔn)2.5V
  ADC12CTL0|= ADC12ON + SHT0_2 + MSC;
  ADC12CTL1|= ADC12SSEL1 + ADC12SSEL0+CONSEQ_2+SHP;            //SMCLK做時(shí)鐘源
/*  ADC12MCTL0= SREF0 + INCH_0;                     //參考控制位及通道選擇,這里選擇通道0
  ADC12MCTL1= SREF0 + INCH_1;
  ADC12MCTL2= SREF0 + INCH_2+EOS; */

  ADC12MCTL0= INCH_0;                     //參考控制位及通道選擇,這里選擇通道0
//  ADC12MCTL1= INCH_1+EOS;
//  ADC12MCTL2= INCH_2+EOS;

//  ADC12IE|= 0x0002;                                 //中斷允許
  ADC12CTL0|= ENC;                                //使能轉(zhuǎn)換器
}
//*************************************************************************
//        串口初始化及發(fā)送
//*************************************************************************
void UART_Init()
{
  U0CTL|=SWRST;               //復(fù)位SWRST
  U0CTL|=CHAR;                //8位數(shù)據(jù)模式
  U0TCTL|=SSEL1;              //SMCLK為串口時(shí)鐘
  U0BR1=baud_h;               //BRCLK=8MHZ,Baud=BRCLK/N
  U0BR0=baud_l;               //N=UBR+(UxMCTL)/8
  U0MCTL=0x00;                //微調(diào)寄存器為0,波特率9600bps
  ME1|=UTXE0;                 //UART1發(fā)送使能
  ME1|=URXE0;                 //UART1接收使能
  U0CTL&=~SWRST;
  IE1|=URXIE0;                //接收中斷使能位

  P3SEL|= BIT4;               //設(shè)置IO口為普通I/O模式
  P3DIR|= BIT4;               //設(shè)置IO口方向?yàn)檩敵?br />   P3SEL|= BIT5;
}

void Send_Byte(uchar data)
{
  while((IFG1&UTXIFG0)==0);          //發(fā)送寄存器空的時(shí)候發(fā)送數(shù)據(jù)
    U0TXBUF=data;
}

/*******************************************
函數(shù)名稱:delay
功    能:延時(shí)約15us的時(shí)間
參    數(shù):無(wú)
返回值  :無(wú)
********************************************/
/*void delayus(unsigned int i)   //delay 2.5us at 8M
{  
   unsigned int ii;
   for(ii =i;ii > 0;ii--)
   {
      _NOP();_NOP();_NOP();_NOP();   
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();   
   }   
}*/
/****************************************************************************
* 名    稱:ClkInit
* 功    能:時(shí)鐘系統(tǒng)初始化  MCLK為8MHz,SMCLK為1MHz
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
****************************************************************************/
//void ClkInit()
//{
//    char i;
//   /*------選擇系統(tǒng)主時(shí)鐘為8MHz-------*/
//    BCSCTL1 &= ~XT2OFF;                 //打開(kāi)XT2高頻晶體振蕩器
//    do
//    {
//        IFG1 &= ~OFIFG;                 //清除晶振失敗標(biāo)志
//        for (i = 0xFF; i > 0; i--);     //等待8MHz晶體起振
//    }
//    while ((IFG1 & OFIFG));             //晶振失效標(biāo)志仍然存在?
//    BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK選擇高頻晶振
//   
//    TACTL |= TASSEL_2 + ID_3;           //計(jì)數(shù)時(shí)鐘選擇SMLK=8MHz,1/8分頻后為1MHz   
//}
//////////////////////DHT11///////////////////////////////////////////////////////
void DHT11_ReadChar(void)
{
    U8 i;
    DHT11_INPUT;

        for(i=0;i<8;i++)          
        {
                U8FLAG=2;       
                while( (!DHT11_IN) && U8FLAG++ );
                delay_us(40); //40us
                U8temp<<=1;

                if(DHT11_IN)                                 //26-28us高電平表示'0',30us后若還為高電平則表示為'1'
                {
                  U8temp|=1;
                }
                   U8FLAG=2;
                while( (DHT11_IN) && U8FLAG++ );        //超時(shí)則U8FLAG到255后變?yōu)?,又自加一次變?yōu)?退出while
                                                        //超時(shí)則跳出for循環(huán)                  
                if(U8FLAG==1)
                break;//判斷數(shù)據(jù)位是0還是1          
                // 如果高電平高過(guò)預(yù)定0高電平值則數(shù)據(jù)位為 1
                 //U8comdata<<=1;
                  U8comdata=U8temp;        //0
        }//rof
}
//--------------------------------
//-----濕度讀取子程序 ------------
//--------------------------------
//----以下變量均為全局變量--------
//----溫度高8位== U8T_data_H------
//----溫度低8位== U8T_data_L------
//----濕度高8位== U8RH_data_H-----
//----濕度低8位== U8RH_data_L-----
//----校驗(yàn) 8位 == U8checkdata-----
//----調(diào)用相關(guān)子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------

void start_DHT11(void)
{
        DHT11_OUTPUT;
        DHT11_L;
        delay_ms(18);                   //主機(jī)拉低18ms
        DHT11_H;                        //總線由上拉電阻拉高 主機(jī)延時(shí)20-40us
        delay_us(40);                    //40us;       
        DHT11_H;                       //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
        DHT11_INPUT;                   //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
        //if(!DHT11_INPUT)       
        //T !          
        if(!DHT11_IN)                     //檢測(cè)P2.0輸入電平
        {
                U8FLAG=2;                //判斷從機(jī)發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束       
                while( (!DHT11_IN) && U8FLAG++ );
                U8FLAG=2;                //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
                while( (DHT11_IN) && U8FLAG++ );//數(shù)據(jù)接收狀態(tài)                 
                DHT11_ReadChar();                   //一個(gè)COM()調(diào)用接收一個(gè)字節(jié)的數(shù)據(jù)
                U8RH_data_H_temp=U8comdata;
                DHT11_ReadChar();
                U8RH_data_L_temp=U8comdata;
                DHT11_ReadChar();
                U8T_data_H_temp=U8comdata;
                DHT11_ReadChar();
                U8T_data_L_temp=U8comdata;
                DHT11_ReadChar();
                U8checkdata_temp=U8comdata;
                DHT11_OUTPUT;
                DHT11_H;                  //數(shù)據(jù)校驗(yàn)        
                U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                if(U8temp==U8checkdata_temp)
                {
                  U8RH_data_H=U8RH_data_H_temp;
                  U8RH_data_L=U8RH_data_L_temp;
                  U8T_data_H=U8T_data_H_temp;
                  U8T_data_L=U8T_data_L_temp;
                  U8checkdata=U8checkdata_temp;
                }//fi
        }//fi
}
//***********************************************************************
//             TIMERA初始化,設(shè)置為UP模式計(jì)數(shù)
//***********************************************************************
void TIMERA_Init(void)                                   //UP模式計(jì)數(shù),計(jì)數(shù)周期為CCR0+1
{
  TACTL |= TASSEL1 + TACLR + ID0 + ID1 + MC0 + TAIE;     //SMCLK做時(shí)鐘源,8分頻,增加計(jì)數(shù)模式,開(kāi)中斷
  TACCR0 = 9999;                                         //CCR0=9999,10ms中斷一次
}

//***********************************************************************
//             TIMERA中斷服務(wù)程序,需要判斷中斷類型
//***********************************************************************
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  uchar j;
  switch(TAIV)                                  //需要判斷中斷的類型
  {
    case 2:break;
    case 4:break;
    case 10:Count++;break;                        
  }
  if(Count==6000)                                 //100次為1秒
  {
//    Second++;
    Count=0;
    for(j=0;j<9;j++)
    {
      Send_Byte(Value[j]);
    }  
  }
//  while(Second>599)Second=0;                       //最大計(jì)數(shù)99秒
}


///////////////////////主函數(shù)///////////////////////////////////////////
void  main( void )
{

  WDTCTL=WDTPW+WDTHOLD;//關(guān)看門(mén)狗
  Clock_Init();
  UART_Init();
  //PutString("DHT11 TEST");
  delay_ms(100);                      //延時(shí)100ms
  delay_ms(100);                      //延時(shí)100ms
  delay_ms(50000);
  TIMERA_Init();                                //設(shè)置TIMERA,P12輸出PWM信號(hào)
  _EINT();
  ADC12CTL0 |= ADC12SC;           //開(kāi)啟轉(zhuǎn)換  
  //int k= 10;
  while(1)
  {
    start_DHT11();
    while((ADC12IFG & 0x0001) == 0);    // 等待轉(zhuǎn)換結(jié)束
        TEMP0 = ADC12MEM0;                     //讀取ADC轉(zhuǎn)換值
    Voltage_do(U8RH_data_H, U8RH_data_L,U8T_data_H,U8T_data_L,TEMP0);
//    PutString("DHT11 EXIST AND ACQUIRE SUCCESSFUL!");
//    //sprintf(s, "%d.%d %d.%d\r\n",U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L);
//    //PutString(s);
//   
//    sprintf(s, "%d.%d",U8RH_data_H,U8RH_data_L);
//    Send1Char('R');
//    Send1Char('H');
//    Send1Char('=');
//    PutString(s);
//    sprintf(s, "%d.%d",U8T_data_H,U8T_data_L);
//    Send1Char('T');  
//    Send1Char('=');
//    PutString(s);
//   
//    delay_ms(1000);
//    delay_ms(1000);
  }

}


/*

DHT11_OUTPUT;
  while(1)
  {

    DHT11_H;
   //delay_ms(2);
    delayus(2);
   DHT11_L;
   //delay_ms(2);
    delayus(2);
  }
}*/


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:113105 發(fā)表于 2016-4-9 13:47 | 只看該作者
eryrtyrtyrtyrtyrty
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表