CC2530驱动_ds18b20

文章目录

ds18b20.c

  ds18b20.c如下:

#include "iocc2530.h"

#define uint unsigned int
#define uchar unsigned char

#define Ds18b20Data P0_6 /* 温度传感器引脚 */

#define ON  0x01 /* 读取成功返回0x00,失败返回0x01 */
#define OFF 0x00

unsigned char temp; /* 储存温度信息 */

void Ds18b20Delay ( uint k ) {
    
     /* 时钟频率为32M */
    uint i, j;

    for ( i = 0; i < k; i++ )
        for ( j = 0; j < 2; j++ );
}

void Ds18b20InputInitial ( void ) {
    
     /* 设置端口为输入 */
    P0DIR &= 0xbf;
}

void Ds18b20OutputInitial ( void ) {
    
     /* 设置端口为输出 */
    P0DIR |= 0x40;
}

uchar Ds18b20Initial ( void ) {
    
     /* ds18b20初始化,初始化成功返回0x00,失败返回0x01 */
    uchar Status = 0x00;
    uint CONT_1 = 0;
    uchar Flag_1 = ON;
    Ds18b20OutputInitial();
    Ds18b20Data = 1;
    Ds18b20Delay ( 260 );
    Ds18b20Data = 0;
    Ds18b20Delay ( 750 );
    Ds18b20Data = 1;
    Ds18b20InputInitial();

    while ( ( Ds18b20Data != 0 ) && ( Flag_1 == ON ) ) {
    
     /* 等待ds18b20响应,具有防止超时功能 */
        /* 等待约60ms左右 */
        CONT_1++;
        Ds18b20Delay ( 10 );

        if ( CONT_1 > 8000 ) {
    
    
            Flag_1 = OFF;
        }

        Status = Ds18b20Data;
    }

    Ds18b20OutputInitial();
    Ds18b20Data = 1;
    Ds18b20Delay ( 100 );
    return Status;
}

void Ds18b20Write ( uchar infor ) {
    
    
    uint i;
    Ds18b20OutputInitial();

    for ( i = 0; i < 8; i++ ) {
    
    
        if ( ( infor & 0x01 ) ) {
    
    
            Ds18b20Data = 0;
            Ds18b20Delay ( 6 );
            Ds18b20Data = 1;
            Ds18b20Delay ( 50 );
        } else {
    
    
            Ds18b20Data = 0;
            Ds18b20Delay ( 50 );
            Ds18b20Data = 1;
            Ds18b20Delay ( 6 );
        }

        infor >>= 1;
    }
}

uchar Ds18b20Read ( void ) {
    
    
    uchar Value = 0x00;
    uint i;
    Ds18b20OutputInitial();
    Ds18b20Data = 1;
    Ds18b20Delay ( 10 );

    for ( i = 0; i < 8; i++ ) {
    
    
        Value >>= 1;
        Ds18b20OutputInitial();
        Ds18b20Data = 0;
        Ds18b20Delay ( 3 );
        Ds18b20Data = 1;
        Ds18b20Delay ( 3 );
        Ds18b20InputInitial();

        if ( Ds18b20Data == 1 ) {
    
    
            Value |= 0x80;
        }

        Ds18b20Delay ( 15 );
    }

    return Value;
}

void Temp_test ( void ) {
    
     /* 温度读取函数 */
    uchar V1, V2;
    Ds18b20Initial();
    Ds18b20Write ( 0xcc );
    Ds18b20Write ( 0x44 );
    Ds18b20Initial();
    Ds18b20Write ( 0xcc );
    Ds18b20Write ( 0xbe );
    V1 = Ds18b20Read();
    V2 = Ds18b20Read();
    temp = ( ( V1 >> 4 ) + ( ( V2 & 0x07 ) * 16 ) );
}

ds18b20.h

  ds18b20.h如下:

#ifndef __DS18B20_H__
#define __DS18B20_H__

extern unsigned char temp;
extern unsigned char Ds18b20Initial ( void );
extern void Temp_test ( void );
#endif

main.c

  main.c如下:

#include "iocc2530.h"
#include "stdio.h"
#include "ds18b20.h"

__near_func int putchar ( int c ) {
    
    
    UTX0IF = 0;
    U0DBUF = ( char ) c;

    while ( UTX0IF == 0 );

    return ( c );
}

void InitUART ( void ) {
    
    
    PERCFG = 0x00; /* (外设控制寄存器)USART_0的I/O位置为备用位置0 */
    P0SEL = 0x0c; /* P0_2和P0_3用作串口(外部设备功能) */
    P2DIR &= ~0XC0; /* (端口2方向和端口0外设优先级控制)P0优先作为UART0 */
    U0CSR |= 0x80; /* 设置为UART模式 */
    U0GCR |= 8; /* 波特率指数值,BAUD_E和BAUD_M决定了UART波特率 */
    U0BAUD |= 59; /* 波特率设为9600 */
    UTX0IF = 0; /* UART0的TX中断标志初始设置为0 */
}

void Delayms ( int xms ) {
    
     /* 延时xms毫秒 */
    int i, j;

    for ( i = xms; i > 0; i-- )
        for ( j = 587; j > 0; j-- );
}

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

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

    CLKCONCMD &= ~0x47; /* 设置系统主时钟频率为32MHz */
    P0SEL &= 0xbf; /* DS18B20的io口初始化 */
    InitUART();

    while ( 1 ) {
    
    
        Temp_test(); /* 温度检测 */
        printf ( "The temp is %d\r\n", temp );
        Delayms ( 500 );
    }
}

猜你喜欢

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