找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2740|回復: 1
收起左側(cè)

stm32單片機的光照傳感器程序源碼

[復制鏈接]
ID:144296 發(fā)表于 2019-4-15 11:01 | 顯示全部樓層 |閱讀模式
  1. #include "bh1750.h"


  2. #define  SlaveAddress   0x46 //定義器件在IIC總線中的從地址,根據(jù)ALT  ADDRESS地址引腳不同修改
  3. unsigned char  BUF[4];  //接收數(shù)據(jù)緩存區(qū)


  4. /***************************************************************
  5. ** 功能:     IIC端口初始化
  6. ** 參數(shù):   無參數(shù)
  7. ** 返回值:    無
  8. ****************************************************************/
  9. void BH1750IO_Init(void)
  10. {         
  11.     GPIO_InitTypeDef  GPIO_InitStructure;
  12.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  13.    GPIO_InitStructure.GPIO_Pin = ADDR_GPIO_Pin|SCL_GPIO_Pin|SDA_GPIO_Pin;//PB6/PB7/PB5
  14.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽輸出
  15.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度為50MHz
  16.    GPIO_Init(GQ_GPIOx, &GPIO_InitStructure);      //根據(jù)設定參數(shù)初始化
  17.     GPIO_SetBits(GQ_GPIOx,ADDR_GPIO_Pin|SCL_GPIO_Pin|SDA_GPIO_Pin); //輸出高
  18. }
  19. void In_mode(void)//SDA配置輸入模式
  20. {
  21.      GPIO_InitTypeDef  GPIO_InitStructure;
  22.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  23.    GPIO_InitStructure.GPIO_Pin = SDA_GPIO_Pin;
  24.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉輸入
  25.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度為50MHz
  26.    GPIO_Init(GQ_GPIOx, &GPIO_InitStructure);      //根據(jù)設定參數(shù)初始化
  27. }
  28. void Out_mode(void)//SDA配置輸出模式
  29. {
  30.      GPIO_InitTypeDef  GPIO_InitStructure;
  31.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  32.    GPIO_InitStructure.GPIO_Pin = SDA_GPIO_Pin;
  33.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽輸出
  34.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度為50MHz
  35.    GPIO_Init(GQ_GPIOx, &GPIO_InitStructure);      //根據(jù)設定參數(shù)初始化
  36.    
  37. }

  38. /***************************************************************
  39. ** 功能:     產(chǎn)生IIC起始信號
  40. ** 參數(shù):   無參數(shù)
  41. ** 返回值:    無
  42. ****************************************************************/
  43. void BH1750_Start()
  44. {
  45. SDA_OUT();     //sda線輸出
  46. SETSDA;      
  47. SETSCL;
  48. delay_us(4);
  49. CLRSDA;//START:when CLK is high,DATA change form high to low
  50. delay_us(4);
  51. CLRSCL;//鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
  52. }
  53. /***************************************************************
  54. ** 功能:     產(chǎn)生IIC停止信號
  55. ** 參數(shù):   無參數(shù)
  56. ** 返回值:    無
  57. ****************************************************************/
  58. void BH1750_Stop()
  59. {
  60. SDA_OUT();//sda線輸出
  61. CLRSDA;//STOP:when CLK is high DATA change form low to high
  62. SETSCL;
  63. delay_us(4);
  64. SETSDA;//發(fā)送I2C總線結(jié)束信號
  65. delay_us(4);
  66. }
  67. /***************************************************************
  68. ** 功能:     產(chǎn)生IIC應答信號
  69. ** 參數(shù):   無參數(shù)
  70. ** 返回值:    無
  71. ****************************************************************/
  72. void BH1750_SendACK(unsigned char ack)
  73. {
  74. SDA_OUT();          //sda線輸出
  75. if(ack)
  76. {
  77.   SETSDA;   //寫應答信號
  78. }
  79. else
  80. {
  81.   CLRSDA;
  82. }
  83. SETSCL;          //拉高時鐘線
  84. delay_us(2);        //延時
  85. CLRSCL;          //拉低時鐘線
  86. delay_us(2);        //延時
  87. }
  88. /***************************************************************
  89. ** 功能:     產(chǎn)生IIC接收信號
  90. ** 參數(shù):   無參數(shù)
  91. ** 返回值:    無
  92. ****************************************************************/
  93. unsigned char BH1750_RecvACK()
  94. {
  95. unsigned char data;
  96. SDA_IN();         //SDA設置為輸入
  97. SETSCL;        //拉高時鐘線
  98. delay_us(2);      //延時
  99. data = READ_SDA;  //讀應答信號
  100. CLRSCL;        //拉低時鐘線
  101. delay_us(2);      //延時
  102. return data;
  103. }
  104. /***************************************************************
  105. ** 功能:     向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)
  106. ** 參數(shù):   dat:一字節(jié)數(shù)據(jù)
  107. ** 返回值:    無
  108. ****************************************************************/
  109. void BH1750_SendByte(unsigned char dat)
  110. {
  111. unsigned char i,bit;
  112. SDA_OUT();               //sda線輸出
  113. for (i=0; i<8; i++)      //8位計數(shù)器
  114. {
  115.   bit=dat&0x80;
  116.   if(bit)
  117.   {
  118.    SETSDA;
  119.   }
  120.   else
  121.   CLRSDA;
  122.   dat <<= 1;           //移出數(shù)據(jù)的最高位
  123.   SETSCL;           //拉高時鐘線   
  124.   delay_us(2);         //延時  
  125.   CLRSCL;           //拉低時鐘線
  126.   delay_us(2);         //延時
  127. }
  128. BH1750_RecvACK();
  129. }
  130. /***************************************************************
  131. ** 功能:     從IIC總線接收一個字節(jié)數(shù)據(jù)
  132. ** 參數(shù):   無參數(shù)
  133. ** 返回值:   dat:接收一字節(jié)數(shù)據(jù)
  134. ****************************************************************/
  135. unsigned char BH1750_RecvByte()
  136. {
  137. unsigned char i;
  138. unsigned char dat = 0;
  139. unsigned char a;
  140. SDA_IN();               //SDA設置為輸入
  141. SETSDA;              //使能內(nèi)部上拉,準備讀取數(shù)據(jù),
  142. for(i=0; i<8; i++)     //8位計數(shù)器
  143. {
  144.   dat <<= 1;
  145.   SETSCL;          //拉高時鐘線
  146.   delay_us(2);        //延時
  147.     a=READ_SDA;//讀SDA數(shù)據(jù)
  148.   if(a==1)dat+=1;      
  149.   CLRSCL;          //拉低時鐘線
  150.   delay_us(2);        //延時
  151. }
  152. return dat;
  153. }
  154. /***************************************************************
  155. ** 功能:     向bh1750寫入命令
  156. ** 參數(shù):   無參數(shù)
  157. ** 返回值:   無
  158. ****************************************************************/
  159. void Single_Write_BH1750( unsigned char REG_Address)
  160. {
  161. BH1750_Start();                  //起始信號
  162. BH1750_SendByte(SlaveAddress);   //發(fā)送設備地址+寫信號
  163. BH1750_SendByte(REG_Address);    //內(nèi)部寄存器地址,
  164. BH1750_Stop();                   //發(fā)送停止信號
  165. }
  166. /***************************************************************
  167. ** 功能:     連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)
  168. ** 參數(shù):   無參數(shù)
  169. ** 返回值:   無
  170. ****************************************************************/
  171. void Multiple_Read_BH1750(void)
  172. {   
  173. unsigned char i;
  174. BH1750_Start();                          //起始信號
  175. BH1750_SendByte(SlaveAddress+1);         //發(fā)送設備地址+讀信號
  176. for(i=0; i<3; i++)                      //連續(xù)讀取2個地址數(shù)據(jù),存儲中BUF
  177. {
  178.   BUF[i] = BH1750_RecvByte();          //BUF[0]存儲0x32地址中的數(shù)據(jù)
  179.   if(i == 3)
  180.   {
  181.    BH1750_SendACK(1);                //最后一個數(shù)據(jù)需要回NOACK
  182.   }
  183.   else
  184.   {  
  185.    BH1750_SendACK(0);                //回應ACK
  186.   }
  187. }
  188. BH1750_Stop();                          //停止信號
  189. // delay_ms(150);
  190. }
  191. /***************************************************************
  192. ** 功能:     初始化BH1750
  193. ** 參數(shù):   無參數(shù)
  194. ** 返回值:   無
  195. ****************************************************************/
  196. void BH1750_Init()
  197. {
  198.    BH1750IO_Init();
  199.    Single_Write_BH1750(0x01);
  200.    CLRADDR; //將ADDR位初始化拉低
  201. }
  202. /***************************************************************
  203. ** 功能:     讀取光照度
  204. ** 參數(shù):   無參數(shù)
  205. ** 返回值:   data:返回光照度值
  206. ****************************************************************/
  207. unsigned int data;
  208. unsigned int return_gz(void)
  209. {
  210.    return data;
  211. }
  212. unsigned int Read_gz(void)
  213. {  
  214. static float temp;
  215. static char ifg=0;
  216. int dis_data;
  217. switch(ifg)
  218. {
  219. case 0:
  220. Single_Write_BH1750(0x01);   // power on
  221. Single_Write_BH1750(0x10);   // H- resolution mode
  222. // delay_ms(200);              //延時200ms
  223.   ifg++;
  224. return 20;//200ms在執(zhí)行讀取數(shù)據(jù)

  225. case 1:  
  226. Multiple_Read_BH1750();       //連續(xù)讀出數(shù)據(jù),存儲在BUF中
  227. dis_data=BUF[0];
  228. dis_data=(dis_data<<8)+BUF[1];//合成數(shù)據(jù),即光照數(shù)據(jù)
  229. temp=(float)dis_data/1.2;
  230. data=(int)temp;
  231. ifg=0;
  232. break;   
  233. }
  234. return 100;
  235. }
  236. /***************************************************************
  237. ** 功能:     讀取光照度
  238. ** 參數(shù):   無參數(shù)
  239. ** 返回值:   data:返回光照度值
  240. ****************************************************************/
  241. unsigned int Dispose(void)
  242. {  
  243. static float temp_a;
  244. unsigned int data_a;
  245. int dis_data1 ;
  246. Single_Write_BH1750(0x01);   // power on
  247. Single_Write_BH1750(0x10);   // H- resolution mode
  248. delay_ms(200);              //延時200ms
  249. Multiple_Read_BH1750();       //連續(xù)讀出數(shù)據(jù),存儲在BUF中
  250. delay_ms(150);
  251. dis_data1=BUF[0];
  252. dis_data1=(dis_data1<<8)+BUF[1];//合成數(shù)據(jù),即光照數(shù)據(jù)
  253. temp_a=(float)dis_data1/1.2;
  254. data_a=(int)temp_a;
  255. return data_a;        
  256. }
復制代碼
回復

使用道具 舉報

ID:1 發(fā)表于 2019-4-15 13:50 | 顯示全部樓層
本帖需要重新編輯補全頭文件 電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表