標(biāo)題: 自己寫(xiě)的傳感器代碼 [打印本頁(yè)]
作者: 啦啦啦啦啦2112 時(shí)間: 2018-6-8 16:10
標(biāo)題: 自己寫(xiě)的傳感器代碼
void Single_Write_BH1750(uint8_t REG_Data)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET);//檢測(cè)是否總線忙
I2C_TransferHandling(I2C1,SlaveAddress,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS)==RESET);//檢測(cè)發(fā)送
I2C_SendData(I2C1,REG_Data);
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC)==RESET);
I2C_GenerateSTOP(I2C1,ENABLE);
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF)==RESET);//是否停止
}
uint16_t Read_BH1750()
{
uint16_t Recev=0x00;//光強(qiáng)為16位。先發(fā)送高8后低8
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET);//IFBUSY
I2C_TransferHandling(I2C1,SlaveAddress+1,2,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE)==RESET);
Recev|=I2C_ReceiveData(I2C1);Recev<<=8;
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE)==RESET);
Recev|=I2C_ReceiveData(I2C1);
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF)==RESET);
return Recev;
}
void BH1750_Get_Guang(float*Zhaodu)
#include"stm32f10x_lib.h"
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0//LCD1602數(shù)據(jù)端口
#define SlaveAddress 0x46#define BH1750_SCL GPIO_Pin_14
#define BH1750_SDA GPIO_Pin_15
#define GPIO_I2C GPIOB
#defineBH1750_SCL_0()GPIOF->BRR=BH1750_SCL
#define BH1750_SCL_1()GPIOF->BSRR=BH1750_SCL
#define BH1750_SDA_0()GPIOF->BRR=BH1750_SDA
#define BH1750_SDA_1()GPIOF->BSRR=BH1750_SDA
#define BH1750_SDA_STATE()(GPIOF->IDR&BH1750_SDA)
return(GPIOB->IDR typedefunsigned char BYTE;
typedef unsigned short WORD;BYTE BUF[8];//接收數(shù)據(jù)緩存區(qū)
uchar ge,shi,bai,qian,wan;//顯示變量
int dis_data;//變量
void Init_BH1750(void);
void conversion(uint temp_data);void Single_Write_BH1750(ucharREG_Address); uchar Single_Read_BH1750(uchar REG_Address);
void Multiple_Read_BH1750(void);//連續(xù)的讀取內(nèi)部寄存器數(shù)據(jù)
u8BH1750_Start(void);
void BH1750_Stop(void);
u8 BH1750_SendByte(u8 Data);
u8 BH1750_ReceiveByte(void);
void BH1750_SendACK(void);
void BH1750_SendNACK(void);
void BH1750_Nop
(void voidBH1750_Delay(unsigned int u8BH1750_ACK u8BH1750_READYu8BH1750_NACK
u8BH1750_BUS_BUSY
u8BH1750_BUS_ERROR u8BH1750_RETRY_COUNT//重試次數(shù)
void BH1750_Nop(void)u8i=50;
while(i)
voidBH1750_Delay(unsigned
int unsignedintu8BH1750_Start(void)BH1750_SDA_1();BH1750_Nop();
BH1750_SCL_1();BH1750_Nop();
if(!BH1750_SDA_STATE())//
//DebugPrint("TWI_START:BUSY\n");
return BH1750_BUS_BUSY;
BH1750_SDA_0();
BH1750_Nop();
BH1750_SCL_0();BH1750_Nop();
if(BH1750_SDA_STATE())//
//DebugPrint("TWI_START:BUSERROR\n");
return BH1750_BUS_ERROR;
returnBH1750_READY;
voidBH1750_Stop(void)
BH1750_SDA_0();BH1750_Nop();
BH1750_SCL_1();BH1750_Nop();
BH1750_SDA_1();BH1750_Nop();//
//DebugPrint("TWI_STOP\n");
voidBH1750_SendACK(void)BH1750_SDA_0();
BH1750_Nop();
BH1750_SCL_1();
BH1750_Nop();
BH1750_SCL_0();
BH1750_Nop();
BH1750_SDA_1();
//DebugPrint("TWI_SendACK\n");
voidBH1750_SendNACK(void)BH1750_SDA_1();
BH1750_Nop();
BH1750_SCL_1();
BH1750_Nop();
BH1750_SCL_0();
BH1750_Nop();//
//DebugPrint("TWI_SendNACK\n");
//---------數(shù)據(jù)建立----------if(Data&0x80)Data<<=1;BH1750_Nop();//---數(shù)據(jù)建立保持一定延時(shí)----//
BH1750_SCL_1();
BH1750_Nop();
BH1750_SCL_0();
BH1750_Nop();//延時(shí),防止SCL還沒(méi)變成低時(shí)改變SDA,從而產(chǎn)生START/STOP信號(hào)//接收從機(jī)的應(yīng)答B(yǎng)H1750_SDA_1();
BH1750_Nop();
BH1750_SCL_1();
BH1750_Nop();
if(BH1750_SDA_STATE())BH1750_SCL_0();BH1750_SDA_1();//
//DebugPrint("TWI_NACK!n");return BH1750_NACK;
BH1750_SCL_0();
BH1750_SDA_1();//
//DebugPrint("TWI_ACK!n");
return BH1750_ACK;
u8BH1750_ReceiveByte(void)u8i,Dat;
BH1750_SDA_1();
BH1750_SCL_0();
Dat=0;BH1750_SCL_1();//產(chǎn)生時(shí)鐘上升沿[正脈沖],讓從機(jī)準(zhǔn)備好數(shù)據(jù)BH1750_Nop();
Dat<<=1;if(BH1750_SDA_STATE())//讀引腳狀態(tài)BH1750_SCL_0();//準(zhǔn)備好再次接收數(shù)據(jù)BH1750_Nop();//等待數(shù)據(jù)準(zhǔn)備好//
//DebugPrint("TWI_Dat:%xn",Dat);
return Dat;
//voidconversion(uint temp_data)temp_data=temp_data%10000;
//取余運(yùn)算
temp_data=temp_data%1000;//取余運(yùn)算
temp_data=temp_data%100;//取余運(yùn)算
temp_data=temp_data%10;//取余運(yùn)算
voidSingle_Write_BH1750(uchar
REG_Address)BH1750_Start();//起始信號(hào)
BH1750_SendByte(SlaveAddress);//發(fā)送設(shè)備地址+寫(xiě)信號(hào)
BH1750_SendByte(REG_Address);//內(nèi)部寄存器地址,
BH1750_SendByte(REG_data);//內(nèi)部寄存器數(shù)據(jù),
BH1750_Stop();//發(fā)送停止信號(hào)
ucharSingle_Read_BH1750(uchar REG_Address)
ucharREG_data;BH1750_Start();//起始信號(hào)
BH1750_SendByte(SlaveAddress);//發(fā)送設(shè)備地址+寫(xiě)信號(hào)
BH1750_SendByte(REG_Address);//發(fā)送存儲(chǔ)單元地址,從0開(kāi)始
BH1750_Start();//起始信號(hào)
BH1750_SendByte(SlaveAddress+1);//發(fā)送設(shè)備地址+讀信號(hào)
REG_data=BH1750_RecvByte();//讀出寄存器數(shù)
BH1750_SendACK(1);BH1750_Stop();//停止信號(hào)
return REG_data;//連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)
voidMultiple_Read_BH1750(void)BH1750_Start();
//起始信號(hào)
BH1750_SendByte(SlaveAddress+1);//發(fā)送設(shè)備地址+讀信號(hào)
BH1750_ReceiveByte();//BUF[0]存儲(chǔ)0x32地址中的數(shù)據(jù)
BH1750_SendNACK();//最后一個(gè)數(shù)據(jù)需要回NOACK
BH1750_SendACK();//回應(yīng)
ACK BH1750_Stop();//停止信號(hào)//
Delay5ms();BH1750_Delay(500)//初始化BH1750,
void Init_BH1750()
voidBH1750_Get_Guang(float*Zhaodu)//延時(shí)100ms
Init_BH1750();//初始化BH1750
Single_Write_BH1750(0x01);
resolutionmode BH1750_Delay(200)//延時(shí)180ms
Multiple_Read_BH1750();//連續(xù)讀出數(shù)據(jù),存儲(chǔ)在BUF dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
//合成數(shù)據(jù),即光照數(shù)據(jù)
*Zhaodu=(float)dis_data/1.2;
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |