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