|
- //51單片機(jī)讀取串口MPU6050模塊的實(shí)例程序
- //測(cè)試平臺(tái):
- //51單片機(jī)開發(fā)板YL-39,芯片STC89C52
- //注意:
- // 1.51單片機(jī)的下載串口只有一個(gè),同時(shí)又需要接MPU6050,因此在下載的時(shí)候需要拔下MPU6050的TX線,等程序下載成功以后再插上。
- //接線方法:
- // 51單片機(jī) JY901模塊
- // +5V ---- VCC
- // TX (不接) RX
- // RX ---- TX
- // GND ---- GND
- ///////////////////////////////////////////////////////
- /*預(yù)處理命令*/
- #include <reg52.h> //包含單片機(jī)寄存器的頭文件
- #include <stdio.h>
- #include "JY901.h"
- void delay_ms(unsigned short i)
- {
- unsigned short k;
- while(i--)
- for (k=0;k<100;k++);
- }
- void main(void)
- {
- unsigned char i=0;
- TMOD=0x20; //用定時(shí)器設(shè)置串口波特率 9600
- TH1=0xfd;
- TL1=0xfd;
- TR1=1;
- TI=1;
- REN=1; //串口初始化
- SM0=0;
- SM1=1;
- EA=1; //開啟總中斷
- ES=1;
- printf("STC89S52 Read JY901 module demo\r\n");
- printf("-------------BY:JYZK-------------\r\n");
- printf("---http://RobotControl.taobao.com---\r\n");
- while(1)
- {
- delay_ms(10);
- printf("Time:20%d-%d-%d %d:%d:%.3f\r\n",(short)stcTime.ucYear,(short)stcTime.ucMonth,
- (short)stcTime.ucDay,(short)stcTime.ucHour,(short)stcTime.ucMinute,(float)stcTime.ucSecond+(float)stcTime.usMiliSecond/1000);
- printf("Acc:%.3f %.3f %.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);
- printf("Gyro:%.3f %.3f %.3f\r\n",(float)stcGyro.w[0]/32768*2000,(float)stcGyro.w[1]/32768*2000,(float)stcGyro.w[2]/32768*2000);
- printf("Angle:%.3f %.3f %.3f\r\n",(float)stcAngle.Angle[0]/32768*180,(float)stcAngle.Angle[1]/32768*180,(float)stcAngle.Angle[2]/32768*180);
- printf("Mag:%d %d %d\r\n",stcMag.h[0],stcMag.h[1],stcMag.h[2]);
- printf("Pressure:%lx Height%.2f\r\n",stcPress.lPressure,(float)stcPress.lAltitude/100);
- printf("DStatus:%d %d %d %d\r\n",stcDStatus.sDStatus[0],stcDStatus.sDStatus[1],stcDStatus.sDStatus[2],stcDStatus.sDStatus[3]);
- printf("Longitude:%ldDeg%.5fm Lattitude:%ldDeg%.5fm\r\n",stcLonLat.lLon/10000000,(double)(stcLonLat.lLon % 10000000)/1e5,stcLonLat.lLat/10000000,(double)(stcLonLat.lLat % 10000000)/1e5);
- printf("GPSHeight:%.1fm GPSYaw:%.1fDeg GPSV:%.3fkm/h\r\n\r\n",(float)stcGPSV.sGPSHeight/10,(float)stcGPSV.sGPSYaw/10,(float)stcGPSV.lGPSVelocity/1000);
-
- }
- }
-
- void ser() interrupt 4
- {
- if (RI)
- {
- RI=0;
- CopeSerialData(SBUF);
- }
-
-
- }
復(fù)制代碼- #include <string.h>
- #include "JY901.h"
- struct STime stcTime={0};
- struct SAcc stcAcc={0};
- struct SGyro stcGyro={0};
- struct SAngle stcAngle={0};
- struct SMag stcMag={0};
- struct SDStatus stcDStatus={0};
- struct SPress stcPress={0};
- struct SLonLat stcLonLat={0};
- struct SGPSV stcGPSV={0};
- void CharToLong(char Dest[],char Source[])
- {
- *Dest = Source[3];
- *(Dest+1) = Source[2];
- *(Dest+2) = Source[1];
- *(Dest+3) = Source[0];
- }
- void CopeSerialData(unsigned char ucData)
- {
- static unsigned char ucRxBuffer[12];
- static unsigned char ucRxCnt = 0;
-
- ucRxBuffer[ucRxCnt++]=ucData;
- if (ucRxBuffer[0]!=0x55) //數(shù)據(jù)頭不對(duì),則重新開始尋找0x55數(shù)據(jù)頭
- {
- ucRxCnt=0;
- return;
- }
- if (ucRxCnt<11) {return;}//數(shù)據(jù)不滿11個(gè),則返回
- else
- {
- switch(ucRxBuffer[1])
- {
- case 0x50: stcTime.ucYear = ucRxBuffer[2];
- stcTime.ucMonth = ucRxBuffer[3];
- stcTime.ucDay = ucRxBuffer[4];
- stcTime.ucHour = ucRxBuffer[5];
- stcTime.ucMinute = ucRxBuffer[6];
- stcTime.ucSecond = ucRxBuffer[7];
- stcTime.usMiliSecond=((unsigned short)ucRxBuffer[9]<<8)|ucRxBuffer[8];
- break;
- case 0x51: stcAcc.a[0] = ((unsigned short)ucRxBuffer[3]<<8)|ucRxBuffer[2];
- stcAcc.a[1] = ((unsigned short)ucRxBuffer[5]<<8)|ucRxBuffer[4];
- stcAcc.a[2] = ((unsigned short)ucRxBuffer[7]<<8)|ucRxBuffer[6];
- break;
- case 0x52: stcGyro.w[0] = ((unsigned short)ucRxBuffer[3]<<8)|ucRxBuffer[2];
- stcGyro.w[1] = ((unsigned short)ucRxBuffer[5]<<8)|ucRxBuffer[4];
- stcGyro.w[2] = ((unsigned short)ucRxBuffer[7]<<8)|ucRxBuffer[6];
- break;
- case 0x53: stcAngle.Angle[0] = ((unsigned short)ucRxBuffer[3]<<8)|ucRxBuffer[2];
- stcAngle.Angle[1] = ((unsigned short)ucRxBuffer[5]<<8)|ucRxBuffer[4];
- stcAngle.Angle[2] = ((unsigned short)ucRxBuffer[7]<<8)|ucRxBuffer[6];
- stcAngle.T = ((unsigned short)ucRxBuffer[9]<<8)|ucRxBuffer[8];
- break;
- case 0x54: stcMag.h[0] = ((unsigned short)ucRxBuffer[3]<<8)|ucRxBuffer[2];
- stcMag.h[1] = ((unsigned short)ucRxBuffer[5]<<8)|ucRxBuffer[4];
- stcMag.h[2] = ((unsigned short)ucRxBuffer[7]<<8)|ucRxBuffer[6];
- stcAngle.T = ((unsigned short)ucRxBuffer[9]<<8)|ucRxBuffer[8];
- break;
- case 0x55: stcDStatus.sDStatus[0] = ((unsigned short)ucRxBuffer[3]<<8)|ucRxBuffer[2];
- stcDStatus.sDStatus[1] = ((unsigned short)ucRxBuffer[5]<<8)|ucRxBuffer[4];
- stcDStatus.sDStatus[2] = ((unsigned short)ucRxBuffer[7]<<8)|ucRxBuffer[6];
- stcDStatus.sDStatus[3] = ((unsigned short)ucRxBuffer[9]<<8)|ucRxBuffer[8];
- break;
- case 0x56: ucRxBuffer[2] = 0x12;ucRxBuffer[3] = 0x34;ucRxBuffer[4] = 0x56;ucRxBuffer[5] = 0x78;
- CharToLong((char*)&stcPress.lPressure,(char*)&ucRxBuffer[2]);
- CharToLong((char*)&stcPress.lAltitude,(char*)&ucRxBuffer[6]);
- break;
- case 0x57: CharToLong((char*)&stcLonLat.lLon,(char*)&ucRxBuffer[2]);
- CharToLong((char*)&stcLonLat.lLat,(char*)&ucRxBuffer[6]);
- break;
- case 0x58: stcGPSV.sGPSHeight = ((unsigned short)ucRxBuffer[3]<<8)|ucRxBuffer[2];
- stcGPSV.sGPSYaw = ((unsigned short)ucRxBuffer[5]<<8)|ucRxBuffer[4];
- CharToLong((char*)&stcGPSV.lGPSVelocity,(char*)&ucRxBuffer[6]);
- break;
- }
- ucRxCnt=0;
- }
- }
復(fù)制代碼 |
-
-
51.rar
2019-11-10 16:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
50.53 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5
-
-
Arduino.rar
2019-11-10 16:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
118.72 KB, 下載次數(shù): 7, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|