//****************************************************************//
//ZS03单总线数据读取程序
//****************************************************************//
#ifndef _ZS03_H_
#define _ZS03_H_
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "stdio.h"
//IO方向设置
#define SDA_IN() {GPIOB->CRH&=0XF0FFFFFF;GPIOB->CRH|=0x08000000;}//上下拉输入
#define SDA_OUT() {GPIOB->CRH&=0XF0FFFFFF;GPIOB->CRH|=0x03000000;}//通用推挽输出
//IO操作函数
//#define IIC_SCL PBout(13) //SCL输出
#define SEND_SDA PBout(14) //SDA输出
#define READ_SDA PBin(14) //SDA输入
void ZS03_Init(void);//初始化SDA(PB14),CLK(PB13)
u8 ZS03_Rdata(void);
u8 ZS03_READ(void);
#endif //_ZS03_H_
#include "ZS03.h"
float Temprature,Humi;//定义温湿度变量 ,此变量为全局变量
u8 Sensor_AnswerFlag=0;//定义传感器响应标志
u8 Sensor_ErrorFlag; //定义读取传感器错误标志
/********************************************
|* 功能: 初始化SDA(PB14),CLK(PB13) *|
********************************************/
void ZS03_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//使能GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;//PB13,PB14
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14); //PB13,PB14 输出低(SCL上电立即拉低)
}
/********************************************
|* 功能: 读传感器发送的单个字节 *|
********************************************/
u8 ZS03_Rdata(void)
{
u8 i;
u16 j;
u8 data=0,bit=0;
for(i=0;i< 8;i++)
{
while(!READ_SDA)//检测上次低电平是否结束
{
if(++j >=50000) //防止进入死循环
{
break;
}
}
//延时Min=26us Max70us 跳过数据"0" 的高电平
delay_us(30);
//判断传感器发送数据位
bit=0;
if(READ_SDA)
{
bit=1;
}
j=0;
while(READ_SDA) //等待高电平结束
{
if(++j>=50000) //防止进入死循环
{
break;
}
}
data< <=1;
data|=bit;
}
return data;
}
/********************************************
|* 功能:ZS03读取温湿度函数 *|
********************************************/
//变量:Humi_H:湿度高位;Humi_L:湿度低位;Temp_H:温度高位;Temp_L:温度低位;Temp_CAL:校验位
//数据格式为:湿度高位(湿度整数)+湿度低位(湿度小数)+温度高位(温度整数)+温度低位(温度小数)+ 校验位
//校验:校验位=湿度高位+湿度低位+温度高位+温度低位
u8 ZS03_READ(void)
{
u32 j;
u8 Humi_H,Humi_L,Temp_H,Temp_L,Temp_CAL,temp;
//主机发送起始信号
SDA_OUT() //设为输出模式
SEND_SDA=0; //主机把数据总线(SDA)拉低
delay_ms(20);//拉低一段时间(至少18ms), 通知传感器准备数据
SEND_SDA=1; //释放总线
SDA_IN(); //设为输入模式,判断传感器响应信号
delay_us(30);//延时30us
Sensor_AnswerFlag=0; //传感器响应标志
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(READ_SDA==0)
{
Sensor_AnswerFlag=1; //收到起始信号
j=0;
while((!READ_SDA)) //判断从机发出 80us 的低电平响应信号是否结束
{
if(++j >=500) //防止进入死循环
{
Sensor_ErrorFlag=1;
break;
}
}
j=0;
while(READ_SDA)//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
{
if(++j>=800) //防止进入死循环
{
Sensor_ErrorFlag=1;
break;
}
}
//接收数据
Humi_H=ZS03_Rdata();
Humi_L=ZS03_Rdata();
Temp_H=ZS03_Rdata();
Temp_L=ZS03_Rdata();
Temp_CAL=ZS03_Rdata();
temp=(u8)(Humi_H+Humi_L+Temp_H+Temp_L);//只取低8位
if(Temp_CAL==temp)//如果校验成功,往下运行
{
Humi=Humi_H*10+Humi_L; //湿度
if(Temp_L&0X80) //为负温度
{
Temprature =0-(Temp_H*10+((Temp_L&0x7F)));
}
else //为正温度
{
Temprature=Temp_H*10+Temp_L;//为正温度
}
//判断数据是否超过量程(温度:-20℃~60℃,湿度20%RH~95%RH)
if(Humi>950)
{
Humi=950;
}
if(Humi< 200)
{
Humi =200;
}
if(Temprature >600)
{
Temprature=600;
}
if(Temprature< -200)
{
Temprature = -200;
}
Temprature=Temprature/10;//计算为温度值
Humi=Humi/10; //计算为湿度值
printf("rn温度为: %.1f ℃rn",Temprature); //显示温度
printf("湿度为: %.1f %%RHrn",Humi);//显示湿度
}
else
{
printf("CAL Error!!rn");
printf("%d r%d r%d r%d r%d r%d rn",Humi_H,Humi_L,Temp_H,Temp_L,Temp_CAL,temp);
}
}
else
{
Sensor_ErrorFlag=0; //未收到传感器响应
printf("Sensor Error!!rn");
}
return 1;
}
//****************************************************************//
// ZS03——单总线使用范例
// 单片机: stm32f103系列
// 功能: 使用串口1发送温湿度数据 晶振8M,时钟72M,波特率9600
//硬件连接: PB13连接ZS03D的SCL脚,PB14连接ZS03的SDA脚,ZS03的地连接单片机的地,电源连接+5V,单片机串口连接电脑
//****************************************************************//
#include "usart.h"
#include "ZS03.h"
int main(void)
{
ZS03_Init(); //ZS03初始化
delay_init();//延时初始化,系统时钟初始化
uart_init(9600);//串口初始化,波特率为9600
while(1)
{
delay_ms(1000); //至少延时2s读一次数据
delay_ms(1000);
ZS03_READ();//读取温湿度数据
}
}
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
传感器
+关注
关注
2550文章
51047浏览量
753169 -
总线
+关注
关注
10文章
2878浏览量
88056 -
模组
+关注
关注
6文章
1488浏览量
30369
发布评论请先 登录
相关推荐
ZS5887与ZS5889的特点
ZS5887 USB充电识别IC,单口 ,SOT23-5封装,输出电流可设定。ZS5889 USB充电识别IC,双口 ,SOT23-6L封装。ZS5887/ZS5889都可用于充电器、
发表于 08-28 11:27
太阳能锂电充电管理ZS6093/ZS6073/ZS6075/ZS6076/ZS6077/ZS6078全系列分享
太阳能锂电充电管理ZS6093/ZS6073/ZS6075/ZS6076/ZS6077/ZS60
发表于 11-19 10:57
如何快速设计一款温湿度产品原型(MCU接入)
三明治开发板温湿度传感套件主要包含:温湿度传感器功能板,板载 SHT30 温湿度传感器,I2C 接口,负责温湿度数据的采集传输。Wi-Fi MCU 通信板,板载涂鸦 TYWE3S
发表于 06-27 11:00
库房无线温湿度监控方案 无线温湿度监控系统 仓储物流无线温湿度
【库房无线温湿度监控方案】[无线温湿度监控系统]【无线温湿度传感器】【医药库房、大型物流存储温湿度远程监控系统】今现代化建设和国民经济发展迅速。社会对生产环境和生活环境意识的要求也越来
发表于 03-01 10:15
温湿度记录仪如何读取,温湿度记录仪的操作介绍
温湿度记录仪是温湿度测量仪器中温湿度计中的一种。其具有内置温湿度传感器或可连接外部温湿度传感器测量温度和
发表于 06-28 16:31
•3895次阅读
温湿度记录仪在档案库房的温湿度调控方案中的应用
库房内的温湿度与档案的保存密切相关,温湿度不适宜都会影响档案的保存时间,对档案保存造成影响。为了使档案库房的温湿度等符合档案储存的要求,需要采取一定的措施,对档案库房的温湿度进行控制和
发表于 07-30 11:46
•1436次阅读
ZS2933SL.ZS2934SL.ZS2935SL产品规格书
ZSpoweric立元微ZS2931SL.ZS2932SL.ZS2933SL.ZS2934SL.ZS2935SL产品规格书
发表于 09-18 17:58
•8次下载
评论