久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2809|回復: 1
收起左側

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

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


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


  4. /***************************************************************
  5. ** 功能:     IIC端口初始化
  6. ** 參數:   無參數
  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);      //根據設定參數初始化
  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);      //根據設定參數初始化
  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);      //根據設定參數初始化
  36.    
  37. }

  38. /***************************************************************
  39. ** 功能:     產生IIC起始信號
  40. ** 參數:   無參數
  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總線,準備發送或接收數據
  52. }
  53. /***************************************************************
  54. ** 功能:     產生IIC停止信號
  55. ** 參數:   無參數
  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;//發送I2C總線結束信號
  65. delay_us(4);
  66. }
  67. /***************************************************************
  68. ** 功能:     產生IIC應答信號
  69. ** 參數:   無參數
  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. ** 功能:     產生IIC接收信號
  90. ** 參數:   無參數
  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總線發送一個字節數據
  106. ** 參數:   dat:一字節數據
  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位計數器
  114. {
  115.   bit=dat&0x80;
  116.   if(bit)
  117.   {
  118.    SETSDA;
  119.   }
  120.   else
  121.   CLRSDA;
  122.   dat <<= 1;           //移出數據的最高位
  123.   SETSCL;           //拉高時鐘線   
  124.   delay_us(2);         //延時  
  125.   CLRSCL;           //拉低時鐘線
  126.   delay_us(2);         //延時
  127. }
  128. BH1750_RecvACK();
  129. }
  130. /***************************************************************
  131. ** 功能:     從IIC總線接收一個字節數據
  132. ** 參數:   無參數
  133. ** 返回值:   dat:接收一字節數據
  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;              //使能內部上拉,準備讀取數據,
  142. for(i=0; i<8; i++)     //8位計數器
  143. {
  144.   dat <<= 1;
  145.   SETSCL;          //拉高時鐘線
  146.   delay_us(2);        //延時
  147.     a=READ_SDA;//讀SDA數據
  148.   if(a==1)dat+=1;      
  149.   CLRSCL;          //拉低時鐘線
  150.   delay_us(2);        //延時
  151. }
  152. return dat;
  153. }
  154. /***************************************************************
  155. ** 功能:     向bh1750寫入命令
  156. ** 參數:   無參數
  157. ** 返回值:   無
  158. ****************************************************************/
  159. void Single_Write_BH1750( unsigned char REG_Address)
  160. {
  161. BH1750_Start();                  //起始信號
  162. BH1750_SendByte(SlaveAddress);   //發送設備地址+寫信號
  163. BH1750_SendByte(REG_Address);    //內部寄存器地址,
  164. BH1750_Stop();                   //發送停止信號
  165. }
  166. /***************************************************************
  167. ** 功能:     連續讀出BH1750內部數據
  168. ** 參數:   無參數
  169. ** 返回值:   無
  170. ****************************************************************/
  171. void Multiple_Read_BH1750(void)
  172. {   
  173. unsigned char i;
  174. BH1750_Start();                          //起始信號
  175. BH1750_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  176. for(i=0; i<3; i++)                      //連續讀取2個地址數據,存儲中BUF
  177. {
  178.   BUF[i] = BH1750_RecvByte();          //BUF[0]存儲0x32地址中的數據
  179.   if(i == 3)
  180.   {
  181.    BH1750_SendACK(1);                //最后一個數據需要回NOACK
  182.   }
  183.   else
  184.   {  
  185.    BH1750_SendACK(0);                //回應ACK
  186.   }
  187. }
  188. BH1750_Stop();                          //停止信號
  189. // delay_ms(150);
  190. }
  191. /***************************************************************
  192. ** 功能:     初始化BH1750
  193. ** 參數:   無參數
  194. ** 返回值:   無
  195. ****************************************************************/
  196. void BH1750_Init()
  197. {
  198.    BH1750IO_Init();
  199.    Single_Write_BH1750(0x01);
  200.    CLRADDR; //將ADDR位初始化拉低
  201. }
  202. /***************************************************************
  203. ** 功能:     讀取光照度
  204. ** 參數:   無參數
  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在執行讀取數據

  225. case 1:  
  226. Multiple_Read_BH1750();       //連續讀出數據,存儲在BUF中
  227. dis_data=BUF[0];
  228. dis_data=(dis_data<<8)+BUF[1];//合成數據,即光照數據
  229. temp=(float)dis_data/1.2;
  230. data=(int)temp;
  231. ifg=0;
  232. break;   
  233. }
  234. return 100;
  235. }
  236. /***************************************************************
  237. ** 功能:     讀取光照度
  238. ** 參數:   無參數
  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();       //連續讀出數據,存儲在BUF中
  250. delay_ms(150);
  251. dis_data1=BUF[0];
  252. dis_data1=(dis_data1<<8)+BUF[1];//合成數據,即光照數據
  253. temp_a=(float)dis_data1/1.2;
  254. data_a=(int)temp_a;
  255. return data_a;        
  256. }
復制代碼
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频二区 | 国产精品成人一区二区三区 | 精品成人在线观看 | 国产成人综合网 | 91精品国产乱码久久久久久 | 久久草在线视频 | 国产成人精品999在线观看 | 成人网在线看 | 国产精品一区二区在线播放 | 亚洲欧美中文日韩在线 | 三级视频久久 | 操人网| 亚洲成人免费视频在线观看 | 精品欧美一区免费观看α√ | 亚洲电影第1页 | 香蕉久久久久久 | 狠狠干美女 | www国产成人免费观看视频,深夜成人网 | 精品一区二区三区在线观看 | 色必久久 | 国产精品片 | 欧美日本亚洲 | 国产1区 | 欧美精品99 | 欧美国产中文 | 日韩不卡一区二区 | 成人免费观看视频 | www久久国产 | 精品国产一二三区 | 91大片| 色综合久久88色综合天天 | 日韩免费在线观看视频 | 99re在线视频 | 欧美日韩视频 | 亚洲精品一区二区三区中文字幕 | 精品日韩一区二区三区av动图 | 欧美日本韩国一区二区三区 | 日韩午夜 | 中文字幕国产视频 | 日屁视频| 国产高清在线 |