1 //****************************************
\r
2 // Update to MPU6050 by shinetop
\r
5 // ¹¦ÄÜ: ÏÔʾ¼ÓËٶȼƺÍÍÓÂÝÒǵÄ10λÔʼÊý¾Ý
\r
6 //****************************************
\r
7 // GY-52 MPU3050 IIC²âÊÔ³ÌÐò
\r
8 // ʹÓõ¥Æ¬»úSTC89C51
\r
11 // ±àÒë»·¾³ Keil uVision2
\r
12 // ²Î¿¼ºê¾§ÍøÕ¾24c04ͨÐųÌÐò
\r
13 // ʱ¼ä£º2011Äê9ÔÂ1ÈÕ
\r
15 //****************************************
\r
17 #include <math.h> //Keil library
\r
18 #include <stdio.h> //Keil library
\r
19 #include <INTRINS.H>
\r
20 typedef unsigned char uchar;
\r
21 typedef unsigned short ushort;
\r
22 typedef unsigned int uint;
\r
23 //****************************************
\r
25 //****************************************
\r
26 #define DataPort P0 //LCD1602Êý¾Ý¶Ë¿Ú
\r
27 sbit SCL=P1^0; //IICʱÖÓÒý½Å¶¨Òå
\r
28 sbit SDA=P1^1; //IICÊý¾ÝÒý½Å¶¨Òå
\r
29 sbit LCM_RS=P2^0; //LCD1602ÃüÁî¶Ë¿Ú
\r
30 sbit LCM_RW=P2^1; //LCD1602ÃüÁî¶Ë¿Ú
\r
31 sbit LCM_EN=P2^2; //LCD1602ÃüÁî¶Ë¿Ú
\r
32 //****************************************
\r
33 // ¶¨ÒåMPU6050ÄÚ²¿µØÖ·
\r
34 //****************************************
\r
35 #define SMPLRT_DIV 0x19 //ÍÓÂÝÒDzÉÑùÂÊ£¬µäÐÍÖµ£º0x07(125Hz)
\r
36 #define CONFIG 0x1A //µÍͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x06(5Hz)
\r
37 #define GYRO_CONFIG 0x1B //ÍÓÂÝÒÇ×Լ켰²âÁ¿·¶Î§£¬µäÐÍÖµ£º0x18(²»×Լ죬2000deg/s)
\r
38 #define ACCEL_CONFIG 0x1C //¼ÓËÙ¼Æ×Լ졢²âÁ¿·¶Î§¼°¸ßͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x01(²»×Լ죬2G£¬5Hz)
\r
39 #define ACCEL_XOUT_H 0x3B
\r
40 #define ACCEL_XOUT_L 0x3C
\r
41 #define ACCEL_YOUT_H 0x3D
\r
42 #define ACCEL_YOUT_L 0x3E
\r
43 #define ACCEL_ZOUT_H 0x3F
\r
44 #define ACCEL_ZOUT_L 0x40
\r
45 #define TEMP_OUT_H 0x41
\r
46 #define TEMP_OUT_L 0x42
\r
47 #define GYRO_XOUT_H 0x43
\r
48 #define GYRO_XOUT_L 0x44
\r
49 #define GYRO_YOUT_H 0x45
\r
50 #define GYRO_YOUT_L 0x46
\r
51 #define GYRO_ZOUT_H 0x47
\r
52 #define GYRO_ZOUT_L 0x48
\r
53 #define PWR_MGMT_1 0x6B //µçÔ´¹ÜÀí£¬µäÐÍÖµ£º0x00(Õý³£ÆôÓÃ)
\r
54 #define WHO_AM_I 0x75 //IICµØÖ·¼Ä´æÆ÷(ĬÈÏÊýÖµ0x68£¬Ö»¶Á)
\r
55 #define SlaveAddress 0xD0 //IICдÈëʱµÄµØÖ·×Ö½ÚÊý¾Ý£¬+1Ϊ¶ÁÈ¡
\r
56 //****************************************
\r
58 //****************************************
\r
59 uchar dis[4]; //ÏÔʾÊý×Ö(-511ÖÁ512)µÄ×Ö·ûÊý×é
\r
60 int dis_data; //±äÁ¿
\r
61 //int Temperature,Temp_h,Temp_l; //ζȼ°¸ßµÍλÊý¾Ý
\r
62 //****************************************
\r
64 //****************************************
\r
65 void delay(unsigned int k); //ÑÓʱ
\r
67 void InitLcd(); //³õʼ»¯lcd1602
\r
68 void lcd_printf(uchar *s,int temp_data);
\r
69 void WriteDataLCM(uchar dataW); //LCDÊý¾Ý
\r
70 void WriteCommandLCM(uchar CMD,uchar Attribc); //LCDÖ¸Áî
\r
71 void DisplayOneChar(uchar X,uchar Y,uchar DData); //ÏÔʾһ¸ö×Ö·û
\r
72 void DisplayListChar(uchar X,uchar Y,uchar *DData,L); //ÏÔʾ×Ö·û´®
\r
74 void InitMPU6050(); //³õʼ»¯MPU6050
\r
78 void I2C_SendACK(bit ack);
\r
80 void I2C_SendByte(uchar dat);
\r
81 uchar I2C_RecvByte();
\r
82 void I2C_ReadPage();
\r
83 void I2C_WritePage();
\r
84 void display_ACCEL_x();
\r
85 void display_ACCEL_y();
\r
86 void display_ACCEL_z();
\r
87 uchar Single_ReadI2C(uchar REG_Address); //¶ÁÈ¡I2CÊý¾Ý
\r
88 void Single_WriteI2C(uchar REG_Address,uchar REG_data); //ÏòI2CдÈëÊý¾Ý
\r
89 //****************************************
\r
91 //****************************************
\r
92 void lcd_printf(uchar *s,int temp_data)
\r
96 temp_data=-temp_data;
\r
100 *++s =temp_data/100+0x30;
\r
101 temp_data=temp_data%100; //È¡ÓàÔËËã
\r
102 *++s =temp_data/10+0x30;
\r
103 temp_data=temp_data%10; //È¡ÓàÔËËã
\r
104 *++s =temp_data+0x30;
\r
106 //****************************************
\r
108 //****************************************
\r
109 void delay(unsigned int k)
\r
114 for(j=0;j<121;j++);
\r
117 //****************************************
\r
119 //****************************************
\r
122 WriteCommandLCM(0x38,1);
\r
123 WriteCommandLCM(0x08,1);
\r
124 WriteCommandLCM(0x01,1);
\r
125 WriteCommandLCM(0x06,1);
\r
126 WriteCommandLCM(0x0c,1);
\r
127 DisplayOneChar(0,0,'A');
\r
128 DisplayOneChar(0,1,'G');
\r
130 //****************************************
\r
132 //****************************************
\r
133 void WaitForEnable(void)
\r
136 LCM_RS=0;LCM_RW=1;_nop_();
\r
137 LCM_EN=1;_nop_();_nop_();
\r
138 while(DataPort&0x80);
\r
141 //****************************************
\r
143 //****************************************
\r
144 void WriteCommandLCM(uchar CMD,uchar Attribc)
\r
146 if(Attribc)WaitForEnable();
\r
147 LCM_RS=0;LCM_RW=0;_nop_();
\r
148 DataPort=CMD;_nop_();
\r
149 LCM_EN=1;_nop_();_nop_();LCM_EN=0;
\r
151 //****************************************
\r
153 //****************************************
\r
154 void WriteDataLCM(uchar dataW)
\r
157 LCM_RS=1;LCM_RW=0;_nop_();
\r
158 DataPort=dataW;_nop_();
\r
159 LCM_EN=1;_nop_();_nop_();LCM_EN=0;
\r
161 //****************************************
\r
162 //LCD1602дÈëÒ»¸ö×Ö·û
\r
163 //****************************************
\r
164 void DisplayOneChar(uchar X,uchar Y,uchar DData)
\r
170 WriteCommandLCM(X,0);
\r
171 WriteDataLCM(DData);
\r
173 //****************************************
\r
174 //LCD1602ÏÔʾ×Ö·û´®
\r
175 //****************************************
\r
176 void DisplayListChar(uchar X,uchar Y,uchar *DData,L)
\r
178 uchar ListLength=0;
\r
183 DisplayOneChar(X,Y,DData[ListLength]);
\r
188 //**************************************
\r
189 //ÑÓʱ5΢Ãë(STC90C52RC@12M)
\r
190 //²»Í¬µÄ¹¤×÷»·¾³,ÐèÒªµ÷Õû´Ëº¯Êý
\r
191 //µ±¸ÄÓÃ1TµÄMCUʱ,Çëµ÷Õû´ËÑÓʱº¯Êý
\r
192 //**************************************
\r
195 _nop_();_nop_();_nop_();_nop_();
\r
196 _nop_();_nop_();_nop_();_nop_();
\r
197 _nop_();_nop_();_nop_();_nop_();
\r
198 _nop_();_nop_();_nop_();_nop_();
\r
199 _nop_();_nop_();_nop_();_nop_();
\r
200 _nop_();_nop_();_nop_();_nop_();
\r
202 //**************************************
\r
204 //**************************************
\r
207 SDA = 1; //À¸ßÊý¾ÝÏß
\r
208 SCL = 1; //À¸ßʱÖÓÏß
\r
210 SDA = 0; //²úÉúϽµÑØ
\r
212 SCL = 0; //ÀµÍʱÖÓÏß
\r
214 //**************************************
\r
216 //**************************************
\r
219 SDA = 0; //ÀµÍÊý¾ÝÏß
\r
220 SCL = 1; //À¸ßʱÖÓÏß
\r
222 SDA = 1; //²úÉúÉÏÉýÑØ
\r
225 //**************************************
\r
227 //Èë¿Ú²ÎÊý:ack (0:ACK 1:NAK)
\r
228 //**************************************
\r
229 void I2C_SendACK(bit ack)
\r
231 SDA = ack; //дӦ´ðÐźÅ
\r
232 SCL = 1; //À¸ßʱÖÓÏß
\r
234 SCL = 0; //ÀµÍʱÖÓÏß
\r
237 //**************************************
\r
239 //**************************************
\r
242 SCL = 1; //À¸ßʱÖÓÏß
\r
244 CY = SDA; //¶ÁÓ¦´ðÐźÅ
\r
245 SCL = 0; //ÀµÍʱÖÓÏß
\r
249 //**************************************
\r
250 //ÏòI2C×ÜÏß·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý
\r
251 //**************************************
\r
252 void I2C_SendByte(uchar dat)
\r
255 for (i=0; i<8; i++) //8λ¼ÆÊýÆ÷
\r
257 dat <<= 1; //ÒƳöÊý¾ÝµÄ×î¸ßλ
\r
258 SDA = CY; //ËÍÊý¾Ý¿Ú
\r
259 SCL = 1; //À¸ßʱÖÓÏß
\r
261 SCL = 0; //ÀµÍʱÖÓÏß
\r
266 //**************************************
\r
267 //´ÓI2C×ÜÏß½ÓÊÕÒ»¸ö×Ö½ÚÊý¾Ý
\r
268 //**************************************
\r
269 uchar I2C_RecvByte()
\r
273 SDA = 1; //ʹÄÜÄÚ²¿ÉÏÀ,×¼±¸¶ÁÈ¡Êý¾Ý,
\r
274 for (i=0; i<8; i++) //8λ¼ÆÊýÆ÷
\r
277 SCL = 1; //À¸ßʱÖÓÏß
\r
279 dat |= SDA; //¶ÁÊý¾Ý
\r
280 SCL = 0; //ÀµÍʱÖÓÏß
\r
285 //**************************************
\r
286 //ÏòI2CÉ豸дÈëÒ»¸ö×Ö½ÚÊý¾Ý
\r
287 //**************************************
\r
288 void Single_WriteI2C(uchar REG_Address,uchar REG_data)
\r
290 I2C_Start(); //ÆðʼÐźÅ
\r
291 I2C_SendByte(SlaveAddress); //·¢ËÍÉ豸µØÖ·+дÐźÅ
\r
292 I2C_SendByte(REG_Address); //ÄÚ²¿¼Ä´æÆ÷µØÖ·£¬
\r
293 I2C_SendByte(REG_data); //ÄÚ²¿¼Ä´æÆ÷Êý¾Ý£¬
\r
294 I2C_Stop(); //·¢ËÍÍ£Ö¹ÐźÅ
\r
296 //**************************************
\r
297 //´ÓI2CÉ豸¶ÁÈ¡Ò»¸ö×Ö½ÚÊý¾Ý
\r
298 //**************************************
\r
299 uchar Single_ReadI2C(uchar REG_Address)
\r
302 I2C_Start(); //ÆðʼÐźÅ
\r
303 I2C_SendByte(SlaveAddress); //·¢ËÍÉ豸µØÖ·+дÐźÅ
\r
304 I2C_SendByte(REG_Address); //·¢ËÍ´æ´¢µ¥ÔªµØÖ·£¬´Ó0¿ªÊ¼
\r
305 I2C_Start(); //ÆðʼÐźÅ
\r
306 I2C_SendByte(SlaveAddress+1); //·¢ËÍÉ豸µØÖ·+¶ÁÐźÅ
\r
307 REG_data=I2C_RecvByte(); //¶Á³ö¼Ä´æÆ÷Êý¾Ý
\r
308 I2C_SendACK(1); //½ÓÊÕÓ¦´ðÐźÅ
\r
309 I2C_Stop(); //Í£Ö¹ÐźÅ
\r
312 //**************************************
\r
314 //**************************************
\r
317 Single_WriteI2C(PWR_MGMT_1, 0x00); //½â³ýÐÝÃß״̬
\r
318 Single_WriteI2C(SMPLRT_DIV, 0x07);
\r
319 Single_WriteI2C(CONFIG, 0x06);
\r
320 Single_WriteI2C(GYRO_CONFIG, 0x18);
\r
321 Single_WriteI2C(ACCEL_CONFIG, 0x01);
\r
323 //**************************************
\r
325 //**************************************
\r
326 int GetData(uchar REG_Address)
\r
329 H=Single_ReadI2C(REG_Address);
\r
330 L=Single_ReadI2C(REG_Address+1);
\r
331 return (H<<8)+L; //ºÏ³ÉÊý¾Ý
\r
333 //**************************************
\r
334 //ÔÚ1602ÉÏÏÔʾ10λÊý¾Ý
\r
335 //**************************************
\r
336 void Display10BitData(int value,uchar x,uchar y)
\r
338 value/=64; //ת»»Îª10λÊý¾Ý
\r
339 lcd_printf(dis, value); //ת»»Êý¾ÝÏÔʾ
\r
340 DisplayListChar(x,y,dis,4); //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾ³¤¶È
\r
342 //**************************************
\r
344 //**************************************
\r
345 //void display_temp()
\r
347 // Temp_h=Single_ReadI2C(TEMP_OUT_H); //¶ÁȡζÈ
\r
348 // Temp_l=Single_ReadI2C(TEMP_OUT_L); //¶ÁȡζÈ
\r
349 // Temperature=Temp_h<<8|Temp_l; //ºÏ³ÉζÈ
\r
350 // Temperature = 35+ ((double) (Temperature + 13200)) / 280; // ¼ÆËã³öζÈ
\r
351 // lcd_printf(dis,Temperature); //ת»»Êý¾ÝÏÔʾ
\r
352 // DisplayListChar(11,1,dis,4); //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾλÊý
\r
354 //*********************************************************
\r
356 //*********************************************************
\r
359 delay(500); //ÉϵçÑÓʱ
\r
360 InitLcd(); //Òº¾§³õʼ»¯
\r
361 InitMPU6050(); //³õʼ»¯MPU6050
\r
365 Display10BitData(GetData(ACCEL_XOUT_H),2,0); //ÏÔʾXÖá¼ÓËÙ¶È
\r
366 Display10BitData(GetData(ACCEL_YOUT_H),7,0); //ÏÔʾYÖá¼ÓËÙ¶È
\r
367 Display10BitData(GetData(ACCEL_ZOUT_H),12,0); //ÏÔʾZÖá¼ÓËÙ¶È
\r
368 Display10BitData(GetData(GYRO_XOUT_H),2,1); //ÏÔʾXÖá½ÇËÙ¶È
\r
369 Display10BitData(GetData(GYRO_YOUT_H),7,1); //ÏÔʾYÖá½ÇËÙ¶È
\r
370 Display10BitData(GetData(GYRO_ZOUT_H),12,1); //ÏÔʾZÖá½ÇËÙ¶È
\r