程序的目的是把采集的温度通过串口显示,现在做的程度是我把硬件连接好后,用MSP430仿真器查看温湿度的数值不正确,比如humi_val.i用quick watch查看value为62850这样的数据,单片机的txd用示波器观察没有波形,可能程序存在很大问题,现在比较着急,希望各位指点一二啊,调好后,会把正确的程序贴出,共同进步,也供其他人参考,谢谢。
由于程序比较长,以附件上传了,问题可能出现在一下部分,贴出来:
#include <msp430x16x.h>
/*宏定义,延时函数,参数为1时相应延时分别为1us和1ms*/
#define CPU_F (double)1000000
#define delay_us(x) __delay_cycles((long)(CPU_F * (double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F * (double)x/1000.0))
/*常量定义*/
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
//adr command r/w
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
#define bitselect 0x01 //选择温度与湿度的低位读
#define noACK 0
#define ACK 1
#define TEMPERATURE 1
#define HUMIDITY 2
#define SCK BIT4
#define SDA BIT5
#define SCK_H P6OUT|=SCK //输出1
#define SCK_L P6OUT&=~SCK //输出0
#define SDA_H P6OUT|=SDA
#define SDA_L P6OUT&=~SDA
typedef union
{
unsigned int i;
float f;
}value;
/**********************************************************************************************************
**Function Name: S_Init
**Description: 初始化
**Input Parameters: 无
**Output Parameters: 无
**********************************************************************************************************/
void S_Init()
{
P6SEL&=~(SCK+SDA); //选择P6.4 为IO端口输出, P6.5输入
P6DIR|=SCK;
P6DIR&=~SDA;
//BCSCTL1=(XT2OFF+RSEL2); //关闭XT2,1MHz DOC
//DCOCTL=DCO2; //设定DCO频率为1MHz
}
/**********************************************************************************************************
**Function Name: CLK_Init
**Description: 时钟初始化
**Input Parameters: 无
**Output Parameters: 无
**********************************************************************************************************/
void CLK_Init()
{
unsigned char i;
BCSCTL1 &= ~XT2OFF;//打开XT振荡器
BCSCTL2 |= SELM1 + SELS;//MCLK为8MHZ,SMCLK为1MHZ
do
{
IFG1 &= ~OFIFG;//清除震荡错误标志
for(i = 0;i < 100;i++);//延时等待
_NOP();
}
while((IFG1 & OFIFG) != 0);//如果标志为1,则循环等待
IFG1 &= ~OFIFG;//清除震荡错误标志
}
/**********************************************************************************************************
**Function Name: init_usart
**Description: 初始化
**Input Parameters: 无
**Output Parameters: 无
**********************************************************************************************************/
void Init_USART()
{
UCTL0 |= SWRST; //串口复位
UCTL0 |= CHAR; // 选择8位字符
UTCTL0 |= SSEL0; // UCLK = ACLK
P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口
P3DIR |=BIT4; //P3.4为输出方向
//P3DIR |= 0x10; // 串口发送数据端口为输出,接收数据端口为输入
UBR00 = 0x41; // 波特率9600
UBR10 = 0x03; //
UMCTL0 = 0x00; // Modulation
ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受
IE1 |= URXIE0 + UTXIE0; // 使能USART0的收发中断
//IFG1 &= ~UTXIFG0;
UCTL0 &= ~SWRST; // 初始化UART状态机
_EINT();
}
/**********************************************************************************************************
**Function Name: print output
**Description:
**Input Parameters: 无
**Output Parameters: 无
**********************************************************************************************************/
void Send_Data(uchar *x)
{
while(*x)
{
while ((IFG1&UTXIFG0)==0);
x++;
}
}
void main()
{
value humi_val,temp_val;
//float dew_point;
uchar TEMP[4];
uchar HUMI[4];
unsigned char error,checksum;
unsigned int i;
S_Init();
CLK_Init();
S_Connectionreset();
WDTCTL=WDTPW+WDTHOLD; //Stop watchdog timer to prevent time out reset
while(1)
{
error=0;
error+=S_Measure((unsigned char*) &humi_val.i,&checksum,HUMIDITY); //measure humidity
error+=S_Measure((unsigned char*) &temp_val.i,&checksum,TEMPERATURE); //measure temperature
if(error!=0)
S_Connectionreset(); //in case of an error: connection reset
else
{
humi_val.f=(float)humi_val.i; //converts integer to float
temp_val.f=(float)temp_val.i; //converts integer to float
S_Calculate (&humi_val.f,&temp_val.f); //calculate humidity, temperature
//dew_point= Calc_Dewpoint (humi_val.f,temp_val.f); //calculate dew point
humi_val.i*=10;
HUMI[0]= humi_val.i /100+0x30;
HUMI[1]= humi_val.i /10%10+0x30;
HUMI[2]='.';
HUMI[3]= humi_val.i %10+0x30;
Send_Data(HUMI);
temp_val.i*=10;
TEMP[0]= temp_val.i/100+0x30;
TEMP[1]= temp_val.i/10%10+0x30;
TEMP[2]='.';
TEMP[3]= temp_val.i%10+0x30;
Send_Data(TEMP);
}
//----------wait approx. 0.8s to avoid heating up SHTxx------------------------------
for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)
//-----------------------------------------------------------------------------------
_NOP();
}
}
其他部分都跟官网提供的程序基本相同,估计问题不大。
本文含有来自论坛的附件或图片:[温湿度传感器程序.txt.rar],点击查看原帖附件。