📄 18b20.c
字号:
/*********************************************************************************************
* File: led.c
* Author: embest
* Desc: control board's LEDs
* History:
*********************************************************************************************/
#include "44b.h"
#include "44blib.h"
/*------------------------------------------------------------------------------------ -*/
/* constant define */
/*--------------------------------------------------------------------------------- ----*/
#define SET_BIT rPDATG|=0x80
#define CLR_BIT rPDATG&=~(0x80)
#define PORT_IN rPCONG=0x3fff
#define PORT_OUT rPCONG=0x7fff
#define BIT_VALUE (unsigned char *)((rPDATG&0x80)>>7)
/*------------------------------------------------------------------------------------------*/
/* global variables */
/*------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------*/
/* function declare */
/*------------------------------------------------------------------------------------------*/
unsigned char test_18b20(void); /* LED test */
void convert_T(void) ;
unsigned char read_T(void);
unsigned char init_1820(void);
void config_18b20(void);
void write_1820(unsigned char x);
unsigned char read_1820(void);
/*********************************************************************************************
* name: test_18b20
* func: leds test funciton
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
unsigned char test_18b20(void)
{
unsigned char temp;
convert_T();
if(temp!=read_T()) temp=read_T();
uart_printf("\n temp= %d",temp);
delay(10000);
return(temp);
}
/******************************************************************************
*name:config_1820()
*func:配置18b20
*part:none
*ret:none
*******************************************************************************/
void config_18b20(void)
{
PORT_IN; /*设置为输入模式,(上电时为高电平) */
CLR_BIT; /*输出锁存器写0,以后不再更改 */
}
/******************************************************************************
*name:init_1820()
*func:初始化18b20
*part:none
*ret:none
*******************************************************************************/
unsigned char init_1820(void)
{
unsigned char bus_flag; /*用来返回的标志位 */
config_18b20();
PORT_OUT; /*设置1-wire总线为低电平(占领总线) */
CLR_BIT; /*P7=0 */
delay_10us(50); /*延时490us */
SET_BIT; /*PD3=1 */
PORT_IN; /*设置1-wire总线为高电平(释放总线) */
delay_10us(7);
if(BIT_VALUE) /* 探测总线上是否有器件*/
bus_flag=0; /*没有发现有器件在线 */
else bus_flag=1; /* 发现有器件 */
delay_10us(20);
return(bus_flag); /*60~240us */
}
/******************************************************************************
*name:read_1820()
*func:读18b20
*part:none
*ret:none
*******************************************************************************/
unsigned char read_1820(void)
{
unsigned char count,temp;
temp = 0x00; /* 数据接收准备 */
for(count=0; count<8; count++) {
PORT_OUT;
CLR_BIT;
delay_1us(4);
SET_BIT;
PORT_IN; /* 设置1-wire总线为高电平(释放总线) */
delay_1us(4); /* 延时4us*/
if(BIT_VALUE)
temp|=(1<<count); /* 读取总线电平,先收低位再收高位 */
else temp&=~(1<<count);
delay_1us(62); /* 必须大于60us */
PORT_OUT;
SET_BIT;
}
return temp;
}
/******************************************************************************
*name:init_1820()
*func:初始化18b20
*part:none
*ret:none
*******************************************************************************/
void write_1820(unsigned char dat)
{
unsigned char count;
PORT_OUT; /* 设置1-wire总线为低电平 */
for(count=0; count<8; count++) {
if(dat&0x01){
delay_1us(3);
CLR_BIT;
delay_1us(10);
SET_BIT;
delay_1us(65); /* 并串转换,先低位后高位 */
} else {
delay_1us(3);
CLR_BIT;
delay_1us(65);
SET_BIT;
}
dat >>= 1;
}
}
/**************温度转换函数****************************/
void convert_T(void)
{
if(init_1820()==1) { /* 如果复位成功 */
write_1820(0xcc); /* 跳过多器件识别 */
write_1820(0x44); /* 启动温度转换 */
}
}
/************读取转换后的温度值 **************************/
unsigned char read_T(void)
{
unsigned char a,b,temp;
volatile unsigned char t=0;
if(init_1820()==1) { /* 如果复位成功 */
write_1820(0xcc); /* 跳过多器件识别 */
write_1820(0xbe); /* 读暂存器 */
a = read_1820(); /*读取温度值低位 */
b = read_1820(); /*读取温度值高位 */
temp = b & 0x80; /*前5位符号,温度大于0,这5位为0,值乘0.0625即得实际温度 */
/*温度小于0,这5位为1,数值取反加1再乘0.0625即得实际温度*/
if(temp == 0)
{ t = b << 4;
a=a>>4;
t = t + a;}
else
{ b = b & 0x07;
t = b << 8;
t = t + a;
t = ~t + 1;}
t = t * 0.625;
return(t);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -