|
求大神帮我看看程序咋死在1602液晶显示里了,加上陀螺仪程序也不行
#include "REG52.H"
#include "math.h" //Keil library
#include "stdio.h" //Keil library
#include "INTRINS.H"
#include "Automatic_Level_Include.h"
//****************************************
//整数转字符串
//****************************************
void lcd_printf(uc *s,int temp_data)
{
if(temp_data<0)
{
temp_data=-temp_data;
*s='-';
}
else *s=' ';
*++s =temp_data/100+0x30;
temp_data=temp_data%100; //取余运算
*++s =temp_data/10+0x30;
temp_data=temp_data%10; //取余运算
*++s =temp_data+0x30;
}
//**************************************
//在1602上显示10位数据
//**************************************
void Display10BitData(int value,uc x,uc y)
{
value/=64; //转换为10位数据
lcd_printf(dis, value); //转换数据显示
DisplayListChar(x,y,dis,4); //启始列,行,显示数组,显示长度
}
//****************************************
//LCD1602初始化
//****************************************
void InitLcd()
{
WriteCommandLCM(0x38,1);
WriteCommandLCM(0x08,1);
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x06,1);
WriteCommandLCM(0x0c,1);
}
//****************************************
//LCD1602写允许
//****************************************
void WaitForEnable(void)
{
Lcd_DataPort=0xff;
LCD_RS=0;
LCD_RW=1;
_nop_();
LCD_EN=1;
_nop_();
_nop_();
while(Lcd_DataPort&0x80);
LCD_EN=0;
}
//****************************************
//LCD1602写入命令
//****************************************
void WriteCommandLCM(uc CMD,uc Attribc)
{
if(Attribc)WaitForEnable();
LCD_RS=0;
LCD_RW=0;
_nop_();
Lcd_DataPort=CMD;
_nop_();
LCD_EN=1;
_nop_();
_nop_();
LCD_EN=0;
}
//****************************************
//LCD1602写入数据
//****************************************
void WriteDataLCM(uc dataW)
{
WaitForEnable();
LCD_RS=1;
LCD_RW=0;
_nop_();
Lcd_DataPort=dataW;
_nop_();
LCD_EN=1;
_nop_();
_nop_();
LCD_EN=0;
}
//****************************************
//LCD1602写入一个字符
//****************************************
void DisplayOneChar(uc X,uc Y,uc DData)
{
Y&=1;
X&=15;
if(Y)
X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
//****************************************
//LCD1602显示字符串
//****************************************
void DisplayListChar(uc X,uc Y,uc *DData,L)
{
uc ListLength=0;
Y&=0x1;
X&=0xF;
while(L--)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
#include "reg52.h"
#include "math.h"
#include "stdio.h"
#include "INTRINS.H"
#include "Automatic_Level_Include.h"
#include "Automatic_Level_I2C.c"
#include "Automatic_Level_LCD.c"
#include "Automatic_Level_MPU6050.c"
#include "Automatic_Level_Motor.c"
#include "Automatic_Level_Delay.c"
#include "KEY.c"
/*************************************************************************************
函数名:Count(Check_Num_X,Check_Num_Y);
函数作用:利用传递的X,Y轴加速度:计算运动需要控制的电机位置,计算旋转方向,旋转步数
参数:
运动的马达数量:Run_Motor_Num = 1--上电机 2--下电机 3--两个电机
运动步数:Step_Num
运动方向:L_Dir = 0--逆时针转 1--顺时针转
运动方向:R_Dir = 0--逆时针转 1--顺时针转
*************************************************************************************/
/*void Motor_Run( uc Run_Motor_Num,//运动马达选择
ui L1_Step,//L1运动步数
ui L2_Step,//L2运动步数
ui R1_Step,//R1运动步数
ui L1_Dir,//L1电机旋转方向
ui L2_Dir,//L2电机旋转方向
ui R1_Dir//R1电机旋转方向
)*/
void Count(int X_Num,int Y_Num)
{
//Motor_Run(L1_L2_R1,5,5,5,Up,Up,Up);//L1_L2_R1同时上升
if((X_Num < 0) && (Y_Num == 0))//X为负数,左高右低
{
Motor_Run(L1_L2_R1,1,1,1,Down,Down,Up);//L1_L2同时下降 R1上升
}
else if((X_Num > 0) && (Y_Num == 0))//X为正数,左低右高
{
Motor_Run(L1_L2_R1,1,1,1,Up,Up,Down);//L1_L2同时上升 R1下降
}
else if((Y_Num < 0) && (X_Num == 0))//Y为负数,上低下高
{
Motor_Run(L1_L2,1,1,0,Up,Down,No_Way);//L1上升,L2下降,R1不管
}
else if((Y_Num > 0) && (X_Num == 0))//Y为正数,上高下低
{
Motor_Run(L1_L2,1,1,0,Down,Up,No_Way);//L1下降,L2上升,R1不管
}
else if((X_Num > 0) && (Y_Num > 0))//X为正数,Y为正数
{
Motor_Run(L1_L2_R1,1,1,1,Down,Up,Down);
}
else if((X_Num < 0) && (Y_Num < 0))//X为负数,Y为负数
{
Motor_Run(L1_L2_R1,1,1,1,Up,Down,Up);
}
else if((X_Num > 0) && (Y_Num < 0))//X为正数,Y为负数
{
Motor_Run(L1_L2_R1,1,1,1,Up,Down,Down);
}
else if((X_Num < 0) && (Y_Num > 0))//X为负数,Y为正数
{
Motor_Run(L1_L2_R1,1,1,1,Down,Up,Up);
}
}
/*********************************************************
函数名:void main()
函数作用:接收显示MPU6050的数据,控制步进电机,按键检测
参数:无
返回值:无
*********************************************************/
void main()
{
ui Look_Refresh_Temp = 20;//LCD扫描时间初始化
Sys_Delay(5); //上电延时
InitLcd(); //液晶初始化
InitMPU6050(); //初始化MPU6050
init_T0(); //定时器初始化
P1=0x00;
// ENA=0; //ENA 控制端
// ENB=0; //ENB 控制端 //控制电机端口置地电平
// ENC=0;
// delay(20);
Sys_Delay(150); //系统初始化完成后延时一会
while(1)
{
if(Button_Up==0)
{
delay(2);
if(Button_Up==0)
{
while(!Button_Up);//上升按钮按下
ENA=1; //ENA 控制端
ENB=1; //ENB 控制端
ENC=1;
Motor_Timer=hig(70);
Motor_Run(L1_L2_R1,Motor_Timer,Motor_Timer,Motor_Timer,Down,Down,Down);
}
}
if(Button_Down==0)
{
delay(2);
if(Button_Down==0)
{
while(!Button_Down);
ENA=1; //ENA 控制端
ENB=1; //ENB 控制端
ENC=1;
Motor_Timer=hig(40);
Motor_Run(L1_L2_R1,Motor_Timer,Motor_Timer,Motor_Timer,Up,Up,Up);
}
}
if(Look_Refresh_Temp == 20)
{
Display10BitData(GetData(ACCEL_XOUT_H),2,0); //显示X轴加速度
Display10BitData(GetData(ACCEL_YOUT_H),7,0); //显示Y轴加速度
Display10BitData(GetData(ACCEL_ZOUT_H),12,0); //显示Z轴加速度
// Display10BitData(GetData(GYRO_XOUT_H),2,1); //显示X轴角速度
// Display10BitData(GetData(GYRO_YOUT_H),7,1); //显示Y轴角速度
// Display10BitData(GetData(GYRO_ZOUT_H),12,1); //显示Z轴角速度
// Look_Refresh_Temp = 0;//扫描时间复位
}
//Check_Num_X = GetData(ACCEL_XOUT_H);//获得X轴加速度
//Check_Num_Y = GetData(ACCEL_YOUT_H);//获得Y轴加速度
/*将获得的XY轴加速度传递给Count函数:计算运动需要控制的电机位置,计算旋转方向,旋转步数*/
// Count(GetData(ACCEL_XOUT_H),GetData(ACCEL_YOUT_H));
// Look_Refresh_Temp ++;//扫描时间自加
// if(spot==0)
// {
//
// while(!spot);
// IN1 = 0;
// IN2 = 0;
// IN3 = 0;//逆时针相序
// IN4 = 0;
// IN5 = 0;//逆时针相序
// IN6 = 0;
//
//
// }
}
}
void T0_temp(void) interrupt 1 //电机转速定时器0
{
TH0=(65536-3036)%256; // 16mm/s==1mm/62500us
TL0=(65536-3036)/256;
n++;
}
#include "REG52.H"
#include "math.h" //Keil library
#include "stdio.h" //Keil library
#include "INTRINS.H"
#include "Automatic_Level_Include.h"
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
{
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态
Single_WriteI2C(SMPLRT_DIV, 0x07);
Single_WriteI2C(CONFIG, 0x06);
Single_WriteI2C(GYRO_CONFIG, 0x18);
Single_WriteI2C(ACCEL_CONFIG, 0x01);
}
|
|