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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2543|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

MPU6050三軸陀螺儀 C語(yǔ)言程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:373926 發(fā)表于 2018-7-18 11:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
運(yùn)用52單片機(jī)和MPU6050控制三軸陀螺儀
  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; //打開(kāi)定時(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開(kāi)始
  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. Display10BitData(GetData(ACCEL_XOUT_H)); //顯示X軸加速度
  300. Display10BitData(GetData(ACCEL_YOUT_H)); //顯示Y軸加速度
  301. Display10BitData(GetData(ACCEL_ZOUT_H)); //顯示Z軸加速度
  302. Display10BitData(GetData(GYRO_XOUT_H)); //顯示X軸角速度
  303. Display10BitData(GetData(GYRO_YOUT_H)); //顯示Y軸角速度
  304. Display10BitData(GetData(GYRO_ZOUT_H)); //顯示Z軸角速度

  305. SeriPushSend(0x0d);
  306. SeriPushSend(0x0a);//換行,回車
  307. delay(2000);
  308. }
  309. }
復(fù)制代碼

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

使用道具 舉報(bào)

沙發(fā)
ID:371957 發(fā)表于 2018-8-17 16:25 | 只看該作者
這個(gè)程序是發(fā)送到串口嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91原创视频 | 欧美电影免费观看 | 精品国产伦一区二区三区观看体验 | 免费观看黄 | 青青久久 | 成人福利电影 | 一区二区三区在线观看视频 | 亚洲欧美视频一区 | 精品一二 | 欧美九九九 | 国产精品99久久久久久www | 爱爱无遮挡 | 中文字幕一区在线观看视频 | 欧美精品一区二区三区四区五区 | 国内精品久久久久 | 91国在线高清视频 | 久久区二区 | 亚洲精品无 | 99re视频在线免费观看 | 国产av毛片 | 成人精品国产免费网站 | 国产精品久久久久久影视 | 国产999精品久久久影片官网 | 国产极品车模吞精高潮呻吟 | 日韩一二区 | 中文字幕精品一区 | 国产一区二区三区视频 | 99久久免费精品国产男女高不卡 | 亚洲精品一区二区三区免 | 日韩视频精品在线 | 高清亚洲 | 中文字幕不卡一区 | 99精品视频在线 | 老牛嫩草一区二区三区av | 成人免费在线视频 | 日韩高清一区 | 看一级毛片视频 | 蜜桃毛片 | 黄网站色大毛片 | 激情欧美日韩一区二区 | h视频在线播放 |