编写ds18b20的感想
#include "delay.h"
#include <reg51.h>
#include <intrins.h>
void delay_nus(unsigned char n) //延时n + 4 + 1 个周期
{
#pragma asm //第三方发送到发送到
DJNZ R7,$
#pragma endasm
}
/**********************************************
/对于DS18B20的读时隙是从主机把单总线拉低之后,
/在15秒之内就得释放单总线,以让DS18B20把数据
/传输到单总线上。DS18B20在完成一个读时序过程,
/至少需要60us才能完成
**********************************************/
unsigned char Read_Byte(void)
{
unsigned char dat;
unsigned char i;
dat = 0;
for (i = 0; i < 8; ++i)
{
dat >>= 1 ;
DQ = 0;
delay_nus(1);
DQ = 1;
_nop_();
if (DQ == 1)
{
dat |= 0x80;
}
DQ = 1;
delay_nus(50);
}
return dat;
}
/**********************************************
/对于DS18B20的读时隙是从主机把单总线拉低之后,
/DS18B20在15秒~60秒对I/O线采样, ,线上为1就写1
/为0则写0,总过程至少需要60us才能完成
**********************************************/
void Write_Byte(unsigned char dat)
{
unsigned char i;
DQ = 1;
for (i = 0; i < 8; ++i)
{
DQ = 0;
delay_nus(1);
DQ = dat & 0x01;
DQ = dat & 0x01;
delay_nus(40);
DQ = 1;
dat >>= 1;
}
}
今天花了两个多小时来写了这三个函数,之所以花那么多时间,一是因为对C嵌汇编不了解,为了写这个延时函数,花了不少时间. 二是对时序的理解能力还不够.
例如在写unsigned char Read_Byte(void)的时候开始以为是把总线拉低15秒,在这15秒内主机读I/O线.没有释放总线,使总线一直处于主机拉低状态.
现在完整的属于自己的程序还没写好,用来测试这三个函数的程序是已经可以使用的.写完在继续谈感想.不过语言太烂.