CC2530驱动_DHT11

DHT11.c

  DHT11.c如下:

#include <ioCC2530.h>

#define uint unsigned int
#define uchar unsigned char

#define wenshi P0_6

uchar ucharFLAG, uchartemp;
uchar shidu_shi, shidu_ge, wendu_shi, wendu_ge = 4;
uchar ucharT_data_H, ucharT_data_L, ucharRH_data_H, ucharRH_data_L, ucharcheckdata;
uchar ucharT_data_H_temp, ucharT_data_L_temp, ucharRH_data_H_temp, ucharRH_data_L_temp, ucharcheckdata_temp;
uchar ucharcomdata;

uchar temp[2] = {
    
    0, 0};
uchar temp1[5] = "temp=";
uchar humidity[2] = {
    
    0, 0};
uchar humidity1[9] = "humidity=";

void Delay_us() {
    
     /* 1us延时 */
    asm ( "nop" );
    asm ( "nop" );
    asm ( "nop" );
    asm ( "nop" );
    asm ( "nop" );
    asm ( "nop" );
    asm ( "nop" );
    asm ( "nop" );
    asm ( "nop" );
}

void Delay_10us() {
    
     /* 10us延时 */
    Delay_us();
    Delay_us();
    Delay_us();
    Delay_us();
    Delay_us();
    Delay_us();
    Delay_us();
    Delay_us();
    Delay_us();
    Delay_us();
}

void Delay_ms ( uint Time ) {
    
     /* 延时n毫秒 */
    unsigned char i;

    while ( Time-- ) {
    
    
        for ( i = 0; i < 100; i++ ) {
    
    
            Delay_10us();
        }
    }
}

void COM ( void ) {
    
    
    uchar i;

    for ( i = 0; i < 8; i++ ) {
    
    
        ucharFLAG = 2;

        while ( ( !wenshi ) && ucharFLAG++ );

        Delay_10us();
        Delay_10us();
        Delay_10us();
        uchartemp = 0;

        if ( wenshi ) {
    
    
            uchartemp = 1;
        }

        ucharFLAG = 2;

        while ( ( wenshi ) && ucharFLAG++ );

        if ( ucharFLAG == 1 ) {
    
    
            break;
        }

        ucharcomdata <<= 1;
        ucharcomdata |= uchartemp;
    }
}

void DHT11 ( void ) {
    
     /* 温湿传感器启动 */
    wenshi = 0;
    Delay_ms ( 19 ); /* > 18ms */
    wenshi = 1;
    P0DIR &= ~0x40; /* 重新配置IO口方向 */
    Delay_10us();
    Delay_10us();
    Delay_10us();
    Delay_10us();

    if ( !wenshi ) {
    
    
        ucharFLAG = 2;

        while ( ( !wenshi ) && ucharFLAG++ );

        ucharFLAG = 2;

        while ( ( wenshi ) && ucharFLAG++ );

        COM();
        ucharRH_data_H_temp = ucharcomdata;
        COM();
        ucharRH_data_L_temp = ucharcomdata;
        COM();
        ucharT_data_H_temp = ucharcomdata;
        COM();
        ucharT_data_L_temp = ucharcomdata;
        COM();
        ucharcheckdata_temp = ucharcomdata;
        wenshi = 1;
        uchartemp = ( ucharT_data_H_temp + ucharT_data_L_temp + ucharRH_data_H_temp + ucharRH_data_L_temp );

        if ( uchartemp == ucharcheckdata_temp ) {
    
    
            ucharRH_data_H = ucharRH_data_H_temp;
            ucharRH_data_L = ucharRH_data_L_temp;
            ucharT_data_H = ucharT_data_H_temp;
            ucharT_data_L = ucharT_data_L_temp;
            ucharcheckdata = ucharcheckdata_temp;
        }

        wendu_shi = ucharT_data_H / 10;
        wendu_ge = ucharT_data_H % 10;
        shidu_shi = ucharRH_data_H / 10;
        shidu_ge = ucharRH_data_H % 10;
    } else {
    
     /* 没有成功读取,返回0 */
        wendu_shi = 0;
        wendu_ge = 0;
        shidu_shi = 0;
        shidu_ge = 0;
    }
}

DHT11.h

  DHT11.h如下:

#ifndef __DHT11_H__
#define __DHT11_H__

#define uchar unsigned char
extern void Delay_ms ( unsigned int xms ); /* 延时函数 */
extern void COM ( void ); /* 温湿写入 */
extern void DHT11 ( void ); /* 温湿传感启动 */

extern uchar temp[2];
extern uchar temp1[5];
extern uchar humidity[2];
extern uchar humidity1[9];
extern uchar shidu_shi, shidu_ge, wendu_shi, wendu_ge;
#endif

UART.c

  UART.c如下:

#include <ioCC2530.h>

#define uchar unsigned char
#define uint unsigned int

void InitUart(); /* 初始化串口 */
void Uart_Send_String ( unsigned char *Data, int len );

void InitUart() {
    
    
    CLKCONCMD &= ~0x40; /* 设置系统时钟源为32MHZ晶振 */

    while ( CLKCONSTA & 0x40 ); /* 等待晶振稳定 */

    CLKCONCMD &= ~0x47; /* 设置系统主时钟频率为32MHZ */
    PERCFG = 0x00; /* 位置1 P0口 */
    P0SEL = 0x3c; /* P0_2、P0_3、P0_4、P0_5用作串口,第二功能 */
    P2DIR &= ~0XC0; /* P0优先作为UART0,优先级 */
    U0CSR |= 0x80;  /* UART方式 */
    U0GCR |= 11; /* U0GCR与U0BAUD配合 */
    U0BAUD |= 216; /* 波特率设为115200 */
    UTX0IF = 0; /* UART0的TX中断标志初始置位0 */
}

void Uart_Send_String ( uchar *Data, int len ) {
    
    
    int j;

    for ( j = 0; j < len; j++ ) {
    
    
        U0DBUF = *Data++;

        while ( UTX0IF == 0 );

        UTX0IF = 0;
    }
}

UART.h

  UART.h如下:

#ifndef __UART_H__
#define __UART_H__

extern void InitUart();
extern void Uart_Send_String ( unsigned char *Data, int len );
#endif

main.c

  main.c如下:

#include <ioCC2530.h>
#include <string.h>
#include "UART.h"
#include "DHT11.h"

void main ( void ) {
    
    
    Delay_ms ( 1000 ); /* 让设备稳定 */
    InitUart(); /* 串口初始化 */

    while ( 1 ) {
    
    
        DHT11(); /* 获取温湿度 */
        P0DIR |= 0x40; /* IO口需要重新配置 */
        /*----- 温湿度的ASCII码转换 -----*/
        temp[0] = wendu_shi + 0x30;
        temp[1] = wendu_ge + 0x30;
        humidity[0] = shidu_shi + 0x30;
        humidity[1] = shidu_ge + 0x30;
        /*------- 信息通过串口打印 --------*/
        Uart_Send_String ( temp1, 5 );
        Uart_Send_String ( temp, 2 );
        Uart_Send_String ( "\n", 1 );
        Uart_Send_String ( humidity1, 9 );
        Uart_Send_String ( humidity, 2 );
        Uart_Send_String ( "\n", 1 );
        Delay_ms ( 2000 ); /* 延时,使周期性2S读取1次 */
    }
}

猜你喜欢

转载自blog.csdn.net/fukangwei_lite/article/details/121051675