久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3281|回復: 0
打印 上一主題 下一主題
收起左側

A為三軸MEMS加速度計,G為三軸MEMS陀螺儀.挪動MPU6050模塊,則數據變化。

[復制鏈接]
跳轉到指定樓層
樓主

一、連接單片機板

MPU6050 電路圖,參看:MPU6050開發 -- 初識

從電路圖上看了引出四根線:電源、GND、SCL、SDA. 連接單片機板。

單片機部分電路圖:


思考:SCL、SDA應該接在單片機的哪個I/O口呢?

STC89C52 沒有集成 I2C 控制器,只能通過軟件模擬方法實現 I2C 功能,因此,普通I/O口都可以實現,不需要固定。你可以任意使用 STC89C52 單片機兩個引腳,作為數據和時鐘,然后自己編寫模塊 I2C 代碼。

那么我們就定義51單片機端口:
//****************************************
sbit    SCL=P1^5;//IIC時鐘引腳定義
sbit    SDA=P1^4;//IIC數據引腳定義

//****************************************

二、測試程序


  1. //****************************************
  2. // Update to MPU6050 by shinetop
  3. // MCU: STC89C52
  4. // 2012.3.1
  5. // 功能: 顯示加速度計和陀螺儀的10位原始數據
  6. //****************************************
  7. // 使用單片機STC89C52
  8. // 晶振:11.0592M
  9. // 顯示:串口
  10. // 編譯環境 Keil uVision2
  11. //****************************************
  12. #include <REG52.H>
  13. #include <math.h>    //Keil library  
  14. #include <stdio.h>   //Keil library
  15. #include <INTRINS.H>
  16. typedef unsigned char  uchar;
  17. typedef unsigned short ushort;
  18. typedef unsigned int   uint;
  19. //****************************************
  20. // 定義51單片機端口
  21. //****************************************
  22. sbit    SCL=P1^5; //IIC時鐘引腳定義
  23. sbit    SDA=P1^4; //IIC數據引腳定義
  24. //****************************************
  25. // 定義MPU6050內部地址
  26. //****************************************
  27. #define SMPLRT_DIV 0x19 //陀螺儀采樣率,典型值:0x07(125Hz)
  28. #define CONFIG 0x1A //低通濾波頻率,典型值:0x06(5Hz)
  29. #define GYRO_CONFIG 0x1B //陀螺儀自檢及測量范圍,典型值:0x18(不自檢,2000deg/s)
  30. #define ACCEL_CONFIG 0x1C //加速計自檢、測量范圍及高通濾波頻率,典型值:0x01(不自檢,2G,5Hz)
  31. #define ACCEL_XOUT_H 0x3B
  32. #define ACCEL_XOUT_L 0x3C
  33. #define ACCEL_YOUT_H 0x3D
  34. #define ACCEL_YOUT_L 0x3E
  35. #define ACCEL_ZOUT_H 0x3F
  36. #define ACCEL_ZOUT_L 0x40
  37. #define TEMP_OUT_H 0x41
  38. #define TEMP_OUT_L 0x42
  39. #define GYRO_XOUT_H 0x43
  40. #define GYRO_XOUT_L 0x44
  41. #define GYRO_YOUT_H 0x45
  42. #define GYRO_YOUT_L 0x46
  43. #define GYRO_ZOUT_H 0x47
  44. #define GYRO_ZOUT_L 0x48
  45. #define PWR_MGMT_1 0x6B //電源管理,典型值:0x00(正常啟用)
  46. #define WHO_AM_I 0x75 //IIC地址寄存器(默認數值0x68,只讀)
  47. #define SlaveAddress 0xD0 //IIC寫入時的地址字節數據,+1為讀取
  48. //**************************************************************************************************
  49. //定義類型及變量
  50. //**************************************************************************************************
  51. uchar dis[6]; //顯示數字(-511至512)的字符數組
  52. int dis_data; //變量
  53. //**************************************************************************************************
  54. //函數聲明
  55. //**************************************************************************************************
  56. void  Delay5us();
  57. void  delay(unsigned int k); //延時
  58. void  lcd_printf(uchar *s,int temp_data);
  59. //********************************MPU6050操作函數***************************************************
  60. void  InitMPU6050(); //初始化MPU6050
  61. void  I2C_Start();
  62. void  I2C_Stop();
  63. void  I2C_SendACK(bit ack);
  64. bit   I2C_RecvACK();
  65. void  I2C_SendByte(uchar dat);
  66. uchar I2C_RecvByte();
  67. void  I2C_ReadPage();
  68. void  I2C_WritePage();
  69. void  display_ACCEL_x();
  70. void  display_ACCEL_y();
  71. void  display_ACCEL_z();
  72. uchar Single_ReadI2C(uchar REG_Address); //讀取I2C數據
  73. void  Single_WriteI2C(uchar REG_Address,uchar REG_data);    //向I2C寫入數據
  74. //********************************************************************************
  75. //整數轉字符串
  76. //********************************************************************************
  77. void lcd_printf(uchar *s,int temp_data)
  78. {
  79. if(temp_data<0)
  80. {
  81. temp_data=-temp_data;
  82. *s='-';
  83. }
  84. else *s=' ';
  85. *++s =temp_data/10000+0x30;
  86. temp_data=temp_data%10000;     //取余運算
  87. *++s =temp_data/1000+0x30;
  88. temp_data=temp_data%1000;     //取余運算
  89. *++s =temp_data/100+0x30;
  90. temp_data=temp_data%100;     //取余運算
  91. *++s =temp_data/10+0x30;
  92. temp_data=temp_data%10;      //取余運算
  93. *++s =temp_data+0x30;
  94. }
  95. //******************************************************************************************************
  96. //串口初始化
  97. //*******************************************************************************************************
  98. void init_uart()
  99. {
  100. TMOD=0x21;
  101. TH1=0xfd; //實現波特率9600(系統時鐘11.0592MHZ)
  102. TL1=0xfd;
  103. SCON=0x50;
  104. PS=1;      //串口中斷設為高優先級別
  105. TR0=1;   //啟動定時器
  106. TR1=1;
  107. ET0=1;     //打開定時器0中斷
  108. ES=1;
  109. EA=1;
  110. }
  111. //*************************************************************************************************
  112. //串口發送函數
  113. //*************************************************************************************************
  114. void  SeriPushSend(uchar send_data)
  115. {
  116. SBUF=send_data;  
  117. while(!TI);TI=0;
  118. }
  119. //*************************************************************************************************
  120. //************************************延時*********************************************************
  121. //*************************************************************************************************
  122. void delay(unsigned int k)
  123. {
  124. unsigned int i,j;
  125. for(i=0;i<k;i++)
  126. {
  127. for(j=0;j<121;j++);
  128. }
  129. }
  130. //************************************************************************************************
  131. //延時5微秒(STC90C52RC@12M)
  132. //不同的工作環境,需要調整此函數
  133. //注意當改用1T的MCU時,請調整此延時函數
  134. //************************************************************************************************
  135. void Delay5us()
  136. {
  137. _nop_();_nop_();_nop_();_nop_();
  138. _nop_();_nop_();_nop_();_nop_();
  139. _nop_();_nop_();_nop_();_nop_();
  140. _nop_();_nop_();_nop_();_nop_();
  141. _nop_();_nop_();_nop_();_nop_();
  142. _nop_();_nop_();_nop_();_nop_();
  143. }
  144. //*************************************************************************************************
  145. //I2C起始信號
  146. //*************************************************************************************************
  147. void I2C_Start()
  148. {
  149. SDA = 1;                    //拉高數據線
  150. SCL = 1;                    //拉高時鐘線
  151. Delay5us();                 //延時
  152. SDA = 0;                    //產生下降沿
  153. Delay5us();                 //延時
  154. SCL = 0;                    //拉低時鐘線
  155. }
  156. //*************************************************************************************************
  157. //I2C停止信號
  158. //*************************************************************************************************
  159. void I2C_Stop()
  160. {
  161. SDA = 0;                    //拉低數據線
  162. SCL = 1;                    //拉高時鐘線
  163. Delay5us();                 //延時
  164. SDA = 1;                    //產生上升沿
  165. Delay5us();                 //延時
  166. }
  167. //**************************************************************************************************
  168. //I2C發送應答信號
  169. //入口參數:ack (0:ACK 1:NAK)
  170. //**************************************************************************************************
  171. void I2C_SendACK(bit ack)
  172. {
  173. SDA = ack;                  //寫應答信號
  174. SCL = 1;                    //拉高時鐘線
  175. Delay5us();                 //延時
  176. SCL = 0;                    //拉低時鐘線
  177. Delay5us();                 //延時
  178. }
  179. //****************************************************************************************************
  180. //I2C接收應答信號
  181. //****************************************************************************************************
  182. bit I2C_RecvACK()
  183. {
  184. SCL = 1;                    //拉高時鐘線
  185. Delay5us();                 //延時
  186. CY = SDA;                   //讀應答信號
  187. SCL = 0;                    //拉低時鐘線
  188. Delay5us();                 //延時
  189. return CY;
  190. }
  191. //*****************************************************************************************************
  192. //向I2C總線發送一個字節數據
  193. //*****************************************************************************************************
  194. void I2C_SendByte(uchar dat)
  195. {
  196. uchar i;
  197. for (i=0; i<8; i++)         //8位計數器
  198. {
  199. dat <<= 1;              //移出數據的最高位
  200. SDA = CY;               //送數據口
  201. SCL = 1;                //拉高時鐘線
  202. Delay5us();             //延時
  203. SCL = 0;                //拉低時鐘線
  204. Delay5us();             //延時
  205. }
  206. I2C_RecvACK();
  207. }
  208. //*****************************************************************************************************
  209. //從I2C總線接收一個字節數據
  210. //******************************************************************************************************
  211. uchar I2C_RecvByte()
  212. {
  213. uchar i;
  214. uchar dat = 0;
  215. SDA = 1;                    //使能內部上拉,準備讀取數據,
  216. for (i=0; i<8; i++)         //8位計數器
  217. {
  218. dat <<= 1;
  219. SCL = 1;                //拉高時鐘線
  220. Delay5us();             //延時
  221. dat |= SDA;             //讀數據               
  222. SCL = 0;                //拉低時鐘線
  223. Delay5us();             //延時
  224. }
  225. return dat;
  226. }
  227. //*****************************************************************************************************
  228. //向I2C設備寫入一個字節數據
  229. //*****************************************************************************************************
  230. void Single_WriteI2C(uchar REG_Address,uchar REG_data)
  231. {
  232. I2C_Start();                  //起始信號
  233. I2C_SendByte(SlaveAddress);   //發送設備地址+寫信號
  234. I2C_SendByte(REG_Address);    //內部寄存器地址,
  235. I2C_SendByte(REG_data);       //內部寄存器數據,
  236. I2C_Stop();                   //發送停止信號
  237. }
  238. //*******************************************************************************************************
  239. //從I2C設備讀取一個字節數據
  240. //*******************************************************************************************************
  241. uchar Single_ReadI2C(uchar REG_Address)
  242. {
  243. uchar REG_data;
  244. I2C_Start();                   //起始信號
  245. I2C_SendByte(SlaveAddress);    //發送設備地址+寫信號
  246. I2C_SendByte(REG_Address);     //發送存儲單元地址,從0開始
  247. I2C_Start();                   //起始信號
  248. I2C_SendByte(SlaveAddress+1);  //發送設備地址+讀信號
  249. REG_data=I2C_RecvByte();       //讀出寄存器數據
  250. I2C_SendACK(1);                //接收應答信號
  251. I2C_Stop();                    //停止信號
  252. return REG_data;
  253. }
  254. //******************************************************************************************************
  255. //初始化MPU6050
  256. //******************************************************************************************************
  257. void InitMPU6050()
  258. {
  259. Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠狀態
  260. Single_WriteI2C(SMPLRT_DIV, 0x07);
  261. Single_WriteI2C(CONFIG, 0x06);
  262. Single_WriteI2C(GYRO_CONFIG, 0x18);
  263. Single_WriteI2C(ACCEL_CONFIG, 0x01);
  264. }
  265. //******************************************************************************************************
  266. //合成數據
  267. //******************************************************************************************************
  268. int GetData(uchar REG_Address)
  269. {
  270. uchar H,L;
  271. H=Single_ReadI2C(REG_Address);
  272. L=Single_ReadI2C(REG_Address+1);
  273. return ((H<<8)+L);   //合成數據
  274. }
  275. //******************************************************************************************************
  276. //超級終端(串口調試助手)上顯示10位數據
  277. //******************************************************************************************************
  278. void Display10BitData(int value)
  279. {  uchar i;
  280. // value/=64; //轉換為10位數據
  281. lcd_printf(dis, value); //轉換數據顯示
  282. for(i=0;i<6;i++)
  283. {
  284. SeriPushSend(dis[ i]);
  285. }
  286. // DisplayListChar(x,y,dis,4); //啟始列,行,顯示數組,顯示長度
  287. }
  288. //*******************************************************************************************************
  289. //主程序
  290. //*******************************************************************************************************
  291. void main()
  292. {
  293. delay(500); //上電延時
  294. init_uart();
  295. InitMPU6050(); //初始化MPU6050
  296. delay(150);
  297. while(1)
  298. {
  299. SeriPushSend('A');  
  300. SeriPushSend(0x20);SeriPushSend('X'); SeriPushSend(':');
  301. Display10BitData(GetData(ACCEL_XOUT_H)); //顯示X軸加速度
  302. SeriPushSend(0x20);SeriPushSend('Y'); SeriPushSend(':');
  303. Display10BitData(GetData(ACCEL_YOUT_H)); //顯示Y軸加速度
  304. SeriPushSend(0x20);SeriPushSend('Z'); SeriPushSend(':');
  305. Display10BitData(GetData(ACCEL_ZOUT_H)); //顯示Z軸加速度
  306. SeriPushSend(0x20);
  307. SeriPushSend('G');  
  308. SeriPushSend(0x20);SeriPushSend('X'); SeriPushSend(':');
  309. Display10BitData(GetData(GYRO_XOUT_H)); //顯示X軸角速度
  310. SeriPushSend(0x20);SeriPushSend('Y'); SeriPushSend(':');
  311. Display10BitData(GetData(GYRO_YOUT_H)); //顯示Y軸角速度
  312. SeriPushSend(0x20);SeriPushSend('Z'); SeriPushSend(':');
  313. Display10BitData(GetData(GYRO_ZOUT_H)); //顯示Z軸角速度     
  314. SeriPushSend(0x0d);
  315. SeriPushSend(0x0a);//換行,回車
  316. delay(2000);
  317. }
  318. }
