]> git.piffa.net Git - arduino/blob - sheets/gyro/Test program/51-coed/51-serial-mpu6050.c
reorder
[arduino] / sheets / gyro / Test program / 51-coed / 51-serial-mpu6050.c
1 //****************************************\r
2 // Update to MPU6050 by shinetop\r
3 // MCU: STC89C52\r
4 // 2012.3.1\r
5 // ¹¦ÄÜ: ÏÔʾ¼ÓËٶȼƺÍÍÓÂÝÒǵÄ10λԭʼÊý¾Ý\r
6 //****************************************\r
7 // GY-52 MPU3050 IIC²âÊÔ³ÌÐò\r
8 // Ê¹Óõ¥Æ¬»úSTC89C51 \r
9 // ¾§Õñ£º11.0592M\r
10 // ÏÔʾ£ºLCD1602\r
11 // ±àÒë»·¾³ Keil uVision2\r
12 // ²Î¿¼ºê¾§ÍøÕ¾24c04ͨÐųÌÐò\r
13 // Ê±¼ä£º2011Äê9ÔÂ1ÈÕ\r
14 // QQ£º531389319\r
15 //****************************************\r
16 #include <REG52.H>      \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
24 // ¶¨Òå51µ¥Æ¬»ú¶Ë¿Ú\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
57 //¶¨ÒåÀàÐͼ°±äÁ¿\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
63 //º¯ÊýÉùÃ÷\r
64 //****************************************\r
65 void  delay(unsigned int k);                                                                            //ÑÓʱ                                          \r
66 void  lcd_printf(uchar *s,int temp_data);\r
67 \r
68 //MPU6050²Ù×÷º¯Êý\r
69 void  InitMPU6050();                                                                                                    //³õʼ»¯MPU6050\r
70 void  Delay5us();\r
71 void  I2C_Start();\r
72 void  I2C_Stop();\r
73 void  I2C_SendACK(bit ack);\r
74 bit   I2C_RecvACK();\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
85 //ÕûÊýת×Ö·û´®\r
86 //****************************************\r
87 void lcd_printf(uchar *s,int temp_data)\r
88 {\r
89         if(temp_data<0)\r
90         {\r
91                 temp_data=-temp_data;\r
92                 *s='-';\r
93         }\r
94         else *s=' ';\r
95 \r
96         *++s =temp_data/10000+0x30;\r
97         temp_data=temp_data%10000;     //È¡ÓàÔËËã\r
98 \r
99         *++s =temp_data/1000+0x30;\r
100         temp_data=temp_data%1000;     //È¡ÓàÔËËã\r
101 \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
107 }\r
108 //****************************************\r
109 \r
110 void  SeriPushSend(uchar send_data)\r
111 {\r
112     SBUF=send_data;  \r
113         while(!TI);TI=0;          \r
114 }\r
115 //****************************************\r
116 //ÑÓʱ\r
117 //****************************************\r
118 void delay(unsigned int k)      \r
119 {                                               \r
120         unsigned int i,j;                               \r
121         for(i=0;i<k;i++)\r
122         {                       \r
123                 for(j=0;j<121;j++);\r
124         }                                               \r
125 }\r
126 \r
127 //**************************************\r
128 //ÑÓʱ5΢Ãë(STC90C52RC@12M)\r
129 //²»Í¬µÄ¹¤×÷»·¾³,ÐèÒªµ÷Õû´Ëº¯Êý\r
130 //µ±¸ÄÓÃ1TµÄMCUʱ,Çëµ÷Õû´ËÑÓʱº¯Êý\r
131 //**************************************\r
132 void Delay5us()\r
133 {\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
140 }\r
141 //**************************************\r
142 //I2CÆðʼÐźÅ\r
143 //**************************************\r
144 void I2C_Start()\r
145 {\r
146     SDA = 1;                    //À­¸ßÊý¾ÝÏß\r
147     SCL = 1;                    //À­¸ßʱÖÓÏß\r
148     Delay5us();                 //ÑÓʱ\r
149     SDA = 0;                    //²úÉúϽµÑØ\r
150     Delay5us();                 //ÑÓʱ\r
151     SCL = 0;                    //À­µÍʱÖÓÏß\r
152 }\r
153 //**************************************\r
154 //I2CÍ£Ö¹ÐźÅ\r
155 //**************************************\r
156 void I2C_Stop()\r
157 {\r
158     SDA = 0;                    //À­µÍÊý¾ÝÏß\r
159     SCL = 1;                    //À­¸ßʱÖÓÏß\r
160     Delay5us();                 //ÑÓʱ\r
161     SDA = 1;                    //²úÉúÉÏÉýÑØ\r
162     Delay5us();                 //ÑÓʱ\r
163 }\r
164 //**************************************\r
165 //I2C·¢ËÍÓ¦´ðÐźÅ\r
166 //Èë¿Ú²ÎÊý:ack (0:ACK 1:NAK)\r
167 //**************************************\r
168 void I2C_SendACK(bit ack)\r
169 {\r
170     SDA = ack;                  //дӦ´ðÐźÅ\r
171     SCL = 1;                    //À­¸ßʱÖÓÏß\r
172     Delay5us();                 //ÑÓʱ\r
173     SCL = 0;                    //À­µÍʱÖÓÏß\r
174     Delay5us();                 //ÑÓʱ\r
175 }\r
176 //**************************************\r
177 //I2C½ÓÊÕÓ¦´ðÐźÅ\r
178 //**************************************\r
179 bit I2C_RecvACK()\r
180 {\r
181     SCL = 1;                    //À­¸ßʱÖÓÏß\r
182     Delay5us();                 //ÑÓʱ\r
183     CY = SDA;                   //¶ÁÓ¦´ðÐźÅ\r
184     SCL = 0;                    //À­µÍʱÖÓÏß\r
185     Delay5us();                 //ÑÓʱ\r
186     return CY;\r
187 }\r
188 //**************************************\r
189 //ÏòI2C×ÜÏß·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý\r
190 //**************************************\r
191 void I2C_SendByte(uchar dat)\r
192 {\r
193     uchar i;\r
194     for (i=0; i<8; i++)         //8λ¼ÆÊýÆ÷\r
195     {\r
196         dat <<= 1;              //ÒƳöÊý¾ÝµÄ×î¸ßλ\r
197         SDA = CY;               //ËÍÊý¾Ý¿Ú\r
198         SCL = 1;                //À­¸ßʱÖÓÏß\r
199         Delay5us();             //ÑÓʱ\r
200         SCL = 0;                //À­µÍʱÖÓÏß\r
201         Delay5us();             //ÑÓʱ\r
202     }\r
203     I2C_RecvACK();\r
204 }\r
205 //**************************************\r
206 //´ÓI2C×ÜÏß½ÓÊÕÒ»¸ö×Ö½ÚÊý¾Ý\r
207 //**************************************\r
208 uchar I2C_RecvByte()\r
209 {\r
210     uchar i;\r
211     uchar dat = 0;\r
212     SDA = 1;                    //ʹÄÜÄÚ²¿ÉÏÀ­,×¼±¸¶ÁÈ¡Êý¾Ý,\r
213     for (i=0; i<8; i++)         //8λ¼ÆÊýÆ÷\r
214     {\r
215         dat <<= 1;\r
216         SCL = 1;                //À­¸ßʱÖÓÏß\r
217         Delay5us();             //ÑÓʱ\r
218         dat |= SDA;             //¶ÁÊý¾Ý               \r
219         SCL = 0;                //À­µÍʱÖÓÏß\r
220         Delay5us();             //ÑÓʱ\r
221     }\r
222     return dat;\r
223 }\r
224 //**************************************\r
225 //ÏòI2CÉ豸дÈëÒ»¸ö×Ö½ÚÊý¾Ý\r
226 //**************************************\r
227 void Single_WriteI2C(uchar REG_Address,uchar REG_data)\r
228 {\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
234 }\r
235 //**************************************\r
236 //´ÓI2CÉ豸¶ÁÈ¡Ò»¸ö×Ö½ÚÊý¾Ý\r
237 //**************************************\r
238 uchar Single_ReadI2C(uchar REG_Address)\r
239 {\r
240         uchar REG_data;\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
249         return REG_data;\r
250 }\r
251 //**************************************\r
252 //³õʼ»¯MPU6050\r
253 //**************************************\r
254 void InitMPU6050()\r
255 {\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
261 }\r
262 //**************************************\r
263 //ºÏ³ÉÊý¾Ý\r
264 //**************************************\r
265 int GetData(uchar REG_Address)\r
266 {\r
267         uchar H,L;\r
268         H=Single_ReadI2C(REG_Address);\r
269         L=Single_ReadI2C(REG_Address+1);\r
270         return (H<<8)+L;   //ºÏ³ÉÊý¾Ý\r
271 }\r
272 //**************************************\r
273 //ÔÚ1602ÉÏÏÔʾ10λÊý¾Ý\r
274 //**************************************\r
275 void Display10BitData(int value,uchar x,uchar y)\r
276 {  uchar i;\r
277 //      value/=64;                                                      //ת»»Îª10λÊý¾Ý\r
278         lcd_printf(dis, value);                 //ת»»Êý¾ÝÏÔʾ\r
279         for(i=0;i<6;i++)\r
280         {\r
281     SeriPushSend(dis[i]);\r
282     }\r
283 \r
284   //    DisplayListChar(x,y,dis,4);     //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾ³¤¶È\r
285 }\r
286 //**************************************\r
287 //ÏÔʾζÈ\r
288 //**************************************\r
289 //void display_temp()\r
290 //{ \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
297 //}\r
298 \r
299 void init_uart()\r
300 {\r
301         TMOD=0x21;                              \r
302         TH1=0xfd;                               \r
303         TL1=0xfd;               \r
304                 \r
305         SCON=0x50;\r
306         PS=1;      //´®¿ÚÖжÏÉèΪ¸ßÓÅÏȼ¶±ð\r
307         TR0=1;     //Æô¶¯¶¨Ê±Æ÷                 \r
308         TR1=1;\r
309         ET0=1;     //´ò¿ª¶¨Ê±Æ÷0ÖжϠ                   \r
310         ES=1;   \r
311         EA=1;\r
312 }\r
313 \r
314 //*********************************************************\r
315 //Ö÷³ÌÐò\r
316 //*********************************************************\r
317 void main()\r
318\r
319         delay(500);             //ÉϵçÑÓʱ              \r
320 //      InitLcd();              //Òº¾§³õʼ»¯\r
321          init_uart();\r
322         InitMPU6050();  //³õʼ»¯MPU6050\r
323         delay(150);\r
324         while(1)\r
325         {\r
326         \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
333      \r
334                 SeriPushSend(0x0d); \r
335         SeriPushSend(0x0a);//»»ÐУ¬»Ø³µ\r
336                 delay(100);\r
337         }\r
338 }