资源简介

ds18b20单总线程序耗时较久,实际应用中局限较大,本程序采用10us定时中断方式,验证成功,采用程序放中断中,主程序中放到合适位置调用读取数据即可。

资源截图

代码片段和文件信息

#include “DS18B20.h“

#define DS18B20_OUT_H() (GPIOB->BSRR=GPIO_Pin_5) //输出高
#define DS18B20_OUT_L() (GPIOB->BRR=GPIO_Pin_5)  //输出低

//#define AM2305_IN_X (GPIOB->IDR&GPIO_Pin_5)  // 对应端口输入寄存器
#define DS18B20_DQ_IN GPIO_ReadInputDataBit(GPIOBGPIO_Pin_5)

#define DisRequset_STU   0//收到通信请求
#define EnableRequest_STU   1//收到通信请求
#define StartRST_STU   2//起始+复位信号
#define StartWriteCC_STU 3//启动转换
#define WriteRST_STU   4//启动转换后复位信号
#define WriteCC_STU   5//读取命令
#define ReadTemp_STU     6// 读取2个字节数据
#define ReadOK_STU       7// 读取完毕


#define WriteData44_STU 1//
#define WriteDatabe_STU 2//

u8 R_DS18B20_WBCnt = 0;
u8 R_DS18B20_ComuTime = 0;
u8 R_DS18B20_TempL = 0;
u8 R_DS18B20_TempH = 0;
u8 R_DS18B20_Bytecnt = 0;
u8 R_DS18B20_Data = 0;
u8 R_DS18B20_State = 0;
u8 R_DS18B20_Request = 0;
u8 R_WriteDS18_State = 0;
u8 R_DS18B20_WDataBak = 0;
u8 R_GotTemp = 0;

static void DS18B20_IO_OUT(void)
{
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_Init(GPIOE &GPIO_InitStructure);
GPIO_OutConfigInit(PortBPB5_AM2302_DATA); //推挽输出
}

static void DS18B20_IO_IN(void)
{
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
// GPIO_Init(GPIOE &GPIO_InitStructure);
GPIO_InConfigInit(PortBPB5_AM2302_DATA); //上拉输入
}

void Ds18B20_ReadDate_RT(void)
{
u8 i = 0;
if(!R_DS18B20_State )
return;
if(R_DS18B20_State == EnableRequest_STU)
{
 R_DS18B20_State = StartRST_STU;
 DS18B20_IO_OUT();
}
switch(R_DS18B20_State)
{
case StartRST_STU:
case WriteRST_STU:
{
R_DS18B20_ComuTime++;
 
 
  if(R_DS18B20_ComuTime <65)
  {  
DS18B20_OUT_L();  //拉低DQ 拉低650us
  }
else 
{
DS18B20_IO_IN();
if(R_DS18B20_ComuTime > 75)
{
if(!(DS18B20_DQ_IN))
{
i= 0x55;
}
 
 if(R_DS18B20_ComuTime > 90)  //等待DS18B20响应
{
R_DS18B20_ComuTime = 0;
if(R_DS18B20_State == StartRST_STU)
  R_DS18B20_State = StartWriteCC_STU;
 
if(R_DS18B20_State == WriteRST_STU)
 R_DS18B20_State = WriteCC_STU;
}
  }
}
break;
}
case StartWriteCC_STU:             //写入 cc 44
case WriteCC_STU: //写入 cc be
{
 u8 Wstate = 0;
 
 if(R_WriteDS18_State == 0)
 {
   Wstate = DS18B20_Write_Byte(0xcc);
    //if(DS18B20_Write_Byte(u8 0xcc))
    if(Wstate)
    {
     if(R_DS18B20_State == StartWriteCC_STU)
        R_WriteDS18_State = WriteData44_STU;
        
     if(R_DS18B20_State == WriteCC_STU)
       R_WriteDS18_State = WriteDatabe_STU; 
   }
   }
   else
   {
    if(R_WriteDS18_State == WriteData44_STU)
     {
       if(DS18B20_Write_Byte(0x44))
       {
        R_DS18B20_State = WriteRST_STU;
   

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件         640  2018-09-27 23:03  DS18B20.h
     文件        6556  2018-09-27 23:03  DS18B20.c

评论

共有 条评论