📄 18b20control.c
字号:
#include <iom16v.h>
#include <macros.h>
#include "DS18B20.h"
//#include "7279.h"
int value=0;
/***************************************
检查DS1820是否存在;
如果存在返回1;否则返回0
***************************************/
unsigned char DS18B20_reset(void)
{
unsigned char bus_flag;
PORTB|=(1<<5);
PORTB&=~(1<<5); // 设置1-wire总线为低电平(占领总线)...
/* 现在延迟480us~960us, 与硬件密切相关,但应尽可能选小值(480us),
把抖动留给系统(比如在延迟期间发生中断导致延迟变长)。
*/
delay(327); // 490us
CLI(); // 下面这段时间要求比较严格,为保险起见,关中断
PORTB|=(1<<5);; // 设置1-wire总线为高电平(释放总线)
/* 这个浮点数是由编译器计算好的,而不是由你的MCU在运行时临时计算的,
所以不会占用用户MCU的时间,不必担心(看看前面的宏你就可以确定了)
*/
//delay_nus(12); // 最佳时间: 60us+7.5us!(忙延时,只是一种策略)
// 探测总线上是否有器件
DDRB&=~(1<<5);
delay(40);
if(DQ_status()) bus_flag=0; // 复位单总线但没有发现有器件在线
else bus_flag=1; // 复位单总线并发现有器件在线
SEI(); // 退出临界代码区(开中断)
/* 保证Master释放总线的时间(不是说总线处于高电平的时间)不小于
480us即可,这一时间从读总线状态之前就开始了,所以这里把这个
时间计算在内。在Master释放总线的前半段,也是被动器件声明它
们在线之时。
*/
DDRB|=(1<<5);
NOP();
PORTB|=(1<<5);;
delay(150); // 490-67.5us
return(bus_flag);
}
/***************************************
从DS18B20读取1字节数据
***************************************/
unsigned char DS18B20_read(void)
{
unsigned char i,Read_Byte=0;
for(i=0;i<8;i++)
{
CLI();
PORTB&=~(1<<5); // 设置1-wire总线为低电平(拉低总线以同步)
//delay_nus(2);
PORTB|=(1<<5);; // 设置1-wire总线为高电平(释放总线)
//delay_nus(4); // 4us
DDRB&=~(1<<5);
Read_Byte>>=1; //右移一位
if(PINB&(1<<5)) Read_Byte|=0x80; // 读取总线电平,先收低位再收高位
SEI(); // 恢复系统中断
delay(50); // 必须大于60us
SEI();
DDRB|=(1<<5);
NOP();
}
return(Read_Byte);
}
/***************************************
写命令到DS18B20
***************************************/
void DS18B20_write(unsigned char cmd)
{
unsigned char Write_Temp,j;
for(j=0;j<=7;j++)
{
CLI();
PORTB&=~(1<<5); // 设置1-wire总线为低电平
//delay_nus(2);
if(cmd&0x01) PORTB|=(1<<5); // 并串转换,先低位后高位
else PORTB&=~(1<<5);
cmd>>=1;
delay(40);
PORTB|=(1<<5);;
SEI();
//delay_nus(2);
}
}
void Write_Init(void)
{
DS18B20_reset();
DS18B20_write(0xcc);
DS18B20_write(0x4E);
DS18B20_write(0x10);
DS18B20_write(0x80);
DS18B20_write(0x7F);
}
void convert_T(void)
{
//if(DS18B20_reset()==1) // 如果复位成功
//{
DS18B20_reset();
DS18B20_write(0xcc); // 跳过多器件识别
DS18B20_write(0x44); // 启动温度转换
//PORTA|=(1<<1);
//delay(400);
//}
}
int Read_T(void)
{
//if(DS18B20_reset()==1) { // 如果复位成功
DS18B20_reset();
DS18B20_write(0xcc); // 跳过多器件识别
DS18B20_write(0xbe); // 读暂存器
value = (int)DS18B20_read(); // 低字节
value += (int)((DS18B20_read())<<8); // 高字节
//}
return(value);
}
/****内部CRC较验****/
unsigned char CRCcheck(unsigned char *ValuePoint,unsigned char len)
{
unsigned char bit0,cbit,r,temp,i,j,byte;
temp=0;
for(j=0;j<len;j++)
{
byte=ValuePoint[j];
for(i=0;i<8;i++)
{
cbit=temp&0x01;
bit0=byte&0x01;
temp=temp>>1;
r=cbit^bit0;
if(r==1)
temp=temp^0x8c;
byte=byte>>1;
}
}
return temp;
}
/***************************
将十六进制转ASCII码,并显示
***************************/
/*void asc2con(unsigned char *p,unsigned char len)
{
unsigned char i,temp;
for(i=0;i<len;i++)
{
temp=p[len-1-i]&0xf0;
temp=temp>>4;
LCD_write_string(0,1,table[temp]);
temp=p[len-1-i]&0x0f;
LCD_write_string(1,1,table[temp]);
}
}*/
/************************************
匹配DS18B0
*************************************/
void DS18B20_match(unsigned char *p)
{
unsigned char i;
DS18B20_reset();
DS18B20_write(0x55);
for(i=0;i<8;i++)
DS18B20_write(p[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -