⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stc_lsm303dlh.lst

📁 GY-51 LSM303DLH 三轴磁场加速度模块
💻 LST
📖 第 1 页 / 共 2 页
字号:
 217   2              SCL = 0;                //拉低时钟线
 218   2              Delay5us();             //延时
 219   2          }
 220   1          LSM303_RecvACK();
 221   1      }
 222          
 223          /**************************************
 224          从IIC总线接收一个字节数据
 225          **************************************/
 226          BYTE LSM303_RecvByte()
 227          {
 228   1          BYTE i;
 229   1          BYTE dat = 0;
 230   1      
 231   1          SDA = 1;                    //使能内部上拉,准备读取数据,
 232   1          for (i=0; i<8; i++)         //8位计数器
 233   1          {
 234   2              dat <<= 1;
 235   2              SCL = 1;                //拉高时钟线
 236   2              Delay5us();             //延时
 237   2              dat |= SDA;             //读数据               
 238   2              SCL = 0;                //拉低时钟线
 239   2              Delay5us();             //延时
C51 COMPILER V7.08   STC_LSM303DLH                                                         06/19/2011 23:40:18 PAGE 5   

 240   2          }
 241   1          return dat;
 242   1      }
 243          
 244          //单字节写入LSM303内部数据*******************************
 245          
 246          void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
 247          {
 248   1          LSM303_Start();                  //起始信号
 249   1          LSM303_SendByte(SlaveAddress);   //发送设备地址+写信号
 250   1          LSM303_SendByte(REG_Address);    //内部寄存器地址
 251   1          LSM303_SendByte(REG_data);       //内部寄存器数据
 252   1          LSM303_Stop();                   //发送停止信号
 253   1      }
 254          
 255          //单字节读取LSM303内部数据********************************
 256          uchar Single_Read(uchar SlaveAddress,uchar REG_Address)
 257          {  uchar REG_data;
 258   1          LSM303_Start();                          //起始信号
 259   1          LSM303_SendByte(SlaveAddress);           //发送设备地址+写信号
 260   1          LSM303_SendByte(REG_Address);            //发送存储单元地址 
 261   1          LSM303_Start();                          //起始信号
 262   1          LSM303_SendByte(SlaveAddress+1);         //发送设备地址+读信号
 263   1          REG_data=LSM303_RecvByte();              //读出寄存器数据
 264   1              LSM303_SendACK(1);   
 265   1              LSM303_Stop();                           //停止信号
 266   1          return REG_data; 
 267   1      }
 268          //*********************************************************
 269          //连续读出LSM303内部数据
 270          //*********************************************************
 271          void Multiple_read(uchar SlaveAddress,uchar ST_Address)
 272          {   uchar i;
 273   1          LSM303_Start();                          //起始信号
 274   1          LSM303_SendByte(SlaveAddress);           //发送设备地址+写信号
 275   1          LSM303_SendByte(ST_Address);             //发送存储单元地址
 276   1          LSM303_Start();                          //起始信号
 277   1          LSM303_SendByte(SlaveAddress+1);         //发送设备地址+读信号
 278   1               for (i=0; i<6; i++)                     //连续读取6个地址数据,存储中BUF
 279   1          {
 280   2              BUF[i] = LSM303_RecvByte();          //BUF[0]存储
 281   2              if (i == 5)
 282   2              {
 283   3                 LSM303_SendACK(1);                //最后一个数据需要回NOACK
 284   3              }
 285   2              else
 286   2              {
 287   3                LSM303_SendACK(0);                //回应ACK
 288   3             }
 289   2         }
 290   1          LSM303_Stop();                          //停止信号
 291   1          Delay5ms();
 292   1      }
 293          
 294          //**************************************************************
 295          
 296          //初始化LSM303A(加速度),根据需要请参考pdf进行修改**************
 297          void Init_LSM303A()
 298          {
 299   1         Single_Write(LSM303A_SlaveAddress,0x20,0x27);   //测量范围,正负2g,16位模式
 300   1      }
 301          
