国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

arm學習-IIC總線連接溫濕度傳感器測量溫濕度(si7006)

這篇具有很好參考價值的文章主要介紹了arm學習-IIC總線連接溫濕度傳感器測量溫濕度(si7006)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

main.c

#include "si7006.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}
int main()
{
	unsigned short hum;
	short temp;
	si7006_init();
	while(1)
	{
		hum = si7006_read_hum_data(SI7006_SLAVE,0xE5);
		temp = si7006_read_temp_data(SI7006_SLAVE,0xE3);
		printf("hum=%d\n",125*hum/65536-6);
		printf("temp=%d\n",175*temp/65536-47);
	}
	return 0;
}

iic.h

#ifndef __IIC_H__
#define __IIC_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
/* 通過程序模擬實現I2C總線的時序和協議
 * GPIOF ---> AHB4
 * I2C1_SCL ---> PF14
 * I2C1_SDA ---> PF15
 *
 * */

#define SET_SDA_OUT     do{GPIOF->MODER &= (~(0x3 << 30)); \
							GPIOF->MODER |= (0x1 << 30);}while(0)
#define SET_SDA_IN      do{GPIOF->MODER &= (~(0x3 << 30));}while(0)

#define I2C_SCL_H       do{GPIOF->BSRR |= (0x1 << 14);}while(0)
#define I2C_SCL_L       do{GPIOF->BRR |= (0x1 << 14);}while(0)

#define I2C_SDA_H       do{GPIOF->BSRR |= (0x1 << 15);}while(0)
#define I2C_SDA_L       do{GPIOF->BRR |= (0x1 << 15);}while(0)

#define I2C_SDA_READ    (GPIOF->IDR & (0x1 << 15))

void delay_us(void);
void i2c_init(void);
void i2c_start(void);
void i2c_stop(void);
void i2c_write_byte(unsigned char  dat);
unsigned char i2c_read_byte(unsigned char ack);
unsigned char i2c_wait_ack(void);       
void i2c_ack(void);
void i2c_nack(void);

#endif 

si7006.h

#ifndef __SI7006_H__
#define __SI7006_H__

#include "iic.h"
#define        SI7006_SLAVE      0x40

void si7006_init(void);

unsigned short si7006_read_hum_data(unsigned char slave_addr, unsigned char reg_addr);


short si7006_read_temp_data(unsigned char slave_addr, unsigned char reg_addr);
#endif //__SI7006_H__

iic.c

#include "iic.h"

extern void printf(const char* fmt, ...);
/*
 * 函數名 : delay_us
 * 函數功能:延時函數
 * 函數參數:無
 * 函數返回值:無
 * */
void delay_us(void)
{
	unsigned int i = 2000;
	while(i--);
}
/*
 * 函數名 : i2c_init
 * 函數功能: i2C總線引腳的初始化, 通用輸出,推挽輸出,輸出速度,
 * 函數參數:無
 * 函數返回值:無
 * */
void i2c_init(void)
{
 	// 使能GPIOF端口的時鐘
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	// 設置PF14,PF15引腳為通用的輸出功能
	GPIOF->MODER &= (~(0xF << 28));
	GPIOF->MODER |= (0x5 << 28);
	// 設置PF14, PF15引腳為推挽輸出
	GPIOF->OTYPER &= (~(0x3 << 14));
	// 設置PF14, PF15引腳為高速輸出
	GPIOF->OSPEEDR |= (0xF << 28);
	// 設置PF14, PF15引腳的禁止上拉和下拉
	GPIOF->PUPDR &= (~(0xF << 28));
	// 空閑狀態(tài)SDA和SCL拉高 
	I2C_SCL_H;
	I2C_SDA_H;
}



/*
 * 函數名:i2c_start
 * 函數功能:模擬i2c開始信號的時序
 * 函數參數:無
 * 函數返回值:無
 * */
