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