关闭

编写ds18b20的感想

585人阅读 评论(0) 收藏 举报

#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线.没有释放总线,使总线一直处于主机拉低状态.

现在完整的属于自己的程序还没写好,用来测试这三个函数的程序是已经可以使用的.写完在继续谈感想.不过语言太烂.

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:183420次
    • 积分:2312
    • 等级:
    • 排名:第16822名
    • 原创:41篇
    • 转载:55篇
    • 译文:0篇
    • 评论:31条
    最新评论