2013年全国大学生电子设计大赛本科C题倒立摆程序.doc_第1页
2013年全国大学生电子设计大赛本科C题倒立摆程序.doc_第2页
2013年全国大学生电子设计大赛本科C题倒立摆程序.doc_第3页
2013年全国大学生电子设计大赛本科C题倒立摆程序.doc_第4页
2013年全国大学生电子设计大赛本科C题倒立摆程序.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include#include #include #include typedef unsigned char uchar;typedef unsigned short ushort;typedef unsigned int uint;sbit bmq=P15;sbit sn=P12;sbit l1=P10;sbit l2=P11;sbit j1=P00;sbit j2=P01;sbit j3=P02;sbit j4=P03;sbit j5=P04;sbit j6=P05;sbit j7=P06;sbit j8=P07;unsigned char tttt=0;unsigned char step=0;#define unchar unsigned char#define unint unsigned int#define clear 0x01#define home 0x02#define f_set 0x30#define dis_on 0x0f#define in_mode 0x06sbit P_RS=P22;sbit P_RW=P21;sbit P_E= P20;sbit SCL=P16;/IIC时钟引脚定义sbit SDA=P17;/IIC数据引脚定义char s15;/*/ 定义MPU6050内部地址/*#defineSMPLRT_DIV0x19/陀螺仪采样率,典型值:0x07(125Hz)#defineCONFIG0x1A/低通滤波频率,典型值:0x06(5Hz)#defineGYRO_CONFIG0x1B/陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#defineACCEL_CONFIG0x1C/加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)#defineACCEL_XOUT_H0x3B#defineACCEL_XOUT_L0x3C#defineACCEL_YOUT_H0x3D#defineACCEL_YOUT_L0x3E#defineACCEL_ZOUT_H0x3F#defineACCEL_ZOUT_L0x40#defineTEMP_OUT_H0x41#defineTEMP_OUT_L0x42#defineGYRO_XOUT_H0x43#defineGYRO_XOUT_L0x44#defineGYRO_YOUT_H0x45#defineGYRO_YOUT_L0x46#defineGYRO_ZOUT_H0x47#defineGYRO_ZOUT_L0x48#definePWR_MGMT_10x6B/电源管理,典型值:0x00(正常启用)#defineWHO_AM_I0x75/IIC地址寄存器(默认数值0x68,只读)#defineSlaveAddress0xD0/IIC写入时的地址字节数据,+1为读取/*/函数声明/*/MPU6050操作函数void InitMPU6050();/初始化MPU6050void Delay5us();void I2C_Start();void I2C_Stop();void I2C_SendACK(bit ack);bit I2C_RecvACK();void I2C_SendByte(uchar dat);uchar I2C_RecvByte();void I2C_ReadPage();void I2C_WritePage();uchar Single_ReadI2C(uchar REG_Address);/读取I2C数据void Single_WriteI2C(uchar REG_Address,uchar REG_data);/向I2C写入数据/*/延时5微秒(STC90C52RC12M)/不同的工作环境,需要调整此函数/当改用1T的MCU时,请调整此延时函数/*void Delay5us()unsigned char i;i = 22;while (-i);/*/I2C起始信号/*void I2C_Start() SDA = 1; /拉高数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 0; /产生下降沿 Delay5us(); /延时 SCL = 0; /拉低时钟线/*/I2C停止信号/*void I2C_Stop() SDA = 0; /拉低数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 1; /产生上升沿 Delay5us(); /延时/*/I2C发送应答信号/入口参数:ack (0:ACK 1:NAK)/*void I2C_SendACK(bit ack) SDA = ack; /写应答信号 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时/*/I2C接收应答信号/*bit I2C_RecvACK() SCL = 1; /拉高时钟线 Delay5us(); /延时 CY = SDA; /读应答信号 SCL = 0; /拉低时钟线 Delay5us(); /延时 return CY;/*/向I2C总线发送一个字节数据/*void I2C_SendByte(uchar dat) uchar i; for (i=0; i8; i+) /8位计数器 dat = 1; /移出数据的最高位 SDA = CY; /送数据口 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时 I2C_RecvACK();/*/从I2C总线接收一个字节数据/*uchar I2C_RecvByte() uchar i; uchar dat = 0; SDA = 1; /使能内部上拉,准备读取数据, for (i=0; i8; i+) /8位计数器 dat = 1; SCL = 1; /拉高时钟线 Delay5us(); /延时 dat |= SDA; /读数据 SCL = 0; /拉低时钟线 Delay5us(); /延时 return dat;/*/向I2C设备写入一个字节数据/*void Single_WriteI2C(uchar REG_Address,uchar REG_data) I2C_Start(); /起始信号 I2C_SendByte(SlaveAddress); /发送设备地址+写信号 I2C_SendByte(REG_Address); /内部寄存器地址, I2C_SendByte(REG_data); /内部寄存器数据, I2C_Stop(); /发送停止信号/*/从I2C设备读取一个字节数据/*uchar Single_ReadI2C(uchar REG_Address)uchar REG_data;I2C_Start(); /起始信号I2C_SendByte(SlaveAddress); /发送设备地址+写信号I2C_SendByte(REG_Address); /发送存储单元地址,从0开始I2C_Start(); /起始信号I2C_SendByte(SlaveAddress+1); /发送设备地址+读信号REG_data=I2C_RecvByte(); /读出寄存器数据I2C_SendACK(1); /接收应答信号I2C_Stop(); /停止信号return REG_data;/*/初始化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);/*/合成数据/*int GetData(uchar REG_Address)char H,L;H=Single_ReadI2C(REG_Address);L=Single_ReadI2C(REG_Address+1);return (H=0x01;i=i1) if(ix&i)=0) P_RW=0; else P_RW=1; P_E=1; P_E=0; void instruct(unchar dat)unchar ch;P_RS=1;ch=0xf8;bit8_serial_input(ch);ch=dat&0xf0;bit8_serial_input(ch);ch=dat4;bit8_serial_input(ch);P_RS=0;void write_abyte(unchar dat)data unchar ch;P_RS=1;ch=0xfa;bit8_serial_input(ch);ch=dat&0xf0;bit8_serial_input(ch);ch=dat4;bit8_serial_input(ch);P_RS=0;void dis_str(unchar x, unchar y, unchar *str)unchar loc,*p;unchar xline5=0,1,3,2,4;p=str;x=xlinex;instruct(home);loc=(16*(x-1)+y-1);if(loc&0x01) loc/=2; instruct(loc|0x80); write_abyte( ); else loc/=2; instruct(loc|0x80); while(*p) write_abyte(*p+); void initial(void)data unchar i,j;P_RS=0;P_E=0;instruct(f_set);for(i=0;i30;i+)for(i=0;i250;i+)for(i=0;i250;i+)instruct(f_set);for(i=0;i30;i+)for(i=0;i250;i+)for(i=0;i250;i+)instruct(0x0c);for(i=0;i30;i+)instruct(clear);for(j=0;j10;j+) for(i=0;i250;i+)instruct(in_mode);for(i=0;i8;IAP_TRIG=0x5A;IAP_TRIG=0xA5;IAP_ADDRL+;IAP_DATA=d&0xff;IAP_TRIG=0x5A;IAP_TRIG=0xA5;void savechar(unsigned char d)IAP_DATA=d;IAP_TRIG=0x5A;IAP_TRIG=0xA5;unsigned char readchar()IAP_TRIG=0x5A;IAP_TRIG=0xA5;return IAP_DATA;int readint()int d;IAP_TRIG=0x5A;IAP_TRIG=0xA5;d=IAP_DATA;d4;while(1)initial();while(input()=15);Delay50ms(2);dis_str(4,1,输入PWM1高四位);sprintf(s,%d,(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num)case 16:case 0:break;default:t=num;if(num=16)break;PWM1&=0x0f;PWM1+=t4;while(1)initial();dis_str(4,1,输入PWM2高四位);sprintf(s,%d,(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num)case 16:case 0:break;default:t=num;if(num=16)break;PWM2&=0x0f;PWM2+=t4;while(1)initial();dis_str(4,1,输入PWM3高四位);sprintf(s,%d,(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num)case 16:case 0:break;default:t=num-1;if(num=16)break;PWM3&=0x0f;PWM3+=t4;t=PWM3&0x0f;while(input()=16);Delay50ms(2);while(1)initial();dis_str(4,1,输入PWM3低四位);sprintf(s,%d,(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num)case 16:case 0:break;default:t=num-1;if(num=16)break;while(input()=16);Delay50ms(2);PWM3&=0xf0;PWM3+=t;t=pa1;while(1)initial();dis_str(4,1,输入一加速时间);sprintf(s,%d,(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num)case 16:case 0:break;default:t=num-1;if(num=16)break;while(input()=16);Delay50ms(2);pa1=t;t=ps1;while(1)initial();dis_str(4,1,输入一减速时间);sprintf(s,%d,(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num)case 16:case 0:break;default:t=num-1;if(num=16)break;while(input()=16);Delay50ms(2);ps1=t;t=pa2;while(1)initial();dis_str(4,1,输入二加速时间);sprintf(s,%d,(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num)case 16:case 0:break;default:t=num-1;if(num=16)break;while(input()=16);Delay50ms(2);pa2=t;t=ps2;while(1)initial();dis_str(4,1,输入二减速时间);sprintf(s,%d,(int)t);dis_str(1,9,s);Delay50ms(1);num=input();switch(num)case 16:case 0:break;default:t=num-1;if(num=16)break;while(input()=16);Delay50ms(2);ps2=t;gx=GetData(ACCEL_XOUT_H)/100-164;IAP_CONTR=0x83;IAP_ADDRH=0;IAP_ADDRL=0;IAP_CMD=3;IAP_TRIG=0x5A;IAP_TRIG=0xA5;IAP_CMD=2;saveint(gx);gy=GetData(ACCEL_YOUT_H)/100;IAP_ADDRL+;saveint(gy);gz=GetData(ACCEL_ZOUT_H)/100;IAP_ADDRL+;saveint(gz);wy=GetData(GYRO_YOUT_H)/100;IAP_ADDRL+;saveint(wy);IAP_ADDRL+;savechar(PWM1);IAP_ADDRL+;savechar(PWM2);IAP_ADDRL+;savechar(PWM3);IAP_ADDRL+;savechar(pa1);IAP_ADDRL+;savechar(ps1);IAP_ADDRL+;savechar(pa2);IAP_ADDRL+;savechar(ps2);initial();return;int x,y,z;int getangle()x=GetData(ACCEL_XOUT_H)/100+164-gx;y=GetData(ACCEL_YOUT_H)/100-gy;z=GetData(ACCEL_ZOUT_H)/100-gz;if(z4;ps=0;if(state4;ps+;if(state4;ps+;if(state4;ps+;if(state15)break;j4=1;break;switch(state)case 15:return 0;case 14:return 1+4*ps;case 13:return 2+4*ps;case 11:return 3+4*ps;case 7:return 4+4*ps;return 0;void rd()l1=1;l2=0;Delay50ms(pa1);l1=0;Delay50ms(ps1);unsigned char a;float b;unsigned char reset=0;unsigned char xd,xa;int angle;void main()InitMPU6050();/初始化MPU6050IAP_CONTR=0x83;IAP_ADDRH=0;IAP_ADDRL=0;IAP_CMD=1;gx=readint();IAP_ADDRL+;gy=readint();IAP_ADDRL+;gz=readint();IAP_ADDRL+;wy=readint();IAP_ADDRL+;PWM1=readchar();IAP_ADDRL+;PWM2=readchar();IAP_ADDRL+;PWM3=readchar();IAP_ADDRL+;pa1=readchar();IAP_ADDRL+;ps1=readchar();IAP_ADDRL+;pa2=readchar();IAP_ADDRL+;ps2=readchar();TMOD=0X20;TH1=0xfb;TL1=0xfb;SCON=0x50;TR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论