BH1750.lst 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. C51 COMPILER V9.54 BH1750 02/17/2022 16:20:58 PAGE 1
  2. C51 COMPILER V9.54, COMPILATION OF MODULE BH1750
  3. OBJECT MODULE PLACED IN .\Objects\BH1750.obj
  4. COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE BH1750.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listings\BH
  5. -1750.lst) TABS(2) OBJECT(.\Objects\BH1750.obj)
  6. line level source
  7. 1 #include <REG52.h>
  8. 2 //#include <math.h> //Keil library
  9. 3 #include <BH1750.h> //Keil library
  10. 4 #include <INTRINS.H>
  11. 5
  12. 6
  13. 7 #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
  14. 8 //ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
  15. 9 typedef unsigned char BYTE;
  16. 10 typedef unsigned short WORD;
  17. 11
  18. 12 BYTE BUF[8]; //接收数据缓存区
  19. 13 // uchar ge,shi,bai,qian,wan; //显示变量
  20. 14 //int dis_data; //变量
  21. 15
  22. 16 void IICdelay_xms(unsigned int k);
  23. 17 void Init_BH1750(void);
  24. 18
  25. 19
  26. 20 void Single_Write_BH1750(uchar REG_Address); //单个写入数据
  27. 21 uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
  28. 22 void Multiple_Read_BH1750(); //连续的读取内部寄存器数据
  29. 23 void Delay5us();
  30. 24 void Delay5ms();
  31. 25 void BH1750_Start(); //起始信号
  32. 26 void BH1750_Stop(); //停止信号
  33. 27 void BH1750_SendACK(bit ack); //应答ACK
  34. 28 bit BH1750_RecvACK(); //读ack
  35. 29 void BH1750_SendByte(BYTE dat); //IIC单个字节写
  36. 30 BYTE BH1750_RecvByte(); //IIC单个字节读
  37. 31
  38. 32 //----------------------------------
  39. 33 //毫秒延时**************************
  40. 34 void IICdelay_xms(unsigned int k)
  41. 35 {
  42. 36 1 unsigned int i,j;
  43. 37 1 for(i=0;i<k;i++)
  44. 38 1 {
  45. 39 2 for(j=0;j<121;j++)
  46. 40 2 {;}
  47. 41 2
  48. 42 2 }
  49. 43 1 }
  50. 44
  51. 45 /**************************************
  52. 46 1Tmode
  53. 47 **************************************/
  54. 48 void Delay5us() //@11.0592MHz
  55. 49 {
  56. 50 1 unsigned char i;
  57. 51 1
  58. 52 1 _nop_();
  59. 53 1 i = 11;
  60. 54 1 while (--i);
  61. C51 COMPILER V9.54 BH1750 02/17/2022 16:20:58 PAGE 2
  62. 55 1 }
  63. 56
  64. 57 void Delay5ms() //@11.0592MHz
  65. 58 {
  66. 59 1 unsigned char i, j;
  67. 60 1
  68. 61 1 i = 54;
  69. 62 1 j = 199;
  70. 63 1 do
  71. 64 1 {
  72. 65 2 while (--j);
  73. 66 2 } while (--i);
  74. 67 1 }
  75. 68
  76. 69 /**************************************
  77. 70 起始信号
  78. 71 **************************************/
  79. 72 void BH1750_Start()
  80. 73 {
  81. 74 1 SDA_BH1750 = 1; //拉高数据线
  82. 75 1 SCL_BH1750 = 1; //拉高时钟线
  83. 76 1 Delay5us(); //延时
  84. 77 1 SDA_BH1750 = 0; //产生下降沿
  85. 78 1 Delay5us(); //延时
  86. 79 1 SCL_BH1750 = 0; //拉低时钟线
  87. 80 1 }
  88. 81
  89. 82 /**************************************
  90. 83 停止信号
  91. 84 **************************************/
  92. 85 void BH1750_Stop()
  93. 86 {
  94. 87 1 SDA_BH1750 = 0; //拉低数据线
  95. 88 1 SCL_BH1750 = 1; //拉高时钟线
  96. 89 1 Delay5us(); //延时
  97. 90 1 SDA_BH1750 = 1; //产生上升沿
  98. 91 1 Delay5us(); //延时
  99. 92 1 }
  100. 93
  101. 94 /**************************************
  102. 95 发送应答信号
  103. 96 入口参数:ack (0:ACK 1:NAK)
  104. 97 **************************************/
  105. 98 void BH1750_SendACK(bit ack)
  106. 99 {
  107. 100 1 SDA_BH1750 = ack; //写应答信号
  108. 101 1 SCL_BH1750 = 1; //拉高时钟线
  109. 102 1 Delay5us(); //延时
  110. 103 1 SCL_BH1750 = 0; //拉低时钟线
  111. 104 1 Delay5us(); //延时
  112. 105 1 }
  113. 106
  114. 107 /**************************************
  115. 108 接收应答信号
  116. 109 **************************************/
  117. 110 bit BH1750_RecvACK()
  118. 111 {
  119. 112 1 SCL_BH1750 = 1; //拉高时钟线
  120. 113 1 Delay5us(); //延时
  121. 114 1 CY = SDA_BH1750; //读应答信号
  122. 115 1 SCL_BH1750 = 0; //拉低时钟线
  123. 116 1 Delay5us(); //延时
  124. C51 COMPILER V9.54 BH1750 02/17/2022 16:20:58 PAGE 3
  125. 117 1
  126. 118 1 return CY;
  127. 119 1 }
  128. 120
  129. 121 /**************************************
  130. 122 向IIC总线发送一个字节数据
  131. 123 **************************************/
  132. 124 void BH1750_SendByte(BYTE dat)
  133. 125 {
  134. 126 1 BYTE i;
  135. 127 1
  136. 128 1 for (i=0; i<8; i++) //8位计数器
  137. 129 1 {
  138. 130 2 dat <<= 1; //移出数据的最高位
  139. 131 2 SDA_BH1750 = CY; //送数据口
  140. 132 2 SCL_BH1750 = 1; //拉高时钟线
  141. 133 2 Delay5us(); //延时
  142. 134 2 SCL_BH1750 = 0; //拉低时钟线
  143. 135 2 Delay5us(); //延时
  144. 136 2 }
  145. 137 1 BH1750_RecvACK();
  146. 138 1 }
  147. 139
  148. 140 /**************************************
  149. 141 从IIC总线接收一个字节数据
  150. 142 **************************************/
  151. 143 BYTE BH1750_RecvByte()
  152. 144 {
  153. 145 1 BYTE i;
  154. 146 1 BYTE dat = 0;
  155. 147 1
  156. 148 1 SDA_BH1750 = 1; //使能内部上拉,准备读取数据,
  157. 149 1 for (i=0; i<8; i++) //8位计数器
  158. 150 1 {
  159. 151 2 dat <<= 1;
  160. 152 2 SCL_BH1750 = 1; //拉高时钟线
  161. 153 2 Delay5us(); //延时
  162. 154 2 dat |= SDA_BH1750; //读数据
  163. 155 2 SCL_BH1750 = 0; //拉低时钟线
  164. 156 2 Delay5us(); //延时
  165. 157 2 }
  166. 158 1 return dat;
  167. 159 1 }
  168. 160
  169. 161 //*********************************
  170. 162
  171. 163 void Single_Write_BH1750(uchar REG_Address)
  172. 164 {
  173. 165 1 BH1750_Start(); //起始信号
  174. 166 1 BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
  175. 167 1 BH1750_SendByte(REG_Address); //内部寄存器地址,
  176. 168 1 // BH1750_SendByte(REG_data); //内部寄存器数据,
  177. 169 1 BH1750_Stop(); //发送停止信号
  178. 170 1 }
  179. 171
  180. 172 //********单字节读取*****************************************
  181. 173 /*
  182. 174 uchar Single_Read_BH1750(uchar REG_Address)
  183. 175 { uchar REG_data;
  184. 176 BH1750_Start(); //起始信号
  185. 177 BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
  186. 178 BH1750_SendByte(REG_Address); //发送存储单元地址,从0开始
  187. C51 COMPILER V9.54 BH1750 02/17/2022 16:20:58 PAGE 4
  188. 179 BH1750_Start(); //起始信号
  189. 180 BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
  190. 181 REG_data=BH1750_RecvByte(); //读出寄存器数据
  191. 182 BH1750_SendACK(1);
  192. 183 BH1750_Stop(); //停止信号
  193. 184 return REG_data;
  194. 185 }
  195. 186 */
  196. 187 //*********************************************************
  197. 188 //
  198. 189 //连续读出BH1750内部数据
  199. 190 //
  200. 191 //*********************************************************
  201. 192 void Multiple_read_BH1750(void)
  202. 193 {
  203. 194 1
  204. 195 1 uchar i;
  205. 196 1 BH1750_Start(); //起始信号
  206. 197 1 BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
  207. 198 1 EA=0;
  208. 199 1 for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
  209. 200 1 {
  210. 201 2 BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
  211. 202 2 if (i == 3)
  212. 203 2 {
  213. 204 3
  214. 205 3 BH1750_SendACK(1); //最后一个数据需要回NOACK
  215. 206 3 }
  216. 207 2 else
  217. 208 2 {
  218. 209 3 BH1750_SendACK(0); //回应ACK
  219. 210 3 }
  220. 211 2 }
  221. 212 1 EA=1;
  222. 213 1 BH1750_Stop(); //停止信号
  223. 214 1 Delay5ms();
  224. 215 1 }
  225. 216
  226. 217
  227. 218 //初始化BH1750,根据需要请参考pdf进行修改****
  228. 219 void Init_BH1750()
  229. 220 {
  230. 221 1 Single_Write_BH1750(0x01);
  231. 222 1
  232. 223 1 }
  233. 224
  234. 225 unsigned int BH1750_temp(void)
  235. 226 {
  236. 227 1 unsigned int dis_data; //变量
  237. 228 1 Init_BH1750(); //初始化BH1750
  238. 229 1 Single_Write_BH1750(0x01); // power on
  239. 230 1 Single_Write_BH1750(0x10); // H- resolution mode
  240. 231 1 IICdelay_xms(200); //延时180ms
  241. 232 1 Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
  242. 233 1 dis_data=BUF[0];
  243. 234 1 dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
  244. 235 1 return dis_data;
  245. 236 1 }
  246. MODULE INFORMATION: STATIC OVERLAYABLE
  247. CODE SIZE = 265 ----
  248. C51 COMPILER V9.54 BH1750 02/17/2022 16:20:58 PAGE 5
  249. CONSTANT SIZE = ---- ----
  250. XDATA SIZE = ---- ----
  251. PDATA SIZE = ---- ----
  252. DATA SIZE = 8 ----
  253. IDATA SIZE = ---- ----
  254. BIT SIZE = ---- 1
  255. END OF MODULE INFORMATION.
  256. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)