📄 18b20._c
字号:
#include <io8515v.h>
#include <macros.h>
#include "d12head.h"
#define TEMPTPORT PORTB
#define TEMPTDDR DDRB
#define TEMPTPIN PINB
#define TEMPTNUM 0 //定义B0口为18b20
/*void delay_us(int time)
{
do{
time--;
}while (time>1);
}
*/
/** /
void delay_ms(long time)
{
time=time*60;
do{
WDR(); //看门狗复位
time--;
}while (time>1);
}
/**/
/*********************************************
检查DS18B20是否存在:
如果DS18B20不存在返回1,否则返回0
*********************************************/
/*///
unsigned char DS18B20_ack(void)
{
unsigned char ack;
TEMPTDDR|=1<<TEMPTNUM; //输出
TEMPTPORT&=~(1<<TEMPTNUM); //输出LOW
delay_us(500);//复位低电平,480us-960us
TEMPTPORT|=1<<TEMPTNUM; //输出HIGH
TEMPTDDR&=~(1<<TEMPTNUM); //输入
delay_us(45);//复位预计600us
ack=TEMPTPIN;
ack &= 1<<TEMPTNUM;
delay_us(500);//等待18B20的自动上拉电阻拉高。
return ack;
}
*////
/*********************************************
写ROM或存贮器命令到DS18B20
*********************************************/
/*///
void DS18B20_write(unsigned char cmd)
{
unsigned char i,j;
TEMPTDDR |= 1<<TEMPTNUM; //输出
for (j=0;j<=7;j++)//两次数据之间的时间间隔大于1us。
{
i=cmd&0x01;
if (i==0x01)//输出1
{
TEMPTPORT &= ~(1<<TEMPTNUM); //输出LOW
delay_us(10);//保持低电平大于1us小于15us
TEMPTPORT |= 1<<TEMPTNUM; //输出HIGH
delay_us(100);//要求持续时间大于60us,小于120us
}
else //输出0
{
TEMPTPORT &= ~(1<<TEMPTNUM); //输出LOW
delay_us(100);
TEMPTPORT |= 1<<TEMPTNUM; //输出HIGH
delay_us(10);
}
cmd=cmd>>1;
}
}
*////
/*********************************************
从DS18B20读温度数据
*********************************************/
/*///
void DS18B20_read(void)
{
unsigned char byteH,byteL,i;
unsigned int tempt=0;
for (i=0;i<8;i++)
{
TEMPTDDR |= 1<<TEMPTNUM; //输出
TEMPTPORT &= ~(1<<TEMPTNUM); //输出LOW
delay_us(3);//发送0,保持大于1us以上时间。
TEMPTPORT |= 1<<TEMPTNUM; //输出HIGH
TEMPTDDR &= ~(1<<TEMPTNUM); //输入
delay_us(10);
if (TEMPTPIN&1<<TEMPTNUM)
byteL |= 0x80;
if (i<7)
byteL = byteL>>1;
delay_us(100);
TEMPTDDR |= 1<<TEMPTNUM; //输出
delay_us(5);
}
for (i=0;i<8;i++)
{
TEMPTDDR |= 1<<TEMPTNUM; //输出
TEMPTPORT &= ~(1<<TEMPTNUM); //输出LOW
delay_us(3);//发送0,保持大于1us以上时间。
TEMPTPORT |= 1<<TEMPTNUM; //输出HIGH
TEMPTDDR &= ~(1<<TEMPTNUM); //输入
delay_us(10);
if (TEMPTPIN&1<<TEMPTNUM)
byteH |= 0x80;
if (i<7)
byteH = byteH>>1;
delay_us(100);
TEMPTDDR |= 1<<TEMPTNUM; //输出
delay_us(5);
}
XmtBuff.msg[0] = byteL;//返回主机有符号的shor int 数
XmtBuff.msg[1] = byteH;//其除以16即为温度值
XmtBuff.msgL = 2;
}
*////
/*///
void converT_command(void)
{
char i;
do{
/// i=DS18B20_ack();//对DS18B20进行复位
} while (i == 1<<TEMPTNUM);
/// DS18B20_write(0xcc); //1100 1100 给18B20发启动命令
/// DS18B20_write(0x44); //0100 0100 给18B20发转换温度指令
}
*////
//delay_ms(900);//延时等转换结束,12位格式约需750ms
/*///
void readT_command (void)
{
char i;
do{
/// i=DS18B20_ack();//对DS18B20进行复位
} while (i == 1<<TEMPTNUM);
/// DS18B20_write(0xcc);//1100 1100 给18B20发启动命令
/// DS18B20_write(0xbe);//1011 1110 给18B20发读温度指令
/// DS18B20_read();
}
*////
void wendu (void)
{
/// converT_command();
/// readT_command();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -