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就用初始狀態(tài)全為0,默認(rèn)設(shè)置為校驗(yàn)禁止,8位數(shù)據(jù),1位停止位,UART模式,異步模式,因此不用對(duì)UCA0CTL0進(jìn)行操作 UCA0CTL1 |= UCSWRST; //選擇產(chǎn)生波特率的時(shí)鐘 UCA0CTL1 |= UCSSEL_2; //UCA0MCTL = UCBRF_0 + UCBRS_1; //UCA0MCTL = UCBRS0; UCA0BR0 = 65;//設(shè)置波特率為9600 UCA0BR1 = 3; UCA0CTL1 &=~UCSWRST; //IE2 |= UCA0RXIE;//使能接收和發(fā)送中斷 //_enable_interrupts(); } void Send_string(const unsigned char *Ptr) { while(*Ptr) { if(*Ptr=='\n') { while(UCA0STAT & UCBUSY); UCA0TXBUF='\r'; } //等待發(fā)送緩存器清空或者發(fā)送完成 while(UCA0STAT&UCBUSY); //把數(shù)據(jù)傳入發(fā)送緩存器 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;//浮點(diǎn)數(shù)的整數(shù)部分 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; //開(kāi)始信號(hào) Data_Out; Data_L; delay_ms(20);//18ms //讀取響應(yīng) 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));//等待總線(xiàn)高 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)//溫度整數(shù)位 { 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
}
}
|