欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3573|回復(fù): 0
收起左側(cè)

A為三軸MEMS加速度計(jì),G為三軸MEMS陀螺儀.挪動(dòng)MPU6050模塊,則數(shù)據(jù)變化。

[復(fù)制鏈接]
ID:253535 發(fā)表于 2017-11-26 09:22 | 顯示全部樓層 |閱讀模式

一、連接單片機(jī)板

MPU6050 電路圖,參看:MPU6050開發(fā) -- 初識(shí)

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

單片機(jī)部分電路圖:

0.png


思考:SCL、SDA應(yīng)該接在單片機(jī)的哪個(gè)I/O口呢?

STC89C52 沒(méi)有集成 I2C 控制器,只能通過(guò)軟件模擬方法實(shí)現(xiàn) I2C 功能,因此,普通I/O口都可以實(shí)現(xiàn),不需要固定。你可以任意使用 STC89C52 單片機(jī)兩個(gè)引腳,作為數(shù)據(jù)和時(shí)鐘,然后自己編寫模塊 I2C 代碼。

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

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

二、測(cè)試程序


  1. //****************************************
  2. // Update to MPU6050 by shinetop
  3. // MCU: STC89C52
  4. // 2012.3.1
  5. // 功能: 顯示加速度計(jì)和陀螺儀的10位原始數(shù)據(jù)
  6. //****************************************
  7. // 使用單片機(jī)STC89C52
  8. // 晶振:11.0592M
  9. // 顯示:串口
  10. // 編譯環(huán)境 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單片機(jī)端口
  21. //****************************************
  22. sbit    SCL=P1^5; //IIC時(shí)鐘引腳定義
  23. sbit    SDA=P1^4; //IIC數(shù)據(jù)引腳定義
  24. //****************************************
  25. // 定義MPU6050內(nèi)部地址
  26. //****************************************
  27. #define SMPLRT_DIV 0x19 //陀螺儀采樣率,典型值:0x07(125Hz)
  28. #define CONFIG 0x1A //低通濾波頻率,典型值:0x06(5Hz)
  29. #define GYRO_CONFIG 0x1B //陀螺儀自檢及測(cè)量范圍,典型值:0x18(不自檢,2000deg/s)
  30. #define ACCEL_CONFIG 0x1C //加速計(jì)自檢、測(cè)量范圍及高通濾波頻率,典型值: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地址寄存器(默認(rèn)數(shù)值0x68,只讀)
  47. #define SlaveAddress 0xD0 //IIC寫入時(shí)的地址字節(jié)數(shù)據(jù),+1為讀取
  48. //**************************************************************************************************
  49. //定義類型及變量
  50. //**************************************************************************************************
  51. uchar dis[6]; //顯示數(shù)字(-511至512)的字符數(shù)組
  52. int dis_data; //變量
  53. //**************************************************************************************************
  54. //函數(shù)聲明
  55. //**************************************************************************************************
  56. void  Delay5us();
  57. void  delay(unsigned int k); //延時(shí)
  58. void  lcd_printf(uchar *s,int temp_data);
  59. //********************************MPU6050操作函數(shù)***************************************************
  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數(shù)據(jù)
  73. void  Single_WriteI2C(uchar REG_Address,uchar REG_data);    //向I2C寫入數(shù)據(jù)
  74. //********************************************************************************
  75. //整數(shù)轉(zhuǎn)字符串
  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;     //取余運(yùn)算
  87. *++s =temp_data/1000+0x30;
  88. temp_data=temp_data%1000;     //取余運(yùn)算
  89. *++s =temp_data/100+0x30;
  90. temp_data=temp_data%100;     //取余運(yùn)算
  91. *++s =temp_data/10+0x30;
  92. temp_data=temp_data%10;      //取余運(yùn)算
  93. *++s =temp_data+0x30;
  94. }
  95. //******************************************************************************************************
  96. //串口初始化
  97. //*******************************************************************************************************
  98. void init_uart()
  99. {
  100. TMOD=0x21;
  101. TH1=0xfd; //實(shí)現(xiàn)波特率9600(系統(tǒng)時(shí)鐘11.0592MHZ)
  102. TL1=0xfd;
  103. SCON=0x50;
  104. PS=1;      //串口中斷設(shè)為高優(yōu)先級(jí)別
  105. TR0=1;   //啟動(dòng)定時(shí)器
  106. TR1=1;
  107. ET0=1;     //打開定時(shí)器0中斷
  108. ES=1;
  109. EA=1;
  110. }
  111. //*************************************************************************************************
  112. //串口發(fā)送函數(shù)
  113. //*************************************************************************************************
  114. void  SeriPushSend(uchar send_data)
  115. {
  116. SBUF=send_data;  
  117. while(!TI);TI=0;
  118. }
  119. //*************************************************************************************************
  120. //************************************延時(shí)*********************************************************
  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. //延時(shí)5微秒(STC90C52RC@12M)
  132. //不同的工作環(huán)境,需要調(diào)整此函數(shù)
  133. //注意當(dāng)改用1T的MCU時(shí),請(qǐng)調(diào)整此延時(shí)函數(shù)
  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起始信號(hào)
  146. //*************************************************************************************************
  147. void I2C_Start()
  148. {
  149. SDA = 1;                    //拉高數(shù)據(jù)線
  150. SCL = 1;                    //拉高時(shí)鐘線
  151. Delay5us();                 //延時(shí)
  152. SDA = 0;                    //產(chǎn)生下降沿
  153. Delay5us();                 //延時(shí)
  154. SCL = 0;                    //拉低時(shí)鐘線
  155. }
  156. //*************************************************************************************************
  157. //I2C停止信號(hào)
  158. //*************************************************************************************************
  159. void I2C_Stop()
  160. {
  161. SDA = 0;                    //拉低數(shù)據(jù)線
  162. SCL = 1;                    //拉高時(shí)鐘線
  163. Delay5us();                 //延時(shí)
  164. SDA = 1;                    //產(chǎn)生上升沿
  165. Delay5us();                 //延時(shí)
  166. }
  167. //**************************************************************************************************
  168. //I2C發(fā)送應(yīng)答信號(hào)
  169. //入口參數(shù):ack (0:ACK 1:NAK)
  170. //**************************************************************************************************
  171. void I2C_SendACK(bit ack)
  172. {
  173. SDA = ack;                  //寫應(yīng)答信號(hào)
  174. SCL = 1;                    //拉高時(shí)鐘線
  175. Delay5us();                 //延時(shí)
  176. SCL = 0;                    //拉低時(shí)鐘線
  177. Delay5us();                 //延時(shí)
  178. }
  179. //****************************************************************************************************
  180. //I2C接收應(yīng)答信號(hào)
  181. //****************************************************************************************************
  182. bit I2C_RecvACK()
  183. {
  184. SCL = 1;                    //拉高時(shí)鐘線
  185. Delay5us();                 //延時(shí)
  186. CY = SDA;                   //讀應(yīng)答信號(hào)
  187. SCL = 0;                    //拉低時(shí)鐘線
  188. Delay5us();                 //延時(shí)
  189. return CY;
  190. }
  191. //*****************************************************************************************************
  192. //向I2C總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
  193. //*****************************************************************************************************
  194. void I2C_SendByte(uchar dat)
  195. {
  196. uchar i;
  197. for (i=0; i<8; i++)         //8位計(jì)數(shù)器
  198. {
  199. dat <<= 1;              //移出數(shù)據(jù)的最高位
  200. SDA = CY;               //送數(shù)據(jù)口
  201. SCL = 1;                //拉高時(shí)鐘線
  202. Delay5us();             //延時(shí)
  203. SCL = 0;                //拉低時(shí)鐘線
  204. Delay5us();             //延時(shí)
  205. }
  206. I2C_RecvACK();
  207. }
  208. //*****************************************************************************************************
  209. //從I2C總線接收一個(gè)字節(jié)數(shù)據(jù)
  210. //******************************************************************************************************
  211. uchar I2C_RecvByte()
  212. {
  213. uchar i;
  214. uchar dat = 0;
  215. SDA = 1;                    //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
  216. for (i=0; i<8; i++)         //8位計(jì)數(shù)器
  217. {
  218. dat <<= 1;
  219. SCL = 1;                //拉高時(shí)鐘線
  220. Delay5us();             //延時(shí)
  221. dat |= SDA;             //讀數(shù)據(jù)               
  222. SCL = 0;                //拉低時(shí)鐘線
  223. Delay5us();             //延時(shí)
  224. }
  225. return dat;
  226. }
  227. //*****************************************************************************************************
  228. //向I2C設(shè)備寫入一個(gè)字節(jié)數(shù)據(jù)
  229. //*****************************************************************************************************
  230. void Single_WriteI2C(uchar REG_Address,uchar REG_data)
  231. {
  232. I2C_Start();                  //起始信號(hào)
  233. I2C_SendByte(SlaveAddress);   //發(fā)送設(shè)備地址+寫信號(hào)
  234. I2C_SendByte(REG_Address);    //內(nèi)部寄存器地址,
  235. I2C_SendByte(REG_data);       //內(nèi)部寄存器數(shù)據(jù),
  236. I2C_Stop();                   //發(fā)送停止信號(hào)
  237. }
  238. //*******************************************************************************************************
  239. //從I2C設(shè)備讀取一個(gè)字節(jié)數(shù)據(jù)
  240. //*******************************************************************************************************
  241. uchar Single_ReadI2C(uchar REG_Address)
  242. {
  243. uchar REG_data;
  244. I2C_Start();                   //起始信號(hào)
  245. I2C_SendByte(SlaveAddress);    //發(fā)送設(shè)備地址+寫信號(hào)
  246. I2C_SendByte(REG_Address);     //發(fā)送存儲(chǔ)單元地址,從0開始
  247. I2C_Start();                   //起始信號(hào)
  248. I2C_SendByte(SlaveAddress+1);  //發(fā)送設(shè)備地址+讀信號(hào)
  249. REG_data=I2C_RecvByte();       //讀出寄存器數(shù)據(jù)
  250. I2C_SendACK(1);                //接收應(yīng)答信號(hào)
  251. I2C_Stop();                    //停止信號(hào)
  252. return REG_data;
  253. }
  254. //******************************************************************************************************
  255. //初始化MPU6050
  256. //******************************************************************************************************
  257. void InitMPU6050()
  258. {
  259. Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠狀態(tài)
  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. //合成數(shù)據(jù)
  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);   //合成數(shù)據(jù)
  274. }
  275. //******************************************************************************************************
  276. //超級(jí)終端(串口調(diào)試助手)上顯示10位數(shù)據(jù)
  277. //******************************************************************************************************
  278. void Display10BitData(int value)
  279. {  uchar i;
  280. // value/=64; //轉(zhuǎn)換為10位數(shù)據(jù)
  281. lcd_printf(dis, value); //轉(zhuǎn)換數(shù)據(jù)顯示
  282. for(i=0;i<6;i++)
  283. {
  284. SeriPushSend(dis[ i]);
  285. }
  286. // DisplayListChar(x,y,dis,4); //啟始列,行,顯示數(shù)組,顯示長(zhǎng)度
  287. }
  288. //*******************************************************************************************************
  289. //主程序
  290. //*******************************************************************************************************
  291. void main()
  292. {
  293. delay(500); //上電延時(shí)
  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. }
復(fù)制代碼


三、使用keil燒寫程序

四、測(cè)試

打開串口調(diào)試工具進(jìn)行測(cè)試。

如果引腳接錯(cuò)會(huì)打印 -00001,正確打印信息如下圖。

A 為三軸MEMS加速度計(jì),G為三軸MEMS陀螺儀。挪動(dòng)MPU6050模塊,則數(shù)據(jù)變化。

1.png


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表