]> git.piffa.net Git - arduino/blob - sheets/gyro/GY-52 Three-axis gyroscope sending data /Three-axis gyroscope sending data/GY-52 Test program/51MCU-CODE/STC-MPU-3050.txt
first commit
[arduino] / sheets / gyro / GY-52 Three-axis gyroscope sending data / Three-axis gyroscope sending data / GY-52 Test program / 51MCU-CODE / STC-MPU-3050.txt
1 \r
2 //***************************************\r
3 // GY-52 MPU3050 IIC²âÊÔ³ÌÐò\r
4 // Ê¹Óõ¥Æ¬»úSTC89C51 \r
5 // ¾§Õñ£º11.0592M\r
6 // ÏÔʾ£ºLCD1602\r
7 // ±àÒë»·¾³ Keil uVision2\r
8 // ²Î¿¼ºê¾§ÍøÕ¾24c04ͨÐųÌÐò\r
9 // Ê±¼ä£º2011Äê9ÔÂ1ÈÕ\r
10 // QQ£º531389319\r
11 //****************************************\r
12 #include  <REG51.H>     \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
24 \r
25 //¶¨ÒåMPU3050ÄÚ²¿µØÖ·********************\r
26 #define WHO         0x00\r
27 #define SMPL    0x15\r
28 #define DLPF    0x16\r
29 #define INT_C   0x17\r
30 #define INT_S   0x1A\r
31 #define TMP_H   0x1B\r
32 #define TMP_L   0x1C\r
33 #define GX_H    0x1D\r
34 #define GX_L    0x1E\r
35 #define GY_H    0x1F\r
36 #define GY_L    0x20\r
37 #define GZ_H    0x21\r
38 #define GZ_L    0x22\r
39 #define PWR_M   0x3E\r
40 //****************************\r
41 \r
42 #define SlaveAddress   0xD0       //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALT  ADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä\r
43                           \r
44 typedef unsigned char  BYTE;\r
45 typedef unsigned short WORD;\r
46 \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
54 \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
59 \r
60 void  Single_WriteMPU3050(uchar REG_Address,uchar REG_data);   //µ¥¸öдÈëÊý¾Ý\r
61 uchar Single_ReadMPU3050(uchar REG_Address);                   //µ¥¸ö¶ÁÈ¡ÄÚ²¿¼Ä´æÆ÷Êý¾Ý\r
62 \r
63 //****************************************Ä£ÄâIICʹÓú¯Êý\r
64 void Delay5us();\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
74 void display_x();\r
75 void display_y();\r
76 void display_z();\r
77 \r
78 //****************************************\r
79 \r
80 void lcd_printf(uchar *s,int temp_data)\r
81 {\r
82         if(temp_data<0){\r
83         temp_data=-temp_data;\r
84     *s='-';\r
85         }\r
86         else *s=' ';\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
92 }\r
93 \r
94 /*******************************/\r
95 void delay(unsigned int k)      \r
96 {                                               \r
97 unsigned int i,j;                               \r
98 for(i=0;i<k;i++)\r
99 {                       \r
100 for(j=0;j<121;j++)                      \r
101 {;}}                                            \r
102 }\r
103 /*******************************/\r
104 void WaitForEnable(void)        \r
105 {                                       \r
106 DataPort=0xff;          \r
107 LCM_RS=0;LCM_RW=1;_nop_();\r
108 LCM_EN=1;_nop_();_nop_();\r
109 while(DataPort&0x80);   \r
110 LCM_EN=0;                               \r
111 }                                       \r
112 /*******************************/\r
113 void WriteCommandLCM(uchar CMD,uchar Attribc)\r
114 {                                       \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
119 }                                       \r
120 /*******************************/\r
121 void WriteDataLCM(uchar dataW)\r
122 {                                       \r
123 WaitForEnable();                \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
127 }               \r
128 /***********************************/\r
129 void InitLcd()                          \r
130 {                       \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
144 }                       \r
145 /***********************************/\r
146 void DisplayOneChar(uchar X,uchar Y,uchar DData)\r
147 {                                               \r
148 Y&=1;                                           \r
149 X&=15;                                          \r
150 if(Y)X|=0x40;                                   \r
151 X|=0x80;                        \r
152 WriteCommandLCM(X,0);           \r
153 WriteDataLCM(DData);            \r
154 }                                               \r
155 /***********************************/\r
156 void DisplayListChar(uchar X,uchar Y,uchar *DData,L)\r
157 {\r
158 uchar ListLength=0; \r
159 Y&=0x1;                \r
160 X&=0xF;                \r
161 while(L--)             \r
162 {                       \r
163 DisplayOneChar(X,Y,DData[ListLength]);\r
164 ListLength++;  \r
165 X++;                        \r
166 }    \r
167 }\r
168 /**************************************\r
169 ÑÓʱ5΢Ãë(STC90C52RC@12M)\r
170 ²»Í¬µÄ¹¤×÷»·¾³,ÐèÒªµ÷Õû´Ëº¯Êý£¬×¢ÒâʱÖÓ¹ý¿ìʱÐèÒªÐÞ¸Ä\r
171 µ±¸ÄÓÃ1TµÄMCUʱ,Çëµ÷Õû´ËÑÓʱº¯Êý\r
172 **************************************/\r
173 void Delay5us()\r
174 {\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
181 }\r
182 \r
183 /**************************************\r
184 ÆðʼÐźÅ\r
185 **************************************/\r
186 void MPU3050_Start()\r
187 {\r
188     SDA = 1;                    //À­¸ßÊý¾ÝÏß\r
189     SCL = 1;                    //À­¸ßʱÖÓÏß\r
190     Delay5us();                 //ÑÓʱ\r
191     SDA = 0;                    //²úÉúϽµÑØ\r
192     Delay5us();                 //ÑÓʱ\r
193     SCL = 0;                    //À­µÍʱÖÓÏß\r
194 }\r
195 \r
196 /**************************************\r
197 Í£Ö¹ÐźÅ\r
198 **************************************/\r
199 void MPU3050_Stop()\r
200 {\r
201     SDA = 0;                    //À­µÍÊý¾ÝÏß\r
202     SCL = 1;                    //À­¸ßʱÖÓÏß\r
203     Delay5us();                 //ÑÓʱ\r
204     SDA = 1;                    //²úÉúÉÏÉýÑØ\r
205     Delay5us();                 //ÑÓʱ\r
206 }\r
207 \r
208 /**************************************\r
209 ·¢ËÍÓ¦´ðÐźÅ\r
210 Èë¿Ú²ÎÊý:ack (0:ACK 1:NAK)\r
211 **************************************/\r
212 void MPU3050_SendACK(bit ack)\r
213 {\r
214     SDA = ack;                  //дӦ´ðÐźÅ\r
215     SCL = 1;                    //À­¸ßʱÖÓÏß\r
216     Delay5us();                 //ÑÓʱ\r
217     SCL = 0;                    //À­µÍʱÖÓÏß\r
218     Delay5us();                 //ÑÓʱ\r
219 }\r
220 \r
221 /**************************************\r
222 ½ÓÊÕÓ¦´ðÐźÅ\r
223 **************************************/\r
224 bit MPU3050_RecvACK()\r
225 {\r
226     SCL = 1;                    //À­¸ßʱÖÓÏß\r
227     Delay5us();                 //ÑÓʱ\r
228     CY = SDA;                   //¶ÁÓ¦´ðÐźÅ\r
229     SCL = 0;                    //À­µÍʱÖÓÏß\r
230     Delay5us();                 //ÑÓʱ\r
231 \r
232     return CY;\r
233 }\r
234 \r
235 /**************************************\r
236 ÏòIIC×ÜÏß·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý\r
237 **************************************/\r
238 void MPU3050_SendByte(BYTE dat)\r
239 {\r
240     BYTE i;\r
241 \r
242     for (i=0; i<8; i++)         //8λ¼ÆÊýÆ÷\r
243     {\r
244         dat <<= 1;              //ÒƳöÊý¾ÝµÄ×î¸ßλ\r
245         SDA = CY;               //ËÍÊý¾Ý¿Ú\r
246         SCL = 1;                //À­¸ßʱÖÓÏß\r
247         Delay5us();             //ÑÓʱ\r
248         SCL = 0;                //À­µÍʱÖÓÏß\r
249         Delay5us();             //ÑÓʱ\r
250     }\r
251     MPU3050_RecvACK();\r
252 }\r
253 \r
254 /**************************************\r
255 ´ÓIIC×ÜÏß½ÓÊÕÒ»¸ö×Ö½ÚÊý¾Ý\r
256 **************************************/\r
257 BYTE MPU3050_RecvByte()\r
258 {\r
259     BYTE i;\r
260     BYTE dat = 0;\r
261 \r
262     SDA = 1;                    //ʹÄÜÄÚ²¿ÉÏÀ­,×¼±¸¶ÁÈ¡Êý¾Ý,\r
263     for (i=0; i<8; i++)         //8λ¼ÆÊýÆ÷\r
264     {\r
265         dat <<= 1;\r
266         SCL = 1;                //À­¸ßʱÖÓÏß\r
267         Delay5us();             //ÑÓʱ\r
268         dat |= SDA;             //¶ÁÊý¾Ý               \r
269         SCL = 0;                //À­µÍʱÖÓÏß\r
270         Delay5us();             //ÑÓʱ\r
271     }\r
272     return dat;\r
273 }\r
274 \r
275 //µ¥×Ö½ÚдÈë*******************************************\r
276 \r
277 void Single_WriteMPU3050(uchar REG_Address,uchar REG_data)\r
278 {\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
284 }\r
285 \r
286 //µ¥×Ö½Ú¶ÁÈ¡*****************************************\r
287 uchar Single_ReadMPU3050(uchar REG_Address)\r
288 {  uchar REG_data;\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
297     return REG_data; \r
298 }\r
299 \r
300 //³õʼ»¯MPU3050£¬¸ù¾ÝÐèÒªÇë²Î¿¼pdf½øÐÐÐÞ¸Ä************************\r
301 void InitMPU3050()\r
302 {\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
308 }\r
309 //***********************************************************************\r
310 //ÏÔʾxÖá\r
311 void display_x()\r
312 {  \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
319 }\r
320 \r
321 //***********************************************************************\r
322 //ÏÔʾyÖá\r
323 void display_y()\r
324 {    \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
331 }\r
332 \r
333 //***********************************************************************\r
334 //ÏÔʾzÖá\r
335 void display_z()\r
336\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
343 }\r
344 \r
345 //***********************************************************************\r
346 //ÏÔʾζÈ\r
347 void display_temp()\r
348\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
355 }\r
356 \r
357 //*********************************************************\r
358 //******Ö÷³ÌÐò********\r
359 //*********************************************************\r
360 void main()\r
361\r
362   delay(500);                      //ÉϵçÑÓʱ           \r
363   InitLcd();                       //Òº¾§³õʼ»¯\r
364   InitMPU3050();                   //³õʼ»¯MPU3050\r
365   delay(50);\r
366   while(1)                         //Ñ­»·\r
367   {   \r
368     display_x();                   //---------ÏÔʾXÖá\r
369     display_y();                   //---------ÏÔʾYÖá\r
370     display_z();                   //---------ÏÔʾZÖá\r
371     display_temp();                //---------ÏÔʾζÈ\r
372     delay(100);                    //ÑÓʱ            \r
373   }\r
374