void i2c_start(void)
{
	/*
	 * 開始信號:時鐘在高電平期間,數據線從高到低的變化
	 *     --------
	 * SCL         \
	 *              --------
	 *     ----
	 * SDA     \
	 *          --------
	 * */	
	SET_SDA_OUT;//設置總線為輸出模式
	I2C_SCL_H;//scl拉高
	delay_us();
	I2C_SDA_H;//sda拉高
	delay_us();//拉高是一個過程電平有低到高是個過程,所以要時間反應

	I2C_SDA_L;//sda拉低
	I2C_SCL_L;//在起始信號產生之后,總線處于占用狀態(tài)
}

/*
 * 函數名:i2c_stop
 * 函數功能:模擬i2c停止信號的時序
 * 函數參數:無
 * 函數返回值:無
 * */

void i2c_stop(void)
{
	/*
	 * 停止信號 : 時鐘在高電平期間,數據線從低到高的變化 
	 *             ----------
	 * SCL        /
	 *    --------
	 *    ---         -------
	 * SDA   X       /
	 *    --- -------
	 * */
	SET_SDA_OUT;//設置總線為輸出模式
	I2C_SCL_L;//SCL拉低
	delay_us();
	I2C_SDA_L;//SDA拉低
	delay_us();

	I2C_SCL_H;//SCL拉高
	delay_us();
	I2C_SDA_H;//SDA拉高//停止信號產生之后總線處于空閑狀態(tài)
	delay_us();
}

/*
 * 函數名: i2c_write_byte
 * 函數功能:主機向i2c總線上的從設備寫8bits數據
 * 函數參數:dat : 等待發(fā)送的字節(jié)數據
 * 函數返回值: 無
 * */

void i2c_write_byte(unsigned char dat)
{
	/*
	 * 數據信號:時鐘在低電平期間,發(fā)送器向數據線上寫入數據
	 * 			時鐘在高電平期間,接收器從數據線上讀取數據 
	 *      ----          --------
	 * 	SCL     \        /        \
	 *           --------          --------
	 *      -------- ------------------ ---
	 * 	SDA         X                  X
	 *      -------- ------------------ ---
	 *
	 *      先發(fā)送高位在發(fā)送低位 
	 * */
	unsigned int i;
	SET_SDA_OUT;//設置為輸出模式
	for(i=0;i<8;i++){
		//SCL拉低,數據線上數據允許發(fā)生變化
		I2C_SCL_L;
		delay_us();
		//先發(fā)送高位再發(fā)送地位,并且需要判斷數據線上寫入的值
		if(dat & 0x80){
			I2C_SDA_H;//向數據線上寫入高電平
		}else{
			I2C_SDA_L;//向數據線上寫入低電平
		}
		delay_us();
		//移動位
		I2C_SCL_H;//拉高scl等從機從數據線上讀取數據
		delay_us();
		delay_us();
		dat <<= 1;//左移1位寫次高位
		}

}

/*
 * 函數名:i2c_read_byte
 * 函數功能: 主機從i2c總線上的從設備讀8bits數據, 
 *          主機發(fā)送一個應答或者非應答信號
 * 函數參數: 0 : 應答信號   1 : 非應答信號
 * 函數返回值:讀到的有效數據
 *
 * */
