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[6]; //ÏÔʾÊý×Ö(-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
66 void lcd_printf(uchar *s,int temp_data);
\r
69 void InitMPU6050(); //³õʼ»¯MPU6050
\r
73 void I2C_SendACK(bit ack);
\r
75 void I2C_SendByte(uchar dat);
\r
76 uchar I2C_RecvByte();
\r
77 void I2C_ReadPage();
\r
78 void I2C_WritePage();
\r
79 void display_ACCEL_x();
\r
80 void display_ACCEL_y();
\r
81 void display_ACCEL_z();
\r
82 uchar Single_ReadI2C(uchar REG_Address); //¶ÁÈ¡I2CÊý¾Ý
\r
83 void Single_WriteI2C(uchar REG_Address,uchar REG_data); //ÏòI2CдÈëÊý¾Ý
\r
84 //****************************************
\r
86 //****************************************
\r
87 void lcd_printf(uchar *s,int temp_data)
\r
91 temp_data=-temp_data;
\r
96 *++s =temp_data/10000+0x30;
\r
97 temp_data=temp_data%10000; //È¡ÓàÔËËã
\r
99 *++s =temp_data/1000+0x30;
\r
100 temp_data=temp_data%1000; //È¡ÓàÔËËã
\r
102 *++s =temp_data/100+0x30;
\r
103 temp_data=temp_data%100; //È¡ÓàÔËËã
\r
104 *++s =temp_data/10+0x30;
\r
105 temp_data=temp_data%10; //È¡ÓàÔËËã
\r
106 *++s =temp_data+0x30;
\r
108 //****************************************
\r
110 void SeriPushSend(uchar send_data)
\r
115 //****************************************
\r
117 //****************************************
\r
118 void delay(unsigned int k)
\r
123 for(j=0;j<121;j++);
\r
127 //**************************************
\r
128 //ÑÓʱ5΢Ãë(STC90C52RC@12M)
\r
129 //²»Í¬µÄ¹¤×÷»·¾³,ÐèÒªµ÷Õû´Ëº¯Êý
\r
130 //µ±¸ÄÓÃ1TµÄMCUʱ,Çëµ÷Õû´ËÑÓʱº¯Êý
\r
131 //**************************************
\r
134 _nop_();_nop_();_nop_();_nop_();
\r
135 _nop_();_nop_();_nop_();_nop_();
\r
136 _nop_();_nop_();_nop_();_nop_();
\r
137 _nop_();_nop_();_nop_();_nop_();
\r
138 _nop_();_nop_();_nop_();_nop_();
\r
139 _nop_();_nop_();_nop_();_nop_();
\r
141 //**************************************
\r
143 //**************************************
\r
146 SDA = 1; //À¸ßÊý¾ÝÏß
\r
147 SCL = 1; //À¸ßʱÖÓÏß
\r
149 SDA = 0; //²úÉúϽµÑØ
\r
151 SCL = 0; //ÀµÍʱÖÓÏß
\r
153 //**************************************
\r
155 //**************************************
\r
158 SDA = 0; //ÀµÍÊý¾ÝÏß
\r
159 SCL = 1; //À¸ßʱÖÓÏß
\r
161 SDA = 1; //²úÉúÉÏÉýÑØ
\r
164 //**************************************
\r
166 //Èë¿Ú²ÎÊý:ack (0:ACK 1:NAK)
\r
167 //**************************************
\r
168 void I2C_SendACK(bit ack)
\r
170 SDA = ack; //дӦ´ðÐźÅ
\r
171 SCL = 1; //À¸ßʱÖÓÏß
\r
173 SCL = 0; //ÀµÍʱÖÓÏß
\r
176 //**************************************
\r
178 //**************************************
\r
181 SCL = 1; //À¸ßʱÖÓÏß
\r
183 CY = SDA; //¶ÁÓ¦´ðÐźÅ
\r
184 SCL = 0; //ÀµÍʱÖÓÏß
\r
188 //**************************************
\r
189 //ÏòI2C×ÜÏß·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý
\r
190 //**************************************
\r
191 void I2C_SendByte(uchar dat)
\r
194 for (i=0; i<8; i++) //8λ¼ÆÊýÆ÷
\r
196 dat <<= 1; //ÒƳöÊý¾ÝµÄ×î¸ßλ
\r
197 SDA = CY; //ËÍÊý¾Ý¿Ú
\r
198 SCL = 1; //À¸ßʱÖÓÏß
\r
200 SCL = 0; //ÀµÍʱÖÓÏß
\r
205 //**************************************
\r
206 //´ÓI2C×ÜÏß½ÓÊÕÒ»¸ö×Ö½ÚÊý¾Ý
\r
207 //**************************************
\r
208 uchar I2C_RecvByte()
\r
212 SDA = 1; //ʹÄÜÄÚ²¿ÉÏÀ,×¼±¸¶ÁÈ¡Êý¾Ý,
\r
213 for (i=0; i<8; i++) //8λ¼ÆÊýÆ÷
\r
216 SCL = 1; //À¸ßʱÖÓÏß
\r
218 dat |= SDA; //¶ÁÊý¾Ý
\r
219 SCL = 0; //ÀµÍʱÖÓÏß
\r
224 //**************************************
\r
225 //ÏòI2CÉ豸дÈëÒ»¸ö×Ö½ÚÊý¾Ý
\r
226 //**************************************
\r
227 void Single_WriteI2C(uchar REG_Address,uchar REG_data)
\r
229 I2C_Start(); //ÆðʼÐźÅ
\r
230 I2C_SendByte(SlaveAddress); //·¢ËÍÉ豸µØÖ·+дÐźÅ
\r
231 I2C_SendByte(REG_Address); //ÄÚ²¿¼Ä´æÆ÷µØÖ·£¬
\r
232 I2C_SendByte(REG_data); //ÄÚ²¿¼Ä´æÆ÷Êý¾Ý£¬
\r
233 I2C_Stop(); //·¢ËÍÍ£Ö¹ÐźÅ
\r
235 //**************************************
\r
236 //´ÓI2CÉ豸¶ÁÈ¡Ò»¸ö×Ö½ÚÊý¾Ý
\r
237 //**************************************
\r
238 uchar Single_ReadI2C(uchar REG_Address)
\r
241 I2C_Start(); //ÆðʼÐźÅ
\r
242 I2C_SendByte(SlaveAddress); //·¢ËÍÉ豸µØÖ·+дÐźÅ
\r
243 I2C_SendByte(REG_Address); //·¢ËÍ´æ´¢µ¥ÔªµØÖ·£¬´Ó0¿ªÊ¼
\r
244 I2C_Start(); //ÆðʼÐźÅ
\r
245 I2C_SendByte(SlaveAddress+1); //·¢ËÍÉ豸µØÖ·+¶ÁÐźÅ
\r
246 REG_data=I2C_RecvByte(); //¶Á³ö¼Ä´æÆ÷Êý¾Ý
\r
247 I2C_SendACK(1); //½ÓÊÕÓ¦´ðÐźÅ
\r
248 I2C_Stop(); //Í£Ö¹ÐźÅ
\r
251 //**************************************
\r
253 //**************************************
\r
256 Single_WriteI2C(PWR_MGMT_1, 0x00); //½â³ýÐÝÃß״̬
\r
257 Single_WriteI2C(SMPLRT_DIV, 0x07);
\r
258 Single_WriteI2C(CONFIG, 0x06);
\r
259 Single_WriteI2C(GYRO_CONFIG, 0x18);
\r
260 Single_WriteI2C(ACCEL_CONFIG, 0x01);
\r
262 //**************************************
\r
264 //**************************************
\r
265 int GetData(uchar REG_Address)
\r
268 H=Single_ReadI2C(REG_Address);
\r
269 L=Single_ReadI2C(REG_Address+1);
\r
270 return (H<<8)+L; //ºÏ³ÉÊý¾Ý
\r
272 //**************************************
\r
273 //ÔÚ1602ÉÏÏÔʾ10λÊý¾Ý
\r
274 //**************************************
\r
275 void Display10BitData(int value,uchar x,uchar y)
\r
277 // value/=64; //ת»»Îª10λÊý¾Ý
\r
278 lcd_printf(dis, value); //ת»»Êý¾ÝÏÔʾ
\r
281 SeriPushSend(dis[i]);
\r
284 // DisplayListChar(x,y,dis,4); //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾ³¤¶È
\r
286 //**************************************
\r
288 //**************************************
\r
289 //void display_temp()
\r
291 // Temp_h=Single_ReadI2C(TEMP_OUT_H); //¶ÁȡζÈ
\r
292 // Temp_l=Single_ReadI2C(TEMP_OUT_L); //¶ÁȡζÈ
\r
293 // Temperature=Temp_h<<8|Temp_l; //ºÏ³ÉζÈ
\r
294 // Temperature = 35+ ((double) (Temperature + 13200)) / 280; // ¼ÆËã³öζÈ
\r
295 // lcd_printf(dis,Temperature); //ת»»Êý¾ÝÏÔʾ
\r
296 // DisplayListChar(11,1,dis,4); //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾλÊý
\r
306 PS=1; //´®¿ÚÖжÏÉèΪ¸ßÓÅÏȼ¶±ð
\r
307 TR0=1; //Æô¶¯¶¨Ê±Æ÷
\r
309 ET0=1; //´ò¿ª¶¨Ê±Æ÷0ÖжÏ
\r
314 //*********************************************************
\r
316 //*********************************************************
\r
319 delay(500); //ÉϵçÑÓʱ
\r
320 // InitLcd(); //Òº¾§³õʼ»¯
\r
322 InitMPU6050(); //³õʼ»¯MPU6050
\r
327 Display10BitData(GetData(ACCEL_XOUT_H),2,0); //ÏÔʾXÖá¼ÓËÙ¶È
\r
328 Display10BitData(GetData(ACCEL_YOUT_H),7,0); //ÏÔʾYÖá¼ÓËÙ¶È
\r
329 Display10BitData(GetData(ACCEL_ZOUT_H),12,0); //ÏÔʾZÖá¼ÓËÙ¶È
\r
330 Display10BitData(GetData(GYRO_XOUT_H),2,1); //ÏÔʾXÖá½ÇËÙ¶È
\r
331 Display10BitData(GetData(GYRO_YOUT_H),7,1); //ÏÔʾYÖá½ÇËÙ¶È
\r
332 Display10BitData(GetData(GYRO_ZOUT_H),12,1); //ÏÔʾZÖá½ÇËÙ¶È
\r
334 SeriPushSend(0x0d);
\r
335 SeriPushSend(0x0a);//»»ÐУ¬»Ø³µ
\r