标题: DHT11调试实验 [打印本页]
作者: hhhhhhhgg 时间: 2018-11-13 21:30
标题: DHT11调试实验
DHT11代码
/*
* DHT11.c
*
*/
#include<DHT11.h>
#include<PWM.h>
#include<OLED.h>
#include <stdarg.h>
#include <string.h>
unsigned char Temperature[6];
unsigned char num1[5];
unsigned char num2[5];
//USCI初始化为USART模式
void USCI_A0_init()
{
BCSCTL1 = CALBC1_8MHZ; // Set DCO
DCOCTL = CALDCO_8MHZ;
P1SEL |=BIT1+BIT2;
P1SEL2 |= BIT1+BIT2;// P1=RXD P2=TXD
//UCA0CTL0就用初始状态全为0,默认设置为校验禁止,8位数据,1位停止位,UART模式,异步模式,因此不用对UCA0CTL0进行操作
UCA0CTL1 |= UCSWRST;
//选择产生波特率的时钟
UCA0CTL1 |= UCSSEL_2;
//UCA0MCTL = UCBRF_0 + UCBRS_1;
//UCA0MCTL = UCBRS0;
UCA0BR0 = 65;//设置波特率为9600
UCA0BR1 = 3;
UCA0CTL1 &=~UCSWRST;
//IE2 |= UCA0RXIE;//使能接收和发送中断
//_enable_interrupts();
}
void Send_string(const unsigned char *Ptr)
{
while(*Ptr)
{
if(*Ptr=='\n')
{
while(UCA0STAT & UCBUSY);
UCA0TXBUF='\r';
}
//等待发送缓存器清空或者发送完成
while(UCA0STAT&UCBUSY);
//把数据传入发送缓存器
UCA0TXBUF = *Ptr;
//指针后移
Ptr++;
}
}
void IntToString(int temp,char *pchar)
{
char ch,*p=pchar;
while(temp!=0){
*pchar++=(char)(temp%10+0x30);
temp/=10;
}
*pchar--='\0';
while(pchar>p){
ch=*p;
*p++=*pchar;
*pchar--=ch;
}
}
void Vs_Printf(char *s,char *format,va_list arg)
{
char *pchar;
char *temp;
for(pchar=format;*pchar;pchar++){
if(*pchar !='%'){
*s++=*pchar;
continue;
}
switch(*++pchar){
case 'd' :{
IntToString(va_arg(arg,int),s);
while(*s++);
*--s='0';
break;
}
case 's' :{
temp=va_arg(arg,char *);
while(*s++=*temp++);
*--s='0';
break;
}
case 'c' :{
*s++=va_arg(arg,char);
break;
}
default :break;
}
}
*s='\0';
}
void Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
Vs_Printf(string,fmt,ap);
Send_string(string);
va_end(ap);
}
unsigned char ADS1115_float_to_char(int d, unsigned char* str)
{
unsigned char str1[5];
int j=0,k,i;
i = d;//浮点数的整数部分
while(i>0)
{
str1[j++] = i%10+'0';
i /= 10;
}
while(i>0)
{
str1[j++] = i%10+'0';
i /= 10;
}
for(k=0;k<j;k++)
str[k] = str1[j-1-k];
str[++j] = '\0';
return 1;
}
void Get_Temperature()
{
int i;
//开始信号 Data_Out;
Data_L;
delay_ms(20);//18ms
//读取响应
Data_H;
Data_Read;
delay_us(30);//40us
if(!(P1IN&BIT4))
{
while(!(P1IN&BIT4));//等待拉高
while(P1IN&BIT4);//等待拉低
}
for(i=0;i<40;i++)
{
while(!(P1IN&BIT4));//等待总线高
if(i>=0&&i<=7)
{
Temperature[0]<<=1;
delay_us(40);
if(P1IN&BIT4)
Temperature[0]++;
}
if(i>=8&&i<=15)
{
Temperature[1]<<=1;
delay_us(40);
if(P1IN&BIT4)
Temperature[1]++;
}
if(i>=16&&i<=23)//温度整数位 {
Temperature[2]<<=1;
delay_us(40);
if(P1IN&BIT4)
Temperature[2]++;
}
if(i>=24&&i<=31)
{
Temperature[3]<<=1;
delay_us(40);
if(P1IN&BIT4)
Temperature[3]++;
}
if(i>=32&&i<=39)
{
Temperature[4]<<=1;
delay_us(40);
if(P1IN&BIT4)
Temperature[4]++;
}
while(P1IN&BIT4);
}
ADS1115_float_to_char(Temperature[0], num1);
ADS1115_float_to_char(Temperature[2], num2);
Printf("湿度: ");
Send_string(num1);
Printf("\n");
Printf("温度: ");
Send_string(num2);
Printf("\n");
主程序
#include <msp430.h>
#include<DHT11.h>
#include<PWM.h>
#include<OLED.h>
/*
* main.c
*/
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
USCI_A0_init();
while(1)
{
Get_Temperature();
delay_ms(1500);//18ms
}
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |