2 //***************************************
\r
3 // GY-52 MPU3050 IIC²âÊÔ³ÌÐò
\r
4 // ʹÓõ¥Æ¬»úSTC89C51
\r
7 // ±àÒë»·¾³ Keil uVision2
\r
8 // ²Î¿¼ºê¾§ÍøÕ¾24c04ͨÐųÌÐò
\r
9 // ʱ¼ä£º2011Äê9ÔÂ1ÈÕ
\r
11 //****************************************
\r
13 #include <math.h> //Keil library
\r
14 #include <stdio.h> //Keil library
\r
15 #include <INTRINS.H>
\r
16 #define uchar unsigned char
\r
17 #define uint unsigned int
\r
18 #define DataPort P0 //LCD1602Êý¾Ý¶Ë¿Ú
\r
19 sbit SCL=P1^0; //IICʱÖÓÒý½Å¶¨Òå
\r
20 sbit SDA=P1^1; //IICÊý¾ÝÒý½Å¶¨Òå
\r
21 sbit LCM_RS=P2^0; //LCD1602ÃüÁî¶Ë¿Ú
\r
22 sbit LCM_RW=P2^1; //LCD1602ÃüÁî¶Ë¿Ú
\r
23 sbit LCM_EN=P2^2; //LCD1602ÃüÁî¶Ë¿Ú
\r
25 //¶¨ÒåMPU3050ÄÚ²¿µØÖ·********************
\r
40 //****************************
\r
42 #define SlaveAddress 0xD0 //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALT ADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä
\r
44 typedef unsigned char BYTE;
\r
45 typedef unsigned short WORD;
\r
47 uchar dis[4]; //ÏÔʾÊý×é
\r
48 BYTE BUF[8]; //½ÓÊÕÊý¾Ý»º´æÇø
\r
49 int dis_data; //±äÁ¿
\r
50 int Temperature,Temp_h,Temp_l;
\r
51 void delay(unsigned int k);
\r
52 void InitLcd(); //³õʼ»¯lcd1602
\r
53 void InitMPU3050(); //³õʼ»¯MPU3050
\r
55 void WriteDataLCM(uchar dataW);
\r
56 void WriteCommandLCM(uchar CMD,uchar Attribc);
\r
57 void DisplayOneChar(uchar X,uchar Y,uchar DData);
\r
58 void DisplayListChar(uchar X,uchar Y,uchar *DData,L);
\r
60 void Single_WriteMPU3050(uchar REG_Address,uchar REG_data); //µ¥¸öдÈëÊý¾Ý
\r
61 uchar Single_ReadMPU3050(uchar REG_Address); //µ¥¸ö¶ÁÈ¡ÄÚ²¿¼Ä´æÆ÷Êý¾Ý
\r
63 //****************************************Ä£ÄâIICʹÓú¯Êý
\r
65 void MPU3050_Start();
\r
66 void MPU3050_Stop();
\r
67 void MPU3050_SendACK(bit ack);
\r
68 bit MPU3050_RecvACK();
\r
69 void MPU3050_SendByte(BYTE dat);
\r
70 BYTE MPU3050_RecvByte();
\r
71 void MPU3050_ReadPage();
\r
72 void MPU3050_WritePage();
\r
73 //****************************************
\r
78 //****************************************
\r
80 void lcd_printf(uchar *s,int temp_data)
\r
83 temp_data=-temp_data;
\r
87 *++s =temp_data/100+0x30;
\r
88 temp_data=temp_data%100; //È¡ÓàÔËËã
\r
89 *++s =temp_data/10+0x30;
\r
90 temp_data=temp_data%10; //È¡ÓàÔËËã
\r
91 *++s =temp_data+0x30;
\r
94 /*******************************/
\r
95 void delay(unsigned int k)
\r
100 for(j=0;j<121;j++)
\r
103 /*******************************/
\r
104 void WaitForEnable(void)
\r
107 LCM_RS=0;LCM_RW=1;_nop_();
\r
108 LCM_EN=1;_nop_();_nop_();
\r
109 while(DataPort&0x80);
\r
112 /*******************************/
\r
113 void WriteCommandLCM(uchar CMD,uchar Attribc)
\r
115 if(Attribc)WaitForEnable();
\r
116 LCM_RS=0;LCM_RW=0;_nop_();
\r
117 DataPort=CMD;_nop_();
\r
118 LCM_EN=1;_nop_();_nop_();LCM_EN=0;
\r
120 /*******************************/
\r
121 void WriteDataLCM(uchar dataW)
\r
124 LCM_RS=1;LCM_RW=0;_nop_();
\r
125 DataPort=dataW;_nop_();
\r
126 LCM_EN=1;_nop_();_nop_();LCM_EN=0;
\r
128 /***********************************/
\r
131 WriteCommandLCM(0x38,1);
\r
132 WriteCommandLCM(0x08,1);
\r
133 WriteCommandLCM(0x01,1);
\r
134 WriteCommandLCM(0x06,1);
\r
135 WriteCommandLCM(0x0c,1);
\r
136 DisplayOneChar(0,0,'x');
\r
137 DisplayOneChar(1,0,':');
\r
138 DisplayOneChar(0,1,'y');
\r
139 DisplayOneChar(1,1,':');
\r
140 DisplayOneChar(9,0,'z');
\r
141 DisplayOneChar(10,0,':');
\r
142 DisplayOneChar(9,1,'T');
\r
143 DisplayOneChar(10,1,':');
\r
145 /***********************************/
\r
146 void DisplayOneChar(uchar X,uchar Y,uchar DData)
\r
152 WriteCommandLCM(X,0);
\r
153 WriteDataLCM(DData);
\r
155 /***********************************/
\r
156 void DisplayListChar(uchar X,uchar Y,uchar *DData,L)
\r
158 uchar ListLength=0;
\r
163 DisplayOneChar(X,Y,DData[ListLength]);
\r
168 /**************************************
\r
169 ÑÓʱ5΢Ãë(STC90C52RC@12M)
\r
170 ²»Í¬µÄ¹¤×÷»·¾³,ÐèÒªµ÷Õû´Ëº¯Êý£¬×¢ÒâʱÖÓ¹ý¿ìʱÐèÒªÐÞ¸Ä
\r
171 µ±¸ÄÓÃ1TµÄMCUʱ,Çëµ÷Õû´ËÑÓʱº¯Êý
\r
172 **************************************/
\r
175 _nop_();_nop_();_nop_();_nop_();
\r
176 _nop_();_nop_();_nop_();_nop_();
\r
177 _nop_();_nop_();_nop_();_nop_();
\r
178 _nop_();_nop_();_nop_();_nop_();
\r
179 _nop_();_nop_();_nop_();_nop_();
\r
180 _nop_();_nop_();_nop_();_nop_();
\r
183 /**************************************
\r
185 **************************************/
\r
186 void MPU3050_Start()
\r
188 SDA = 1; //À¸ßÊý¾ÝÏß
\r
189 SCL = 1; //À¸ßʱÖÓÏß
\r
191 SDA = 0; //²úÉúϽµÑØ
\r
193 SCL = 0; //ÀµÍʱÖÓÏß
\r
196 /**************************************
\r
198 **************************************/
\r
199 void MPU3050_Stop()
\r
201 SDA = 0; //ÀµÍÊý¾ÝÏß
\r
202 SCL = 1; //À¸ßʱÖÓÏß
\r
204 SDA = 1; //²úÉúÉÏÉýÑØ
\r
208 /**************************************
\r
210 Èë¿Ú²ÎÊý:ack (0:ACK 1:NAK)
\r
211 **************************************/
\r
212 void MPU3050_SendACK(bit ack)
\r
214 SDA = ack; //дӦ´ðÐźÅ
\r
215 SCL = 1; //À¸ßʱÖÓÏß
\r
217 SCL = 0; //ÀµÍʱÖÓÏß
\r
221 /**************************************
\r
223 **************************************/
\r
224 bit MPU3050_RecvACK()
\r
226 SCL = 1; //À¸ßʱÖÓÏß
\r
228 CY = SDA; //¶ÁÓ¦´ðÐźÅ
\r
229 SCL = 0; //ÀµÍʱÖÓÏß
\r
235 /**************************************
\r
236 ÏòIIC×ÜÏß·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý
\r
237 **************************************/
\r
238 void MPU3050_SendByte(BYTE dat)
\r
242 for (i=0; i<8; i++) //8λ¼ÆÊýÆ÷
\r
244 dat <<= 1; //ÒƳöÊý¾ÝµÄ×î¸ßλ
\r
245 SDA = CY; //ËÍÊý¾Ý¿Ú
\r
246 SCL = 1; //À¸ßʱÖÓÏß
\r
248 SCL = 0; //ÀµÍʱÖÓÏß
\r
254 /**************************************
\r
255 ´ÓIIC×ÜÏß½ÓÊÕÒ»¸ö×Ö½ÚÊý¾Ý
\r
256 **************************************/
\r
257 BYTE MPU3050_RecvByte()
\r
262 SDA = 1; //ʹÄÜÄÚ²¿ÉÏÀ,×¼±¸¶ÁÈ¡Êý¾Ý,
\r
263 for (i=0; i<8; i++) //8λ¼ÆÊýÆ÷
\r
266 SCL = 1; //À¸ßʱÖÓÏß
\r
268 dat |= SDA; //¶ÁÊý¾Ý
\r
269 SCL = 0; //ÀµÍʱÖÓÏß
\r
275 //µ¥×Ö½ÚдÈë*******************************************
\r
277 void Single_WriteMPU3050(uchar REG_Address,uchar REG_data)
\r
279 MPU3050_Start(); //ÆðʼÐźÅ
\r
280 MPU3050_SendByte(SlaveAddress); //·¢ËÍÉ豸µØÖ·+дÐźÅ
\r
281 MPU3050_SendByte(REG_Address); //ÄÚ²¿¼Ä´æÆ÷µØÖ·£¬
\r
282 MPU3050_SendByte(REG_data); //ÄÚ²¿¼Ä´æÆ÷Êý¾Ý£¬
\r
283 MPU3050_Stop(); //·¢ËÍÍ£Ö¹ÐźÅ
\r
286 //µ¥×Ö½Ú¶ÁÈ¡*****************************************
\r
287 uchar Single_ReadMPU3050(uchar REG_Address)
\r
289 MPU3050_Start(); //ÆðʼÐźÅ
\r
290 MPU3050_SendByte(SlaveAddress); //·¢ËÍÉ豸µØÖ·+дÐźÅ
\r
291 MPU3050_SendByte(REG_Address); //·¢ËÍ´æ´¢µ¥ÔªµØÖ·£¬´Ó0¿ªÊ¼
\r
292 MPU3050_Start(); //ÆðʼÐźÅ
\r
293 MPU3050_SendByte(SlaveAddress+1); //·¢ËÍÉ豸µØÖ·+¶ÁÐźÅ
\r
294 REG_data=MPU3050_RecvByte(); //¶Á³ö¼Ä´æÆ÷Êý¾Ý
\r
295 MPU3050_SendACK(1);
\r
296 MPU3050_Stop(); //Í£Ö¹ÐźÅ
\r
300 //³õʼ»¯MPU3050£¬¸ù¾ÝÐèÒªÇë²Î¿¼pdf½øÐÐÐÞ¸Ä************************
\r
303 Single_WriteMPU3050(PWR_M, 0x80); //
\r
304 Single_WriteMPU3050(SMPL, 0x07); //
\r
305 Single_WriteMPU3050(DLPF, 0x1E); //¡À2000¡ã
\r
306 Single_WriteMPU3050(INT_C, 0x00 ); //
\r
307 Single_WriteMPU3050(PWR_M, 0x00); //
\r
309 //***********************************************************************
\r
313 BUF[0]= Single_ReadMPU3050(GX_L);
\r
314 BUF[1]= Single_ReadMPU3050(GX_H);
\r
315 dis_data=(BUF[1]<<8)+BUF[0]; //ºÏ³ÉÊý¾Ý
\r
316 dis_data/=16.4; //¼ÆËã¶ÔÓ¦ ¶È/Ãë
\r
317 lcd_printf(dis, dis_data); //ת»»Êý¾ÝÏÔʾ
\r
318 DisplayListChar(2,0,dis,4); //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾ³¤¶È
\r
321 //***********************************************************************
\r
325 BUF[2]= Single_ReadMPU3050(GY_L);
\r
326 BUF[3]= Single_ReadMPU3050(GY_H);
\r
327 dis_data=(BUF[3]<<8)+BUF[2]; //ºÏ³ÉÊý¾Ý
\r
328 dis_data/=16.4; //¼ÆËã¶ÔÓ¦ ¶È/Ãë
\r
329 lcd_printf(dis, dis_data); //ת»»Êý¾ÝÏÔʾ
\r
330 DisplayListChar(2,1,dis,4); //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾλÊý
\r
333 //***********************************************************************
\r
337 BUF[4]= Single_ReadMPU3050(GZ_L);
\r
338 BUF[5]= Single_ReadMPU3050(GZ_H);
\r
339 dis_data=(BUF[5]<<8)+BUF[4]; //ºÏ³ÉÊý¾Ý
\r
340 dis_data/=16.4; //¼ÆËã¶ÔÓ¦ ¶È/Ãë
\r
341 lcd_printf(dis, dis_data); //ת»»Êý¾ÝÏÔʾ
\r
342 DisplayListChar(11,0,dis,4); //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾλÊý
\r
345 //***********************************************************************
\r
347 void display_temp()
\r
349 Temp_h=Single_ReadMPU3050(TMP_H); //¶ÁȡζÈ
\r
350 Temp_l=Single_ReadMPU3050(TMP_L); //¶ÁȡζÈ
\r
351 Temperature=Temp_h<<8|Temp_l; //ºÏ³ÉζÈ
\r
352 Temperature = 35+ ((double) (Temperature + 13200)) / 280; // ¼ÆËã³öζÈ
\r
353 lcd_printf(dis,Temperature); //ת»»Êý¾ÝÏÔʾ
\r
354 DisplayListChar(11,1,dis,4); //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾλÊý
\r
357 //*********************************************************
\r
358 //******Ö÷³ÌÐò********
\r
359 //*********************************************************
\r
362 delay(500); //ÉϵçÑÓʱ
\r
363 InitLcd(); //Òº¾§³õʼ»¯
\r
364 InitMPU3050(); //³õʼ»¯MPU3050
\r
368 display_x(); //---------ÏÔʾXÖá
\r
369 display_y(); //---------ÏÔʾYÖá
\r
370 display_z(); //---------ÏÔʾZÖá
\r
371 display_temp(); //---------ÏÔʾζÈ
\r
372 delay(100); //ÑÓʱ
\r