#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(GPIOB,GPIO_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(PortB,PB5_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(PortB,PB5_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;
DS18B20_IO_OUT();
R_WriteDS18_State = 0;
}
}
else if(R_WriteDS18_State == WriteDatabe_STU)
{
if(DS18B20_Write_Byte(0xbe))
{
R_DS18B20_State = ReadTemp_STU;
R_WriteDS18_State = 0;
R_DS18B20_Bytecnt = 0;
R_DS18B20_Data = 0;
R_DS18B20_WBCnt = 0;
}
}
}
break;
}
case ReadTemp_STU:
{
DS18B20_Read_Temp();
break;
}
default:
break;
}
}
//写一个字节到DS18B20
//dat:要写入的字节
u8 DS18B20_Write_Byte(u8 wdata)
{
if(R_DS18B20_ComuTime > 7)
{
R_DS18B20_ComuTime = 0;
R_DS18B20_WBCnt++;
if(R_DS18B20_WBCnt < 8)
{
R_DS18B20_WDataBak >>=1;
}
else
{
R_DS18B20_WBCnt = 0;
return 1;
}
}
R_DS18B20_ComuTime++;
if(!R_DS18B20_WBCnt)
{
R_DS18B20_WDataBak = wdata;
DS18B20_IO_OUT();
}
if(R_DS18B20_WDataBak&0x01)//先发低位
{
if(R_DS18B20_ComuTime < 2)
DS18B20_OUT_L(); // Write 1
else
DS18B20_OUT_H();
}
else
{
if(R_DS18B20_ComuTime < 7) //写入50us低
DS18B20_OUT_L(); // Write 0
else
DS18B20_OUT_H();
}
return 0;
}
//从DS18B20读取一个字节
void DS18B20_Read_Temp(void)
{
u8 Dbit;
R_DS18B20_ComuTime++;
if(R_DS18B20_ComuTime == 1)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT
DS18B20_OUT_L();
DelayNOP(20);//4US
DS18B20_OUT_H();
DS18B20_IO_IN(); //拉低4us后拉高准备读取数据
}
if(R_DS18B20_ComuTime == 2)
{
if(DS18B20_DQ_IN)
Dbit=1;
else
Dbit=0;
if(Dbit) //注意顺序即可,ds18b20先发送低位到总线上
Dbit=1<<R_DS18B20_WBCnt;
R_DS18B20_Data |=Dbit;
}
if(R_DS18B20_ComuTime > 55)
{
R_DS18B20_WBCnt++; //完成读取1位
R_DS18B20_ComuTime = 0;
if(R_DS18B20_WBCnt > 7)
{
R_DS18B20_WBCnt = 0;
if(!R_DS18B20_Bytecnt)
{
R_DS18B20_Bytecnt++;
R_DS18B20_TempL = R_DS18B20_Data;//读取第一个字节
R_DS18B20_Data = 0;
}
else
{
R_DS18B20_TempH = R_DS18B20_Data; //读取第二个字节
R_DS18B20_Bytecnt = 0;
R_DS18B20_State = ReadOK_STU;
R_DS18B20_Data = 0;
}
}
}
}
void Get_Ds18b20Temp(void)
{
int temp=0;
short tem;
if(R_DS18B20_State == DisRequset_STU)
R_DS18B20_State = EnableRequest_STU;
if(R_DS18B20_State == ReadOK_STU)
{
R_DS18B20_State = DisRequset_STU;
if(R_DS18B20_TempH > 7) //通过判读存储器的高五位的0,1来判断温度的正负,
{
temp = 0; //为负
R_DS18B20_TempH =~R_DS18B20_TempH;
R_DS18B20_TempL =~R_DS18B20_TempL;
}
else
temp = 1; //为正
tem = R_DS18B20_TempH;
tem =tem<<8;
tem =tem+R_DS18B20_TempL;
tem = (double)tem * 0.625; //转换
tem = tem/10;
if(temp)
R_GotTemp = tem;
else
R_GotTemp = -tem;
}
}
DS18B20的分时读取,适合于操作系统,释放资源,不用在一次读取中来完成整个操作。一次读取中的延时等待,实在太消耗时间
需积分: 9 64 浏览量
2022-07-22
17:03:20
上传
评论
收藏 3KB ZIP 举报
dai410257573
- 粉丝: 14
- 资源: 11
最新资源
- YOLOV4-TINY权重文件
- 以下是一个使用贪心算法解决多机调度问题的基本步骤0.txt
- 基于大数据的房产估价是近年来随着技术的发展而兴起的一种新型估价方法.txt
- 企业供应链管理系统v3.rar
- 富芮坤FR8016HA蓝牙开发板使用手册+硬件PCB图+封装库+DEMO演示软件源代码.zip
- 基于YOLOv7的芯片表面缺陷检测系统
- 京东物流 数字化供应链综合研究报告2018.rar
- 基于YOLOv7的植物虫害识别&防治系统
- 2000.1-2023.8中国经济政策不确定性指数月度数据.xlsx
- Screenshot_2024-04-21-20-42-15-443_com.tencent.mm.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0