×
嵌入式 > 技术百科 > 详情

三轴角度检测(倾角传感器MMA7455(加速度传感器))

发布时间:2020-10-12 发布时间:
|
#include
#include  //要用到_nop_();函数

#define uchar unsigned char
#define uint  unsigned int
/***************************************************************************/
/***********               单片机引脚定义                       ************/
/***************************************************************************/
sbit sda=P1^0;              //I2C 数据传送位
sbit scl=P1^1;              //I2C 时钟传送位
char x,y,z,num[9]={0,0,0};

/******************************************************************************/
/**********                     数据部分                            ***********/
/******************************************************************************/
#define IIC_READ  0x1D      //定义读指令
#define IIC_WRITE 0x1D      //定义写指令


#define LCD_data  P0             //数据口
sbit inter_0=P3^2;
sbit LCD_RS  =  P2^7;            //寄存器选择输入 
sbit LCD_RW  =  P2^6;            //液晶读/写控制
sbit LCD_EN  =  P2^5;            //液晶使能控制
sbit LCD_PSB =  P2^4;            //串/并方式控制
void delay_1ms(uint x) 
{ 
uint i,j; 
for(j=0;j0;t--)
 for(j=19;j>0;j--);
}
void delay_50ms(uchar t)
{
    uint j;
 for(;t>0;t--)
 for(j=6245;j>0;j--);
}


/*********************************************************************/
/**************               I2C通信部分              ***************/
/*********************************************************************/
void iic_start()               //函数功能:I2C通信开始
{
 sda=1;
    iic_delay();
 scl=1;
    iic_delay();
 sda=0;
 iic_delay();
 
}

void iic_stop()                //函数功能:I2C通信停止
{
 sda=0;
 iic_delay();
 scl=1;
 iic_delay();
 sda=1;
 iic_delay();
 
}

void iic_ack()                 //函数功能:I2C通信查应答位
{ 
    sda=1;
 scl=1;
 iic_delay();
 ack_sign=sda;
 scl=0;    
}
[page]
void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节
{
     uchar i,temp,temp1;

  temp1=wdata;
     for(i=0;i<8;i++)
 {
             scl = 0;
    iic_delay();
    temp=temp1;
    temp=temp&0x80;
    if(temp==0x80)
     sda=1;    
    else
     sda=0;
     iic_delay();
     scl=1;
     iic_delay();
     scl=0;
     iic_delay();
     temp1=temp1<<1;
   
 }

}
char iic_read_byte(void)    //函数功能:从I2C从机中读出一个字节
{
     uchar x;
  char data_data;
     for (x=0;x<8;x++)
 { 
     data_data=data_data<<1;
  sda=1;
  iic_delay();
  scl=0;
  iic_delay();
  scl=1;
  iic_delay();
  if(sda==1)
     data_data|=0x01; 
  //else  
  //   data_data&=0xfe;
 }
 return data_data;
}
void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据
{
     uchar t;
  t=(IIC_WRITE<<1);
  iic_start();
  iic_write_byte(t);
  iic_ack();
  iic_write_byte(byte_add);
  iic_ack();
  iic_write_byte(wdata);
  iic_ack();
  iic_stop();
}
char iic_read(uchar byte_add)            //函数功能:按地址读出一字节数据
{
     uchar t;
  char x;
  t=(IIC_WRITE<<1);
  iic_start();
  iic_write_byte(t);
  iic_ack();
  iic_write_byte(byte_add);
  iic_ack();
  t=((IIC_READ<<1)|0x01);
  iic_start();
  iic_write_byte(t);
  iic_ack();
  x=iic_read_byte();
  iic_ack();
  iic_stop();
  return x;
}
           

void main()
{delay_1ms(10);                 //延时
    lcd_init();
 delay_1ms(5);
 
 
 
 iic_write(0x16,0x5);
 
 iic_write(0x10,0x32);//校正X值
 iic_write(0x12,0x62);//校正Y值

 delay_50ms(20);
 while(1)
 {
x=iic_read(0x06);
y=iic_read(0x07);
z=iic_read(0x08);
num[0]=x/100;
num[1]=x/10%10;
num[2]=x%10;

num[3]=y/100;
num[4]=y/10%10;
num[5]=y%10;


num[6]=z/100;
num[7]=z/10%10;
num[8]=z%10;

lcd_pos(0,0);
write_dat(num[0]+48);
delay_1ms(5);      
write_dat(num[1]+48);
delay_1ms(5);
write_dat(num[2]+48);
delay_1ms(5);

lcd_pos(1,0);
write_dat(num[3]+48);
delay_1ms(5);      
write_dat(num[4]+48);
delay_1ms(5);
write_dat(num[5]+48);
delay_1ms(5);

lcd_pos(2,0);
write_dat(num[6]+48);
delay_1ms(5);      
write_dat(num[7]+48);
delay_1ms(5);
write_dat(num[8]+48);
delay_1ms(5);

  
}} 
 
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
NS推出采用第二代PowerWise技术的能源管理单元及先进电源控制器