unsigned char i2c_read_byte(unsigned char ack)
{
	/*
	 * 數據信號:時鐘在低電平期間,發(fā)送器向數據線上寫入數據
	 * 			時鐘在高電平期間,接收器從數據線上讀取數據 
	 *      ----          --------
	 * 	SCL     \        /        \
	 *           --------          --------
	 *      -------- ------------------ ---
	 * 	SDA         X                  X
	 *      -------- ------------------ ---
	 *
	 *      先接收高位, 在接收低位 
	 * */
	unsigned int i;
	unsigned char dat;
	SET_SDA_IN;//設置為輸入模式
	for(i=0;i<8;i++){
		//等待主機在數據線上寫完數據
		I2C_SCL_L;
		delay_us();
		delay_us();
		I2C_SCL_H;//在時鐘為高電平期間,從總線上讀取數據
		//讀取到的數據		  
		//判斷讀取到的值是0或者是1
		//返回dat
		dat <<= 1;
		if(I2C_SDA_READ){
			dat |= 0x1;//讀取到的是0往dat寫入1
		}
		else{
			dat |= 0x0;//讀取到的是1往dat寫入0
		}
		delay_us();
	
	}
	if(!ack)
	//應答信號0
		i2c_ack();
	else
	//非應答信號1
		i2c_nack();
	return dat;
}
/*
 * 函數名: i2c_wait_ack
 * 函數功能: 主機作為發(fā)送器時,等待接收器返回的應答信號
 * 函數參數:無
 * 函數返回值:
 *					0:接收到的應答信號
 *                  1:接收到的非應答信號
 * */
unsigned char i2c_wait_ack(void)
{
	/*
	 * 主機發(fā)送一個字節(jié)之后,從機給主機返回一個應答信號
	 *
	 *                   -----------
	 * SCL              /   M:讀    \
	 *     -------------             --------
	 *     --- ---- --------------------
	 * SDA    X    X
	 *     ---      --------------------
	 *     主  釋   從機    主機
	 *     機  放   向數據  讀數據線
	 *         總   線寫    上的數據
	 *         線   數據
	 * */	
	I2C_SCL_L;//scl拉低時間線改變數據線上數據
	delay_us();
	I2C_SDA_H;//sda拉高處于空閑狀態(tài)
	delay_us();
	SET_SDA_IN;//設置為輸入模式
	delay_us();
	I2C_SCL_H;//拉高時間線從數據線上讀數據
	delay_us();
	if(I2C_SDA_READ) //讀取到數據返回1
		return 1;
	I2C_SCL_L; //拉低時間線
	return 0;
		
} 
/*
 * 函數名: iic_ack
 * 函數功能: 主機作為接收器時,給發(fā)送器發(fā)送應答信號
 * 函數參數:無
 * 函數返回值:無
 * */
void i2c_ack(void)
{
	/*            --------
	 * SCL       /        \
	 *    -------          ------
	 *    ---
	 * SDA   X 
	 *    --- -------------
	 * */
	SET_SDA_OUT;//設置數據線為輸出模式
	I2C_SCL_L;	//scl拉低
	delay_us();
	I2C_SDA_L;	//SDA拉低
	delay_us();	
	I2C_SCL_H;	//Scl拉高等待接收器讀取數據
	delay_us();
	delay_us();
	I2C_SCL_L;	//拉低scl總線處于占用狀態(tài)
}
/*
 * 函數名: iic_nack
 * 函數功能: 主機作為接收器時,給發(fā)送器發(fā)送非應答信號
 * 函數參數:無
 * 函數返回值:無
 * */
void i2c_nack(void)
{
	/*            --------
	 * SCL       /        \
	 *    -------          ------
	 *    --- ---------------
	 * SDA   X 
	 *    --- 
	 * */
	SET_SDA_OUT;//設置數據線為輸出模式
	I2C_SCL_L;	//scl拉低
	delay_us();
	I2C_SDA_H;	//SDA拉高
	delay_us();	
	I2C_SCL_H;	//Scl拉高等待接收器讀取數據
	delay_us();
	delay_us();
	I2C_SCL_L;	//拉低scl總線處于占用狀態(tài)

}

si7006.c

