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