復制代碼


三、使用keil燒寫程序

四、測試

打開串口調試工具進行測試。

如果引腳接錯會打印 -00001,正確打印信息如下圖。

A 為三軸MEMS加速度計,G為三軸MEMS陀螺儀。挪動MPU6050模塊,則數據變化。


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91看片在线观看 | va精品| 久久久久久成人 | 国产视频一视频二 | 在线永久看片免费的视频 | 美日韩中文字幕 | 日批av| 三级黄色大片网站 | 成人一区二区三区在线 | 国产亚洲高清视频 | 91玖玖| 91视频久久 | 久草热在线 | 亚洲一区二区av | 国产精品一区在线观看 | 视频在线亚洲 | 欧美天堂 | 成人免费一区二区三区视频网站 | 日本一区二区高清不卡 | 日韩精品免费一区二区在线观看 | 成年人免费看 | 午夜影晥| 天天操夜夜拍 | 亚洲精品一区二区三区在线 | www.久久 | 久久久久国产 | 国产精品自产av一区二区三区 | 日韩不卡一区二区 | 一级高清免费毛片 | 操操网站 | 午夜视频一区 | 欧美一级在线免费 | 91久久精品一区二区二区 | 国产精品区二区三区日本 | 三级黄色大片网站 | 日本一二三区高清 | 91精品国产欧美一区二区 | 亚洲欧洲精品在线 | 人人鲁人人莫人人爱精品 | 久久精品小视频 | 成人小视频在线观看 |