#include "iic.h"
#include "si7006.h"
extern void delay_ms(unsigned int ms);
/*
 * 函數名:si7006_init
 * 函數功能:SI7006芯片的初始化
 * 函數參數:無
 * 函數返回值:無
*/
void si7006_init(void)
{
	i2c_init();
	i2c_start();
	i2c_write_byte(SI7006_SLAVE << 1 |0);
	i2c_wait_ack();
	i2c_write_byte(0xE6);
	i2c_wait_ack();
	i2c_write_byte(0x3A);
	i2c_wait_ack();
	i2c_stop();
}
/*
 * 函數名:si7006_read_data
 * 函數功能:讀取SI7006的轉換結果
 * 函數參數:
 *     slave_addr : 從機地址
 *     reg_addr : 寄存器地址
 * 函數返回值:無
*/
unsigned short si7006_read_hum_data(unsigned char slave_addr,unsigned char reg_addr)
{
	unsigned short dat;
	unsigned char dat_l;
	unsigned char dat_h;
	i2c_start();
	i2c_write_byte(slave_addr << 1|0);
	i2c_wait_ack();
	i2c_write_byte(reg_addr);
	i2c_wait_ack();
	i2c_start();
	i2c_write_byte(slave_addr << 1|1);
	i2c_wait_ack();
	delay_ms(1000);
	dat_h = i2c_read_byte(0);
	dat_l = i2c_read_byte(1);
	i2c_stop();
	dat = dat_h;
	dat <<= 8;
	dat |=dat_l;
	return dat;
}


short si7006_read_temp_data(unsigned char slave_addr,unsigned char reg_addr)
{
	short dat;
	unsigned char dat_l;
	unsigned char dat_h;
	i2c_start();
	i2c_write_byte(slave_addr << 1|0);
	i2c_wait_ack();
	i2c_write_byte(reg_addr);
	i2c_wait_ack();
	i2c_start();
	i2c_write_byte(slave_addr << 1|1);
	i2c_wait_ack();
	delay_ms(1000);
	dat_h = i2c_read_byte(0);
	dat_l = i2c_read_byte(1);
	i2c_stop();
	dat = dat_h;
	dat <<= 8;
	dat |=dat_l;
	return dat;

}

arm學習-IIC總線連接溫濕度傳感器測量溫濕度(si7006),arm開發(fā),學習,stm32,si7006,iic總線,串行,傳感器文章來源地址http://www.zghlxwxcb.cn/news/detail-547122.html

