您的当前位置:首页正文

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

2022-02-03 来源:好走旅游网
 .

#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};

/******************************************************************************/

/********** 数据部分 ***********/

/******************************************************************************/

word教育资料

.

#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;jfor(i=0;i<110;i++);

word教育资料

//寄存器选择输入//液晶读/写控制

//液晶使能控制

//串/并方式控制

.

}

/*******************************************************************/

/* */

/*写指令数据到LCD */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */

/* */

/*******************************************************************/

void write_cmd(uchar cmd)

{

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

P0 = cmd;

word教育资料

.

delay_1ms(5);

LCD_EN = 1;

delay_1ms(5);

LCD_EN = 0;

}

/*******************************************************************/

/* */

/*写显示数据到LCD */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */

/* */

/*******************************************************************/

void write_dat(uchar dat)

{

word教育资料

.

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 0;

P0 = dat;

delay_1ms(5);

LCD_EN = 1;

delay_1ms(5);

LCD_EN = 0;

}

/*********************************************************/

/* */

/* 设定显示位置 */

/* */

word教育资料

.

/*********************************************************/

void lcd_pos(uchar X,uchar Y)

{

uchar pos;

if (X==0)

{X=0x80;}

else if (X==1)

{X=0x90;}

else if (X==2)

{X=0x88;}

else if (X==3)

{X=0x98;}

pos = X+Y ;

word教育资料

.

write_cmd(pos); //显示地址

}

/*******************************************************************/

/* */

/* LCD初始化设定 */

/* */

/*******************************************************************/

void lcd_init()

{

LCD_PSB = 1; //并口方式

write_cmd(0x30); //基本指令操作

delay_1ms(5);

write_cmd(0x0C); //显示开,关光标

word教育资料

.

delay_1ms(5);

write_cmd(0x01); //清除LCD的显示内容

delay_1ms(5);

}

uchar set_key_sign; //是否在设置状态标志

uchar delaysign; //视觉停留标志

uchar xposivalue; //x正方向满格显示g值

uchar xnegavalue; //x反方向满格显示g值

uchar yposivalue; //y正方向满格显示g值

uchar ynegavalue; //y反方向满格显示g值

//11111111 11111110 11111100 --- 10000000 00000000 led_ma[i]:i为亮灯数量

uchar led_ma[9]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};

uchar xposiupstate; //x正方向上8个LED显示状态

word教育资料

.

uchar xposidownstate; //x正方向下8个LED显示状态

uchar xnegaupstate; //x反方向上8个LED显示状态

uchar xnegadownstate; //x反方向下8个LED显示状态

uchar yupstate; //y方向上8个LED显示状态

uchar ydownstate; //y方向下8个LED显示状态

uchar xposilightnum; //x正方向亮灯数量(1——16)

uchar xnegalightnum; //x反方向亮灯数量(1——16)

uchar yposilightnum; //y正方向亮灯数量(1——8)

uchar ynegalightnum; //x正方向亮灯数量(1——8)

uchar ack_sign; //I2C 应答标志

/**************************************************************************/

/************ 各延时程序 **************/

/**************************************************************************/

word教育资料

.

void iic_delay() //5us延时

{

_nop_();

_nop_();

_nop_();

_nop_();

}

void delay_50us(uint t)

{

uchar j;

for(;t>0;t--)

for(j=19;j>0;j--);

}

word教育资料

.

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();

word教育资料

scl=1;

iic_delay();

sda=0;

iic_delay();

}

void iic_stop() {

sda=0;

iic_delay();

scl=1;

iic_delay();

sda=1;

iic_delay();

word教育资料

.

//函数功能:I2C通信停止

.

}

void iic_ack() //函数功能:I2C通信查应答位

{

sda=1;

scl=1;

iic_delay();

ack_sign=sda;

scl=0;

}

void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节

{

uchar i,temp,temp1;

temp1=wdata;

word教育资料

.

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();

word教育资料

.

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;

word教育资料

.

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)//函数功能:按地址写入一字节数据

word教育资料

.

{

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) word教育资料

//函数功能:按地址读出一字节数据

.

{

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();

word教育资料

.

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值

word教育资料

.

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;

word教育资料

.

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);

word教育资料

.

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);

}}

word教育资料

因篇幅问题不能全部显示,请点此查看更多更全内容