wanshouxujiu 2022-05-02 21:09 采纳率: 80%
浏览 20

单总线通信,循环发送8bit失败(51单片机)

单总线通信,只能循环调用发送8次bit
不能直接一个函数解决一个byte,不知道什么原理

成功的例子:


```c
//发送bit
void Onewire_SendBit(unsigned char Bit)
{
    unsigned char i;
    OneWire_DQ = 0;
    i = 4;while (--i);          //Dealy 10us,因为如果发送1,需要先延时1~15us
    OneWire_DQ = Bit;
    i = 23;while (--i); //再Dealy 50us,因为如果发送0,需要保持60~120us
    OneWire_DQ = 1;
}

//发送Byte
void OneWire_Sendbyte(unsigned char Data)
{
    unsigned char j;
    for(j = 0; j < 8; j++)
    {
        Onewire_SendBit(Data & 0x01<<j);
    }
}

**失败的例子:**
发送byte 失败
void OneWire_Sendbyte(unsigned char Data)
{
    unsigned char j,i;
    for(j = 0; j < 8; j++)
    {
        OneWire_DQ = 0;
        i = 4;while (--i);          //Dealy 10us,因为如果发送1,需要先延时1~15us
        OneWire_DQ = (Data & 0x01<<j);
        i = 23;while (--i); //再Dealy 50us,因为如果发送0,需要保持60~120us
        OneWire_DQ = 1;
    }
}


以下是我单总线模块全部代码:

```c
#include <REGX52.H>

sbit OneWire_DQ = P3^7;

//起始
unsigned char OneWire_Start()
{
    unsigned char i,AckBit;
    OneWire_DQ = 1;
    OneWire_DQ = 0;
    i = 221;while (--i);      //480us
    OneWire_DQ = 1;
    i = 29;while (--i);       //65us
    AckBit = OneWire_DQ;
    i = 221;while (--i);      //480us,等待从机
    
    return AckBit;
}

//发送bit
void Onewire_SendBit(unsigned char Bit)
{
    unsigned char i;
    OneWire_DQ = 0;
    i = 4;while (--i);          //Dealy 10us,因为如果发送1,需要先延时1~15us
    OneWire_DQ = Bit;
    i = 23;while (--i); //再Dealy 50us,因为如果发送0,需要保持60~120us
    OneWire_DQ = 1;
}

//发送Byte
void OneWire_Sendbyte(unsigned char Data)
{
    unsigned char j;
    for(j = 0; j < 8; j++)
    {
        Onewire_SendBit(Data & 0x01<<j);
    }
}

//发送byte 失败
//void OneWire_Sendbyte(unsigned char Data)
//{
//    unsigned char j,i;
//    for(j = 0; j < 8; j++)
//    {
//        OneWire_DQ = 0;
//        i = 4;while (--i);          //Dealy 10us,因为如果发送1,需要先延时1~15us
//        OneWire_DQ = (Data & 0x01<<j);
//        i = 23;while (--i); //再Dealy 50us,因为如果发送0,需要保持60~120us
//        OneWire_DQ = 1;
//    }
//}

//接收Byte
unsigned char OneWire_Receivebyte()
{
    unsigned char i,j,Data = 0;
    for(j = 0; j < 8; j++)
    {
        OneWire_DQ = 0;
        i = 2;while (--i);            //5us
        OneWire_DQ = 1;
        i = 4;while (--i);            //10us
        if(OneWire_DQ)
        {
            Data |= (0x01<<j);
        }
        i = 21;while (--i);           //45us
    }
    return Data;
}

  • 写回答

2条回答 默认 最新

  • dceacho 2022-05-03 16:40
    关注
        OneWire_DQ = (Data & 0x01<<j);
    

    确认下这里的运算顺序是不是对的,我也不确定

    评论

报告相同问题?

问题事件

  • 创建了问题 5月2日

悬赏问题

  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 手游上号器是如何获取到游戏在微信平台的appid
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