C51 COMPILER V7.08   STC_LSM303DLH                                                         06/19/2011 23:40:18 PAGE 6   

 302          //初始化LSM303M(磁场),根据需要请参考pdf进行修改****
 303          void Init_LSM303M()
 304          {
 305   1           Single_Write(LSM303M_SlaveAddress,0x02,0x00);  //
 306   1      }
 307          //**************************************************************
 308          //加速度显示x轴
 309          void display_x()
 310          {   float temp; 
 311   1          BUF[0]=Single_Read(LSM303A_SlaveAddress,0x28);//OUT_X_L_A
 312   1              BUF[1]=Single_Read(LSM303A_SlaveAddress,0x29);//OUT_X_H_A
 313   1      
 314   1          dis_data=(BUF[1]<<8)+BUF[0];  //合成数据   
 315   1              
 316   1              if(dis_data<0){
 317   2              dis_data=-dis_data;
 318   2          DisplayOneChar(2,0,'-');      //显示正负符号位
 319   2              }
 320   1              else DisplayOneChar(2,0,' '); //显示空格
 321   1         
 322   1          temp=(float)dis_data/16.383;  //
 323   1          conversion(temp);          //转换出显示需要的数据
 324   1              DisplayOneChar(0,0,'X');   //第0行,第0列 显示X
 325   1          DisplayOneChar(1,0,':'); 
 326   1          DisplayOneChar(3,0,qian); 
 327   1              DisplayOneChar(4,0,'.'); 
 328   1          DisplayOneChar(5,0,bai); 
 329   1              DisplayOneChar(6,0,'g'); 
 330   1      }
 331          
 332          //***************************************************************
 333          //加速度显示y轴
 334          void display_y()
 335          {    float temp; 
 336   1           BUF[2]=Single_Read(LSM303A_SlaveAddress,0x2a);//OUT_Y_L_A
 337   1               BUF[3]=Single_Read(LSM303A_SlaveAddress,0x2b);//OUT_Y_H_A
 338   1      
 339   1      
 340   1          dis_data=(BUF[3]<<8)+BUF[2];  //合成数据   
 341   1              if(dis_data<0){
 342   2              dis_data=-dis_data;
 343   2          DisplayOneChar(2,1,'-');      //显示正负符号位
 344   2              }
 345   1              else DisplayOneChar(2,1,' '); //显示空格
 346   1      
 347   1          temp=(float)dis_data/16.383;  //计算数据和显示
 348   1          conversion(temp);          //转换出显示需要的数据
 349   1              DisplayOneChar(0,1,'Y');   //第1行,第0列 显示y
 350   1          DisplayOneChar(1,1,':'); 
 351   1          DisplayOneChar(3,1,qian); 
 352   1              DisplayOneChar(4,1,'.'); 
 353   1          DisplayOneChar(5,1,bai); 
 354   1        //  DisplayOneChar(6,1,shi);  
 355   1              DisplayOneChar(6,1,'g');  
 356   1      }
 357          
 358          //**************************************************************
 359          //加速度显示z轴
 360          void display_z()
 361          {    float temp;
 362   1           BUF[4]=Single_Read(LSM303A_SlaveAddress,0x2c);//OUT_Z_L_A
 363   1               BUF[5]=Single_Read(LSM303A_SlaveAddress,0x2d);//OUT_Z_H_A
C51 COMPILER V7.08   STC_LSM303DLH                                                         06/19/2011 23:40:18 PAGE 7   

 364   1      
 365   1          dis_data=(BUF[5]<<8)+BUF[4];  //合成数据   
 366   1              if(dis_data<0){
 367   2              dis_data=-dis_data;
 368   2          DisplayOneChar(11,1,'-');     //显示负符号位
 369   2              }
 370   1              else DisplayOneChar(11,1,' ');//显示空格
 371   1      
 372   1          temp=(float)dis_data/16.383;  //计算数据和显示
 373   1          conversion(temp);             //转换出显示需要的数据
 374   1              DisplayOneChar(9,1,'Z');      //第0行,第10列 显示Z
 375   1          DisplayOneChar(10,1,':'); 
 376   1          DisplayOneChar(12,1,qian); 
 377   1              DisplayOneChar(13,1,'.'); 
 378   1          DisplayOneChar(14,1,bai); 
 379   1         // DisplayOneChar(14,1,shi); 
 380   1              DisplayOneChar(15,1,'g');  
 381   1      }
 382          
 383          void display_Angle(void)
 384             {  int x,y,z;
 385   1            double  angle;
 386   1       
 387   1          x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register
 388   1          y=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register
 389   1          z=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register
 390   1      
 391   1          angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
 392   1          angle*=10;
 393   1      
 394   1          conversion(angle);       //计算数据和显示
 395   1              DisplayOneChar(9,0,'A'); 
 396   1          DisplayOneChar(10,0,':'); 
 397   1          DisplayOneChar(11,0,qian); 
 398   1          DisplayOneChar(12,0,bai); 
 399   1          DisplayOneChar(13,0,shi); 
 400   1          DisplayOneChar(14,0,'.'); 
 401   1              DisplayOneChar(15,0,ge); 
 402   1              }
 403          
 404          //*********************************************************
 405          //******主程序********
 406          //*********************************************************
 407          void main()
 408          { 
 409   1          delay(50);                     //上电延时           
 410   1          InitLcd();                     //液晶初始化
 411   1          Init_LSM303A();                //初始化LSM303 加速度
 412   1          Init_LSM303M();                //初始化LSM303 磁场
 413   1        while(1)                         //循环
 414   1        { 
 415   2          delay(10);                     //延时 
 416   2          display_x();                   //---------加速度,显示X轴
 417   2          display_y();                   //---------加速度,显示Y轴
 418   2          display_z();                   //---------加速度,显示Z轴
 419   2      
 420   2          delay(10);                     //延时 
 421   2              Multiple_Read(LSM303M_SlaveAddress,0X03); //连续读出数据,存储在BUF中  
 422   2          display_Angle();               //---------磁场,显示角度
 423   2              delay(100); 
 424   2        }
 425   1      } 
C51 COMPILER V7.08   STC_LSM303DLH                                                         06/19/2011 23:40:18 PAGE 8   



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1140    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     15       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -