/*******************************************************************************
这里有前提文件345.c和3050.c
分别是加速度和陀螺仪的程序,百度上也有,没有找我也罢- -!
用别的程序也行,这里只是直接调用结果(测量值)
然后偷了个懒——人家一般都把陀螺仪结果积分什么的,我这里没有
因为陀螺仪的测量的就是角速度,所以我根据我自己的那个陀螺仪(只是我自己这个哦)
测试了一下灵敏度,确定了角度和测量值的大致关系,可以得到角度的大致值
当然,必然是有误差的,相比积分方法当然不行,人家耗时间研究算法、调参数
我这个就是不停的找参数的,比较简单,如果想要在飞行器上用,那还是算了 o(∩_∩)o 哈哈 *
********************************************************************************/
#include <REG52.H>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
char code MESSAGE[][1]= {{'0'},{'1'},{'2'},{'3'},{'4'},{'5'},{'6'},{'7'},{'8'},{'9'},{'x'},{'y'},{'z'},{'a'},{'b'},{'c'},{'+'},{'-'},{'.'}};
/////////////////////////////////////////////////////////////////////////////////////////10----11----12----13----14----15----16----17----18----19----20
int x_345,y_345;
int z_3050;//extern =0
int player=0;static
sbit light=P2^0;//调试信号
void delay(unsigned int i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--) ;
}
void run(int numin)
{
unsigned int count;
count=0;
// while(MESSAGE[numin][count] != '\0') //仅仅适用于字符串!!!
{
SBUF = MESSAGE[numin][count]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
count++; // 下一个字符
}//while (MESSAGE[i][a] != '\0')
delay(50);
}
/******************3050*********************/
void tellchar(int number)
{/**/
int n1,n2,n3,n4,tempc;//正负,百位 ,十位,个位
if(number<0){n1=17;tempc=-number;}
else {n1=16;tempc=number;}
n2 =tempc/100;//得到最高位
tempc=tempc%100;//去除最高位
n3 =tempc/10;//得到次低位低位
n4 =tempc%10;//得到最低位
run(n1);run(n2);run(n3);run(n4);
}
/******************345显示用函数************************/
void InitLcd(); //初始化lcd1602
void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据
uchar Single_Read_ADXL345(uchar REG_Address);
void Init_ADXL345(); //初始化ADXL345
int display_x();
int display_y();
/******************3050显示用函数************************/
void InitMPU3050(); //初始化MPU3050
int display_z();
//****************************************
void main (void)
{
uchar devid;
delay(100);////delay(500); //上电延时
InitLcd(); //液晶初始化ADXL345
Init_ADXL345(); //初始化ADXL345
devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确
/**/
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
// TH1 = 0xcc;//0xd0 //baud*2 /* reload value 1200、数据位8、停止位1。效验位无(12MHz)
TH1 = 0xe6;
TL1 = 0xe6;
TR1 = 1; //开启定时器1
ES = 1; //开串口中断
EA = 1; // 开总中断
// IE = 0x0;
while(1)
{
light=0;
Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中
x_345=display_x(); //---------显示X轴
y_345=display_y(); //---------显示Y轴
//z_3050=0;//display_z();
//X
run(13);/**/
if(x_345<0){x_345=-x_345;run(17);}//x符号
else run(16);
run(x_345%10000/1000);//千位
run(x_345%1000/100); //百位
run(x_345%100/10); //十位
//Y
run(14);/**/
if(y_345<0){y_345=-y_345;run(17);}//y符号
else run(16);
run(y_345%10000/1000);//千位
run(y_345%1000/100); //百位
run(y_345%100/10); //十位
//Z
// run(15);
// if(z_3050<0){z_3050=-z_3050;run(17);}//y符号
// else run(16);
// run(z_3050%10000/1000);//千位
// run(z_3050%1000/100); //百位
// run(z_3050%100/10); //十位
// tellchar(z_3050);
light=1;
}//while(1)
}
/*
a=0;
while(MESSAGE[i][a] != '\0') {
SBUF = MESSAGE[i][a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
a++; // 下一个字符
}//while (MESSAGE[i][a] != '\0')
delay(100);
//for(i=0;i<20;i++)run(i); //测试字符
*/