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

📄 avr_gy-29._c

📁 GY-27资料源码 ADXL345 HMC5883L
💻 _C
字号:
/*****************************************
* 基于AVR单片机GY-29模块通信程序 		 *
* 功    能:IIC通信读取数据并显示        *
* 时钟频率:内部1M 						 *
* 设    计:广运电子					 *
* 修改日期:2011年4月20日				 *
* 编译环境:ICC-AVR7.14					 *
* 实验环境:ATmega16+1602    			 *
* 使用端口:PC0,PC1,PC6,PC7,PA4~PA7 	 *
* 参    考:莫锦攀实验程序24c02读取实验  *
*****************************************/
#include <iom16v.h>
#include "I2C.h"
#include "1602.h"
#include "delay.h"
void conversion(unsigned int i);
void ADXL345_init(void); 
unsigned char display[4]={0,0,0,'g'};//显示数据

/*********************************************
数据转换,十六进制数据转换成10进制
输入十六进制范围:0x0000-0x270f(0-9999)
结果分成个十百千位,以ascii存入显示区
**********************************************/
void conversion(unsigned int i)  
{  
  // 	display[0]=i/10000+0x30 ;
  //  i=i%10000;    //取余运算
	display[0]=i/1000+0x30 ;
    i=i%1000;    //取余运算
    display[1]=i/100+0x30 ;
    i=i%100;    //取余运算
    display[2]=i/10+0x30 ;
 //  i=i%10;     //取余运算
 //   display[3]=i+0x30;  
}
//*******************************
void display_x(void)
{   float temp;
    int x;

     x=I2C_Read(0x33);
	 x=(x<<8)+I2C_Read(0x32);
	 
	if(x<0){
	 x=-x;
     LCD_write_char(2,0,'-');       //显示负符号位
	}
	else 
	LCD_write_char(2,0,' ');        //显示空格
    temp=(float)x*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    conversion(temp);          //转换出显示需要的数据
	LCD_write_char(0,0,'X');   //第0行,第0列 显示X
    LCD_write_char(1,0,':'); 
    LCD_write_char(3,0,display[0]); 
	LCD_write_char(4,0,'.'); 
    LCD_write_char(5,0,display[1]); 
    LCD_write_char(6,0,display[2]); 
	LCD_write_char(7,0,'g'); 

}
//*******************************
void display_y(void)
{   float temp;
    int y;
     y=I2C_Read(0x35);
	 y=(y<<8)+I2C_Read(0x34);
	 
	if(y<0){
	 y=-y;
     LCD_write_char(2,1,'-');       //显示负符号位
	}
	else 
	LCD_write_char(2,1,' ');        //显示空格
    temp=(float)y*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    conversion(temp);          //转换出显示需要的数据
	LCD_write_char(0,1,'y');   //第0行,第0列 显示X
    LCD_write_char(1,1,':'); 
    LCD_write_char(3,1,display[0]); 
	LCD_write_char(4,1,'.'); 
    LCD_write_char(5,1,display[1]); 
    LCD_write_char(6,1,display[2]); 
	LCD_write_char(7,1,'g'); 
}

//*******************************
void display_z(void)
{   float temp;
    int z;

     z=I2C_Read(0x37);
	 z=(z<<8)+I2C_Read(0x36);
	 
	if(z<0){
	 z=-z;
     LCD_write_char(10,1,'-');       //显示负符号位
	}
	else 
	LCD_write_char(10,1,' ');        //显示空格
    temp=(float)z*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    conversion(temp);          //转换出显示需要的数据
	LCD_write_char(10,0,'z');   //第0行,第0列 显示X
    LCD_write_char(11,0,':'); 
    LCD_write_char(11,1,display[0]); 
	LCD_write_char(12,1,'.'); 
    LCD_write_char(13,1,display[1]); 
    LCD_write_char(14,1,display[2]); 
	LCD_write_char(15,1,'g'); 

}

//***********************************************
void ADXL345_init(void)             //adxl345初始化
{
	 I2C_Write(0x31,0x0B);   //测量范围,正负16g,13位模式
	 I2C_Write(0x2C,0x08);   //速率设定为12.5 参考pdf13页
	 I2C_Write(0x2D,0x08);   //选择电源模式   参考pdf24页
	 I2C_Write(0x2E,0x80);   //使能 DATA_READY 中断
	 I2C_Write(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
	 I2C_Write(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
	 I2C_Write(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
}

/*******************************
主程序
*******************************/
void main(void)
{	
	unsigned char i;
		
	 delay_nms(20);          //lcd上电延时
	 LCD_init();             //lcd初始化
	 ADXL345_init(); 
     
	while(1){                          //循环  
	
	display_x();
	display_y(); 
	display_z();

	delay_nms(100); 
    }
}

⌨️ 快捷键说明

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