📄 18b20._c
字号:
#include <io8515v.h>
#include <macros.h>
#include <162-1302.h>
//时间延迟
void delayb(uint x) //1.5us左右
{
while(x)
{
x--;
}
}
//18b20初始化
uchar init_1820()
{ uchar ack;
B20_DATA_DDR|=B20_DATA_IO ; //输出
B20_DATA_PORT&=~B20_DATA_IO ;
delayb(600); //复位低电平480us~960us
B20_DATA_PORT|=B20_DATA_IO ; //电平拉高
B20_DATA_DDR&=~B20_DATA_IO ; //输入
delayb(90); //延时60us~240us
ack=B20_DATA_PIN; //读出ack的值
ack&=B20_DATA_IO;
delayb(200); //等待480us以上
B20_DATA_DDR|=B20_DATA_IO ; //输出
return(ack);
}
//写一个字节
void write_1820(uchar x)
{
uchar i,m;
B20_DATA_DDR|=B20_DATA_IO; //输出
for(i=0;i<8;i++)
{
m=x&0x01;
if(m==0x01)
{
delayb(1); //延时>1us
B20_DATA_PORT&=~B20_DATA_IO; //产生写起始信号
delayb(3); //延时1us~15us 8us
B20_DATA_PORT|=B20_DATA_IO; //数据线电平拉高
delayb(55); //延时60us~120us 85us
}
else
{
delayb(1); //延时>1us
B20_DATA_PORT&=~B20_DATA_IO; //产生写起始信号
delayb(55); //B20采样要60us到120us 85us
B20_DATA_PORT|=B20_DATA_IO; //数据线电平拉高
}
x=x>>1; //右移一位
}
}
//读一个字节
uchar read_1820()
{
uchar temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
B20_DATA_DDR|=B20_DATA_IO; //输出
B20_DATA_PORT&=~B20_DATA_IO; //产生读起始信号
asm("nop");
asm("nop");
asm("nop");
asm("nop"); //延时1us~15us 2us
B20_DATA_PORT|=B20_DATA_IO; //电平拉高
B20_DATA_DDR&=~B20_DATA_IO; //接收数据
asm("nop"); //要在15us内完成读数
asm("nop");
k=B20_DATA_PIN; //读数据,从低位开始
k&=0x01;
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
delay(40); //60~120us
B20_DATA_DDR|=B20_DATA_IO; //输出
B20_DATA_PORT|=B20_DATA_IO;
}
return temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -