|
關(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);
}
}*/
|
|