到了這里,關于arm學習-IIC總線連接溫濕度傳感器測量溫濕度(si7006)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • IIC學習之SHT30溫濕度傳感器(基于STM32)

    IIC學習之SHT30溫濕度傳感器(基于STM32)

    附上SHT30資料和邏輯分析儀源文件,點擊下載 關于IIC的介紹網上已經非常詳盡,這里只說重點: 雙線(SDA,SCL),半雙工 采用主從結構,支持一主多從,通過地址尋址,每個I2C設備都有唯一的7位或10位地址,還有1bit選擇讀寫(0為寫,1為讀) 速率較低,I2C總線支持多種通信

    2024年02月01日
    瀏覽(27)
  • STM32之模擬IIC總線控制SHT20溫濕度芯片

    STM32之模擬IIC總線控制SHT20溫濕度芯片

    一、IIC總線概述 1、IIC總線介紹 I2C (Inter-Integrated Circuit)總線產生于在80年代, 由PHILIPS公司開發(fā)的 兩線式串行總線 ,用于連接微控制器及其外圍設備, 最初為音頻和視頻設備開發(fā)。I2C總線兩線制包括: 串行數據 SDA (Serial Data)、 串行時鐘 SCL (Serial Clock)。時鐘線必須由主

    2024年02月02日
    瀏覽(31)
  • STM32Cubemxhal庫硬件IIC驅動SHT40溫濕度傳感器

    STM32Cubemxhal庫硬件IIC驅動SHT40溫濕度傳感器

    STM32cubemx配置硬件IIC如圖所示 ?SHT40的驅動代碼 注意:在讀sht40的寄存器之后一定要加10幾個ms的延時

    2024年02月12日
    瀏覽(35)
  • stm32連接DHT11溫濕度傳感器

    stm32連接DHT11溫濕度傳感器

    目錄 1. DHT11簡介 1.1. 連接電路? 1.2. 串行接口 (單線雙向) ?2. cubeMX設置 3. 代碼開發(fā) ?3.1. 實現定時函數 3.2. 打開串口調試 3.4. 測試代碼實現 4. 運行效果 信息如下: 建議連接線長度短于20米時用5K上拉電阻,大于20米時根據實際情況使 用合適的上拉電阻 ?DHT11的供電電壓為 3-5

    2023年04月16日
    瀏覽(94)
  • DHT11溫濕度傳感器學習

    DHT11溫濕度傳感器學習

    ?DHT11溫濕度傳感器共有四個引腳 1個VCC高電平,1個GND接地低電平,1個數據輸出引腳,一個空引腳 工作時候,通過out引腳可以向傳感器傳遞應答信號并返回40位的溫濕度數據,也就是5個字節(jié) 前2個字節(jié)表示溫度的整數位和小數位,后面兩個字節(jié)是濕度的整數位和小數位,最后

    2024年02月07日
    瀏覽(96)
  • Arduino Uno零基礎入門學習筆記——智能時鐘(可以顯示溫濕度)【LCD1602+DS1302+溫濕度傳感器+紅外接收器+LED+蜂鳴器】

    Arduino Uno零基礎入門學習筆記——智能時鐘(可以顯示溫濕度)【LCD1602+DS1302+溫濕度傳感器+紅外接收器+LED+蜂鳴器】

    需要以下幾個外設 LCD1602(IIC驅動) DS1302 1-WIRE溫濕度檢測器 紅外接收器 遙控器 兩個LED(一紅一藍) 蜂鳴器 LCD1602IIC引腳 Arduino引腳 VCC 5V GND GND SDA A4 SCL A5 我這里的LCD1602是IIC的,所以只需要4根線 傳感器引腳 Arduino引腳 - GND S 8 + 5V 中間的線是要接5V的 紅外接收器引腳 Arduino引腳 -

    2024年02月06日
    瀏覽(18)
  • 【IMX6ULL驅動開發(fā)學習】06.DHT11溫濕度傳感器驅動程序編寫與測試

    【IMX6ULL驅動開發(fā)學習】06.DHT11溫濕度傳感器驅動程序編寫與測試

    目錄 一、DHT11簡介 1.1 DHT11模塊硬件設計 1.2 DHT11模塊軟件設計 1.3 DHT11通訊協議 1.4?DHT11數據格式 二、相關代碼 2.1 驅動代碼 2.2 測試代碼 2.3 上板子測試 DHT11是一款可測量溫度和濕度的傳感器。比如市面上一些空氣加濕器,會測量空氣中濕度,再根據測量結果決定是否繼續(xù)加濕

    2024年02月12日
    瀏覽(17)
  • 溫濕度傳感器DHT11介紹

    溫濕度傳感器DHT11介紹

    溫濕度傳感器DHT11簡介 ? ? ? DHT11數字溫濕度傳感器是一種出廠時經過校準的數字信號輸出的溫濕度數字溫濕度傳感器 。DHT11 數字溫濕度傳感器應用溫濕度傳感技術和數字采集技術,確保其具有極高的可靠性和卓越的長期穩(wěn)定性。 ? ? ? DHT11 數字溫濕度傳感器內置一個電阻式

    2023年04月22日
    瀏覽(19)
  • 驅動開發(fā)11-1 編寫IIC驅動-讀取溫濕度數據
  • STM32實戰(zhàn)項目-溫濕度傳感器

    STM32實戰(zhàn)項目-溫濕度傳感器

    程序功能: 1、軟件模擬I2C協議與SHT30數字溫濕度傳感器通訊; 2、數碼管顯示環(huán)境溫濕度; 3、串口打印環(huán)境溫濕度。 目錄 一、硬件電路 二、技術講解? 2.1IIC簡介 2.2 IIC總線協議 2.2設備接入 ?三、SHT30數字溫濕度傳感器 ?3.1性能介紹 3.1.1濕度最優(yōu)測量環(huán)境 3.1.2溫度最優(yōu)測量環(huán)

    2023年04月23日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包