]> git.piffa.net Git - arduino/blob - sheets/gyro/Test program/51-coed/51-lcd-mpu6050.c
first commit
[arduino] / sheets / gyro / Test program / 51-coed / 51-lcd-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[4];                                                   //ÏÔʾÊý×Ö(-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 //LCDÏà¹Øº¯Êý\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
73 //MPU6050²Ù×÷º¯Êý\r
74 void  InitMPU6050();                                                                                                    //³õʼ»¯MPU6050\r
75 void  Delay5us();\r
76 void  I2C_Start();\r
77 void  I2C_Stop();\r
78 void  I2C_SendACK(bit ack);\r
79 bit   I2C_RecvACK();\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
90 //ÕûÊýת×Ö·û´®\r
91 //****************************************\r
92 void lcd_printf(uchar *s,int temp_data)\r
93 {\r
94         if(temp_data<0)\r
95         {\r
96                 temp_data=-temp_data;\r
97                 *s='-';\r
98         }\r
99         else *s=' ';\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
105 }\r
106 //****************************************\r
107 //ÑÓʱ\r
108 //****************************************\r
109 void delay(unsigned int k)      \r
110 {                                               \r
111         unsigned int i,j;                               \r
112         for(i=0;i<k;i++)\r
113         {                       \r
114                 for(j=0;j<121;j++);\r
115         }                                               \r
116 }\r
117 //****************************************\r
118 //LCD1602³õʼ»¯\r
119 //****************************************\r
120 void InitLcd()                          \r
121 {                       \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
129 }                       \r
130 //****************************************\r
131 //LCD1602дÔÊÐí\r
132 //****************************************\r
133 void WaitForEnable(void)        \r
134 {                                       \r
135         DataPort=0xff;          \r
136         LCM_RS=0;LCM_RW=1;_nop_();\r
137         LCM_EN=1;_nop_();_nop_();\r
138         while(DataPort&0x80);   \r
139         LCM_EN=0;                               \r
140 }                                       \r
141 //****************************************\r
142 //LCD1602дÈëÃüÁî\r
143 //****************************************\r
144 void WriteCommandLCM(uchar CMD,uchar Attribc)\r
145 {                                       \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
150 }                                       \r
151 //****************************************\r
152 //LCD1602дÈëÊý¾Ý\r
153 //****************************************\r
154 void WriteDataLCM(uchar dataW)\r
155 {                                       \r
156         WaitForEnable();                \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
160 }               \r
161 //****************************************\r
162 //LCD1602дÈëÒ»¸ö×Ö·û\r
163 //****************************************\r
164 void DisplayOneChar(uchar X,uchar Y,uchar DData)\r
165 {                                               \r
166         Y&=1;                                           \r
167         X&=15;                                          \r
168         if(Y)X|=0x40;                                   \r
169         X|=0x80;                        \r
170         WriteCommandLCM(X,0);           \r
171         WriteDataLCM(DData);            \r
172 }                                               \r
173 //****************************************\r
174 //LCD1602ÏÔʾ×Ö·û´®\r
175 //****************************************\r
176 void DisplayListChar(uchar X,uchar Y,uchar *DData,L)\r
177 {\r
178         uchar ListLength=0; \r
179         Y&=0x1;                \r
180         X&=0xF;                \r
181         while(L--)             \r
182         {                       \r
183                 DisplayOneChar(X,Y,DData[ListLength]);\r
184                 ListLength++;  \r
185                 X++;                        \r
186         }    \r
187 }\r
188 //**************************************\r
189 //ÑÓʱ5΢Ãë(STC90C52RC@12M)\r
190 //²»Í¬µÄ¹¤×÷»·¾³,ÐèÒªµ÷Õû´Ëº¯Êý\r
191 //µ±¸ÄÓÃ1TµÄMCUʱ,Çëµ÷Õû´ËÑÓʱº¯Êý\r
192 //**************************************\r
193 void Delay5us()\r
194 {\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
201 }\r
202 //**************************************\r
203 //I2CÆðʼÐźÅ\r
204 //**************************************\r
205 void I2C_Start()\r
206 {\r
207     SDA = 1;                    //À­¸ßÊý¾ÝÏß\r
208     SCL = 1;                    //À­¸ßʱÖÓÏß\r
209     Delay5us();                 //ÑÓʱ\r
210     SDA = 0;                    //²úÉúϽµÑØ\r
211     Delay5us();                 //ÑÓʱ\r
212     SCL = 0;                    //À­µÍʱÖÓÏß\r
213 }\r
214 //**************************************\r
215 //I2CÍ£Ö¹ÐźÅ\r
216 //**************************************\r
217 void I2C_Stop()\r
218 {\r
219     SDA = 0;                    //À­µÍÊý¾ÝÏß\r
220     SCL = 1;                    //À­¸ßʱÖÓÏß\r
221     Delay5us();                 //ÑÓʱ\r
222     SDA = 1;                    //²úÉúÉÏÉýÑØ\r
223     Delay5us();                 //ÑÓʱ\r
224 }\r
225 //**************************************\r
226 //I2C·¢ËÍÓ¦´ðÐźÅ\r
227 //Èë¿Ú²ÎÊý:ack (0:ACK 1:NAK)\r
228 //**************************************\r
229 void I2C_SendACK(bit ack)\r
230 {\r
231     SDA = ack;                  //дӦ´ðÐźÅ\r
232     SCL = 1;                    //À­¸ßʱÖÓÏß\r
233     Delay5us();                 //ÑÓʱ\r
234     SCL = 0;                    //À­µÍʱÖÓÏß\r
235     Delay5us();                 //ÑÓʱ\r
236 }\r
237 //**************************************\r
238 //I2C½ÓÊÕÓ¦´ðÐźÅ\r
239 //**************************************\r
240 bit I2C_RecvACK()\r
241 {\r
242     SCL = 1;                    //À­¸ßʱÖÓÏß\r
243     Delay5us();                 //ÑÓʱ\r
244     CY = SDA;                   //¶ÁÓ¦´ðÐźÅ\r
245     SCL = 0;                    //À­µÍʱÖÓÏß\r
246     Delay5us();                 //ÑÓʱ\r
247     return CY;\r
248 }\r
249 //**************************************\r
250 //ÏòI2C×ÜÏß·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý\r
251 //**************************************\r
252 void I2C_SendByte(uchar dat)\r
253 {\r
254     uchar i;\r
255     for (i=0; i<8; i++)         //8λ¼ÆÊýÆ÷\r
256     {\r
257         dat <<= 1;              //ÒƳöÊý¾ÝµÄ×î¸ßλ\r
258         SDA = CY;               //ËÍÊý¾Ý¿Ú\r
259         SCL = 1;                //À­¸ßʱÖÓÏß\r
260         Delay5us();             //ÑÓʱ\r
261         SCL = 0;                //À­µÍʱÖÓÏß\r
262         Delay5us();             //ÑÓʱ\r
263     }\r
264     I2C_RecvACK();\r
265 }\r
266 //**************************************\r
267 //´ÓI2C×ÜÏß½ÓÊÕÒ»¸ö×Ö½ÚÊý¾Ý\r
268 //**************************************\r
269 uchar I2C_RecvByte()\r
270 {\r
271     uchar i;\r
272     uchar dat = 0;\r
273     SDA = 1;                    //ʹÄÜÄÚ²¿ÉÏÀ­,×¼±¸¶ÁÈ¡Êý¾Ý,\r
274     for (i=0; i<8; i++)         //8λ¼ÆÊýÆ÷\r
275     {\r
276         dat <<= 1;\r
277         SCL = 1;                //À­¸ßʱÖÓÏß\r
278         Delay5us();             //ÑÓʱ\r
279         dat |= SDA;             //¶ÁÊý¾Ý               \r
280         SCL = 0;                //À­µÍʱÖÓÏß\r
281         Delay5us();             //ÑÓʱ\r
282     }\r
283     return dat;\r
284 }\r
285 //**************************************\r
286 //ÏòI2CÉ豸дÈëÒ»¸ö×Ö½ÚÊý¾Ý\r
287 //**************************************\r
288 void Single_WriteI2C(uchar REG_Address,uchar REG_data)\r
289 {\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
295 }\r
296 //**************************************\r
297 //´ÓI2CÉ豸¶ÁÈ¡Ò»¸ö×Ö½ÚÊý¾Ý\r
298 //**************************************\r
299 uchar Single_ReadI2C(uchar REG_Address)\r
300 {\r
301         uchar REG_data;\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
310         return REG_data;\r
311 }\r
312 //**************************************\r
313 //³õʼ»¯MPU6050\r
314 //**************************************\r
315 void InitMPU6050()\r
316 {\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
322 }\r
323 //**************************************\r
324 //ºÏ³ÉÊý¾Ý\r
325 //**************************************\r
326 int GetData(uchar REG_Address)\r
327 {\r
328         char H,L;\r
329         H=Single_ReadI2C(REG_Address);\r
330         L=Single_ReadI2C(REG_Address+1);\r
331         return (H<<8)+L;   //ºÏ³ÉÊý¾Ý\r
332 }\r
333 //**************************************\r
334 //ÔÚ1602ÉÏÏÔʾ10λÊý¾Ý\r
335 //**************************************\r
336 void Display10BitData(int value,uchar x,uchar y)\r
337 {\r
338         value/=64;                                                      //ת»»Îª10λÊý¾Ý\r
339         lcd_printf(dis, value);                 //ת»»Êý¾ÝÏÔʾ\r
340         DisplayListChar(x,y,dis,4);     //ÆôʼÁУ¬ÐУ¬ÏÔʾÊý×飬ÏÔʾ³¤¶È\r
341 }\r
342 //**************************************\r
343 //ÏÔʾζÈ\r
344 //**************************************\r
345 //void display_temp()\r
346 //{ \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
353 //}\r
354 //*********************************************************\r
355 //Ö÷³ÌÐò\r
356 //*********************************************************\r
357 void main()\r
358\r
359         delay(500);             //ÉϵçÑÓʱ              \r
360         InitLcd();              //Òº¾§³õʼ»¯\r
361         InitMPU6050();  //³õʼ»¯MPU6050\r
362         delay(150);\r
363         while(1)\r
364         {\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
371                 delay(500);\r
372         }\r
373 }