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