日志档案

发表于 2008-3-2 20:05:58

2

标签: 无标签

Uart转1-Wire硬件控制器程序源码例程

hotpower 发表于 2008-3-2 19:31 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: Uart转1-Wire硬件控制器程序源码例程

//UART->DS18B20
//Uart转1-Wire硬件控制器程序源码例程
//HotPower@126.com 2008.3.2 于雁塔菜地
LPC_INT8U OneWire_Start (void);
LPC_INT8U OneWire_ReadWriteByte (LPC_INT8U data);
LPC_INT8U OneWire_ReadId (LPC_INT8U *pData);

LPC_INT8U OneWire_Start (void)
{
LPC_INT8U ch;
  Uart1Config.BaudRate = BD9600;
  Uart1Config.WordLenth = WordLength8;
  Uart1Config.TwoStopBitsSelect = false;//stop=1
  UART_Init(UART1);
  UART_PutCharByPolling(UART1, 0xf0);
//ch=0xf0 无应答  ch=0xe0 有应答 ds18b20在线
  ch = UART_GetCharByPolling(UART1);
  Uart1Config.BaudRate = BD115200;
  Uart1Config.WordLenth = WordLength6;
  Uart1Config.TwoStopBitsSelect = false;//stop=1
  UART_Init(UART1);
  return ch;
}

LPC_INT8U OneWire_ReadId (LPC_INT8U *pData)
{
LPC_INT8U i, ch;
//ch=0xf0 无应答  ch=0xe0 有应答 ds18b20在线
  ch = OneWire_Start();//960us
  OneWire_ReadWriteByte(0x33);
  for (i = 0; i < 8; i ++)
  {
    pData[i] = OneWire_ReadWriteByte(0xff);//读一个字节
  }
  return ch;//返回结果
}


LPC_INT8U OneWire_ReadWriteByte (LPC_INT8U data)
{
LPC_INT8U i, ch;
LPC_INT8U value = 0;
  for (i = 0; i < 8; i ++)
  {
    if (data & 1)
    {
      UART_PutCharByPolling(UART1, 0x3f);//1
    }
    else
    {
      UART_PutCharByPolling(UART1, 0x00);//0
    }
    ch = UART_GetCharByPolling(UART1);
    data >>= 1;
    value >>= 1;
    if (ch & 0x07)//收到1T+3T个'0'为0
    {
      value |= 0x80;
    }
  }
  return value;
}

void main (void)
{
char RecData, TranBuff[30];
  if(SysInit() == 0)
  {
    // Start user program
    __enable_interrupt();
    UserStart();
  }
  
  __disable_interrupt();
  OneWire_ReadId(TranBuff);//读18b20的器件ID=28 2D 95 1D 00 00 00 22
  while(1);
}

1.读DS18B20系列码程序硬件仿真帖图



2.HotCRC计数器计算CRC8过程校验帖图


 


3.硬件接口电路

系统分类: 单片机   |   用户分类: 单总线通讯   |   来源: 原创   |   【推荐给朋友】

    阅读(618)    回复(1)  

投一票您将和博主都有获奖机会!

  • yduolc

    2008-4-29 15:39:36

    1wire总是感觉不太把握.你用的时候用什么经验吗?能介绍一下吗