关于用MSP430F149测量温湿度和风速的问题

[复制链接]
查看11 | 回复2 | 2021-1-27 06:46:24 | 显示全部楼层 |阅读模式
关于用MSP430F149测温湿度和风速的问题,温湿度传感器用的是DHT11(直接输出数字信号),风速采集的是模拟信号经过AD转换后输出。现在问题是用串口调试助手调试时显示的全是0(完全没有按指定的数据帧格式输出,不过在测试时风速传感器没有接单片机(不知道有没有影响)),但如果把风速那块程序注释掉,又可以按指定的格式输出。代码如下:
#include
//#include"dht11.h"
//#include"uart0.h"
#include"Config.h"
#include
chars[40];
voiddelayus(unsignedintn);
typedefunsignedintU16;
typedefunsignedcharU8;
unsignedcharU8FLAG,k;
unsignedcharU8count,U8temp;
unsignedcharU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsignedcharU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsignedcharU8comdata;
unsignedcharoutdata[5];//定义发送的字节数
unsignedcharindata[5];
unsignedcharcount,count_r=0;
unsignedintU16temp1,U16temp2;
uintTEMP0=0;//ADC值暂存变量
ucharValue[9];
uintCount=0;//时间计数变量

voidVoltage_do(uchartemp0,uchartemp1,uchartemp2,uchartemp3,uinttemp4)
{
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相关寄存器
//*************************************************************************
voidADC_Init()
{
P6SEL|=0x01;//选择ADC通道
ADC12CTL0|=ADC12ON+SHT0_2+MSC;
ADC12CTL1|=ADC12SSEL1+ADC12SSEL0+CONSEQ_2+SHP;//SMCLK做时钟源
ADC12MCTL0=INCH_0;//参考控制位及通道选择,这里选择通道0
ADC12CTL0|=ENC;//使能转换器
}
//*************************************************************************
//串口初始化及发送
//*************************************************************************
voidUART_Init()
{
U0CTL|=SWRST;//复位SWRST
U0CTL|=CHAR;//8位数据模式
U0TCTL|=SSEL1;//SMCLK为串口时钟
U0BR1=baud_h;//BRCLK=8MHZ,Baud=BRCLK/N
U0BR0=baud_l;//N=UBR+(UxMCTL)/8
U0MCTL=0x00;//微调寄存器为0,波特率9600bps
ME1|=UTXE0;//UART1发送使能
ME1|=URXE0;//UART1接收使能
U0CTL&=~SWRST;
IE1|=URXIE0;//接收中断使能位
P3SEL|=BIT4;//设置IO口为普通I/O模式
P3DIR|=BIT4;//设置IO口方向为输出
P3SEL|=BIT5;
}
voidSend_Byte(uchardata)
{
while((IFG1&UTXIFG0)==0);//发送寄存器空的时候发送数据
U0TXBUF=data;
}

//////////////////////DHT11///////////////////////////////////////////////////////
voidDHT11_ReadChar(void)
{
U8i;
DHT11_INPUT;
for(i=0;i599)Second=0;//最大计数99秒
}

///////////////////////主函数///////////////////////////////////////////
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
Clock_Init();
UART_Init();
delay_ms(100);//延时100ms
delay_ms(100);//延时100ms
delay_ms(50000);
TIMERA_Init();//设置TIMERA,P12输出PWM信号
_EINT();
ADC12CTL0|=ADC12SC;//开启转换
while(1)
{
start_DHT11();
while((ADC12IFG&0x0001)==0);//等待转换结束
TEMP0=ADC12MEM0;//读取ADC转换值
Voltage_do(U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,TEMP0);
}
}

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:46:24 | 显示全部楼层
你在AD转换的时候有问题,我记得没错的话,对MSP430F149来说他的AD转换开启ADC12CTL0|=ADC12SC;要在每次转换开始的时候都要加一次。我觉得你的错误原因是在这里,也就是说转换第一次完成后来不及显示,DHT11也反应完了,这次(ADC12IFG&0x0001)==0恒成立遍一直再那里死循环,不过就是时不时的进下定时器中断,进而输出一直是不会变的。
建议你的死循环这样写
while(1)
{
start_DHT11();
ADC12CTL0|=ADC12SC;
while((ADC12IFG&0x0001)==0);//等待转换结束
TEMP0=ADC12MEM0;//读取ADC转换值
Voltage_do(U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,TEMP0);
}
如果还不能解决问题你还是连上仿真器,在线实时仿真一下吧
回复

使用道具 举报

千问 | 2021-1-27 06:46:24 | 显示全部楼层
谢谢你的回答,问题我已经找到了,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行