//****************************************************************//
//ZS03單總線數(shù)據(jù)讀取程序
//****************************************************************//
#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操作函數(shù)
//#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上電立即拉低)
}
/********************************************
|* 功能: 讀傳感器發(fā)送的單個字節(jié) *|
********************************************/
u8 ZS03_Rdata(void)
{
u8 i;
u16 j;
u8 data=0,bit=0;
for(i=0;i8;i++)
{
while(!READ_SDA)//檢測上次低電平是否結束
{
if(++j?>=50000) //防止進入死循環(huán)
{
break;
}
}
//延時Min=26us Max70us 跳過數(shù)據(jù)"0" 的高電平
delay_us(30);
//判斷傳感器發(fā)送數(shù)據(jù)位
bit=0;
if(READ_SDA)
{
bit=1;
}
j=0;
while(READ_SDA) //等待高電平結束
{
if(++j>=50000) //防止進入死循環(huán)
{
break;
}
}
data<=1;
data|=bit;
}
return data;
}
/********************************************
|* 功能:ZS03讀取溫濕度函數(shù) *|
********************************************/
//變量:Humi_H:濕度高位;Humi_L:濕度低位;Temp_H:溫度高位;Temp_L:溫度低位;Temp_CAL:校驗位
//數(shù)據(jù)格式為:濕度高位(濕度整數(shù))+濕度低位(濕度小數(shù))+溫度高位(溫度整數(shù))+溫度低位(溫度小數(shù))+ 校驗位
//校驗:校驗位=濕度高位+濕度低位+溫度高位+溫度低位
u8 ZS03_READ(void)
{
u32 j;
u8 Humi_H,Humi_L,Temp_H,Temp_L,Temp_CAL,temp;
//主機發(fā)送起始信號
SDA_OUT() //設為輸出模式
SEND_SDA=0; //主機把數(shù)據(jù)總線(SDA)拉低
delay_ms(20);//拉低一段時間(至少18ms), 通知傳感器準備數(shù)據(jù)
SEND_SDA=1; //釋放總線
SDA_IN(); //設為輸入模式,判斷傳感器響應信號
delay_us(30);//延時30us
Sensor_AnswerFlag=0; //傳感器響應標志
//判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(READ_SDA==0)
{
Sensor_AnswerFlag=1; //收到起始信號
j=0;
while((!READ_SDA)) //判斷從機發(fā)出 80us 的低電平響應信號是否結束
{
if(++j?>=500) //防止進入死循環(huán)
{
Sensor_ErrorFlag=1;
break;
}
}
j=0;
while(READ_SDA)//判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
{
if(++j>=800) //防止進入死循環(huán)
{
Sensor_ErrorFlag=1;
break;
}
}
//接收數(shù)據(jù)
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;//為正溫度
}
//判斷數(shù)據(jù)是否超過量程(溫度:-20℃~60℃,濕度20%RH~95%RH)
if(Humi>950)
{
Humi=950;
}
if(Humi200)
{
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發(fā)送溫濕度數(shù)據(jù) 晶振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();//延時初始化,系統(tǒng)時鐘初始化
uart_init(9600);//串口初始化,波特率為9600
while(1)
{
delay_ms(1000); //至少延時2s讀一次數(shù)據(jù)
delay_ms(1000);
ZS03_READ();//讀取溫濕度數(shù)據(jù)
}
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
傳感器
+關注
關注
2551文章
51127瀏覽量
753783 -
總線
+關注
關注
10文章
2887瀏覽量
88109 -
模組
+關注
關注
6文章
1493瀏覽量
30402
發(fā)布評論請先 登錄
相關推薦
ZS5887與ZS5889的特點
ZS5887 USB充電識別IC,單口 ,SOT23-5封裝,輸出電流可設定。ZS5889 USB充電識別IC,雙口 ,SOT23-6L封裝。ZS5887/ZS5889都可用于充電器、
發(fā)表于 08-28 11:27
太陽能鋰電充電管理ZS6093/ZS6073/ZS6075/ZS6076/ZS6077/ZS6078全系列分享
太陽能鋰電充電管理ZS6093/ZS6073/ZS6075/ZS6076/ZS6077/ZS60
發(fā)表于 11-19 10:57
如何快速設計一款溫濕度產(chǎn)品原型(MCU接入)
三明治開發(fā)板溫濕度傳感套件主要包含:溫濕度傳感器功能板,板載 SHT30 溫濕度傳感器,I2C 接口,負責溫濕度數(shù)據(jù)的采集傳輸。Wi-Fi MCU 通信板,板載涂鴉 TYWE3S
發(fā)表于 06-27 11:00
庫房無線溫濕度監(jiān)控方案 無線溫濕度監(jiān)控系統(tǒng) 倉儲物流無線溫濕度
【庫房無線溫濕度監(jiān)控方案】[無線溫濕度監(jiān)控系統(tǒng)]【無線溫濕度傳感器】【醫(yī)藥庫房、大型物流存儲溫濕度遠程監(jiān)控系統(tǒng)】今現(xiàn)代化建設和國民經(jīng)濟發(fā)展迅速。社會對生產(chǎn)環(huán)境和生活環(huán)境意識的要求也越來
發(fā)表于 03-01 10:15
溫濕度計怎么使用_溫濕度計怎么調
本文首先闡述了溫濕度計的使用方法,其次介紹了溫濕度計的調節(jié),最后介紹了家用指針式溫濕度計調校方法。
發(fā)表于 02-28 11:16
?10.4w次閱讀
溫濕度記錄儀如何讀取,溫濕度記錄儀的操作介紹
溫濕度記錄儀是溫濕度測量儀器中溫濕度計中的一種。其具有內(nèi)置溫濕度傳感器或可連接外部溫濕度傳感器測量溫度和
發(fā)表于 06-28 16:31
?3898次閱讀
溫濕度記錄儀在檔案庫房的溫濕度調控方案中的應用
庫房內(nèi)的溫濕度與檔案的保存密切相關,溫濕度不適宜都會影響檔案的保存時間,對檔案保存造成影響。為了使檔案庫房的溫濕度等符合檔案儲存的要求,需要采取一定的措施,對檔案庫房的溫濕度進行控制和
發(fā)表于 07-30 11:46
?1439次閱讀
ZS2933SL.ZS2934SL.ZS2935SL產(chǎn)品規(guī)格書
ZSpoweric立元微ZS2931SL.ZS2932SL.ZS2933SL.ZS2934SL.ZS2935SL產(chǎn)品規(guī)格書
發(fā)表于 09-18 17:58
?8次下載
學習筆記|如何用Go程序采集溫濕度傳感器數(shù)據(jù)
整個利用Go語言從AHT20溫濕度傳感器獲取數(shù)據(jù)的完整步驟和實現(xiàn)方法。一、C程序獲取AHT20溫濕度1、參考ElfBoard官方例程:03-例程
評論