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
}
}
|