標題: 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://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |