📄 18202.c
字号:
//DS18B20的底层驱动函数
#include<spce061a_chf.h>
#include"1820.h"
#include"bit.h"
//延时函数,一共延时t*1.9285us
void delay(unsigned int t)
{
//*P_SystemClock=0x88;//49.152M
do
{
t-=1;
asm("nop");
}while(t);
//*P_SystemClock=0x1b;//24.576M
}
//发复位脉冲函数
unsigned int rest()
{
*P_IOA_Dir=0x01;//IOA0为输出口
DQ=1;//先输出高电平
delay(1);
DQ=0;
delay(600);//输出低电平后释放单线就可以了600us
DQ=1;
*P_IOA_Dir=0x00;
delay(60);//30us
if(DQ)
{
return 0;
}
delay(240);
if(DQ)
{
return 1;
}
return 0;//延时不变回高低电平就是失败
}
//读1或0的时序一样
unsigned int read_bit()
{
unsigned int b;
*P_IOA_Dir=0x01;//IOA0为输出口
DQ=1;//先输出高电平
delay(1);
DQ=0;//数据线电平拉低
delay(3); //10us
DQ=1;//上拉
*P_IOA_Dir=0x00;//44个周期
delay(5);
if(DQ)//44个周期)
{
b=0x01;
}
else
{
b=0x00;
}
delay(60);//的恢复时间40us读时间间隔为60us
return(b);
}
//写1或0时序不一样,所以要分开成每一位来写
void write_byte(unsigned int value)
{
unsigned int f;
for(f=0;f<8;f++)
{
*P_IOA_Dir=0x01;//IOA0为输出口
DQ=1;//先输出高电平
delay(1);
if((value&0x01)==0)
{
//*P_IOA_Dir=0x01;
DQ=0;
delay(70);//延时写0时间片40us
DQ=1;
*P_IOA_Dir=0x00;
delay(5);//1us//上拉时间为5us
}
else//写1时间片
{
//*P_IOA_Dir=0x01;
DQ=0;
delay(5);//10us
DQ=1;
delay(60);//输出高电平表示1??????????
*P_IOA_Dir=0x00;//改为输入则释放总 线
delay(5);//数据线电平拉低后延时1us就释放,等待1820采样
}
value>>=1;
delay(1);
}
*P_IOA_Dir=0x01;//IOA0为输出口
DQ=1;//先输出高电平
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -