资源简介
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
- 上一篇:因果图.jpg
- 下一篇:电子时钟的设计显示时,分,秒
相关资源
- 单片机仿真软件proteus6.7免安装绿色版
- 基于SPCE061A单片机的图形液晶模块的驱
- 基于SPCE061A单片机汇编语实现的流水灯
- 基于SPCE061A单片机的图形液晶模块的驱
- 物联网家居系统中基于单片机的多路
- 基于IAP15F2K61S2单片机的多路温度巡检
- 如何用单片机控制舵机及程序详细
- 单片机控制舵机电路图
- 基于MSP430单片机的实时多任务操作系
- 基于STM32F103C8单片机的晶联讯电子JL
- 广联达6.0写锁包,2020年11月最新
- 基于51单片机的交通信号灯程序
- 14284969_《STM32单片机应用与全案例实践
- GSM监控系统51单片机设计
- 精选单片机设计与制作30例
- 中颖单片机入门与实战
- 51单片机定时器/计数器的结构和原理
- MCS-51单片机定时器和计数器区别的理
- 基于32位单片机MC68HC376的高可靠性系统
- MC68HC08单片机程序设计速成
- PIC单片机人机接口模块4×4行列式
- PIC单片机人机接口模块4×4行列式
- 基于51单片机的多通道数据采集范围控
- ADC0832ADC0809DAC0832三种芯片程序,c程序
- 数据采集系统——ADC0808的应用
- 基于51单片机的直流电机转速控制及显
- 单片机控制步进电机PMW的驱动与放大
- 单片机驱动4相步进电机proteus仿真
- 使用PIC单片机开发的简易数字电压表
- 飞思卡尔单片机.s19文件方法详解
评论
共有 条评论