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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20764|回復: 13
收起左側

手勢遙控智能小車制作

  [復制鏈接]
ID:104763 發表于 2016-7-17 12:21 | 顯示全部樓層 |閱讀模式
前不久參加學校挑戰杯,然后自己做了個手勢遙控小車,51單片機+mpu605+藍牙,大約半天就搞定了,現在把這個分享出來 IMG_20160624_171256.jpg 左邊那個是遙控器


IMG_20160624_204628.jpg

小車的程序
  1. #include<reg51.h>
  2. #include"lcd.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. bit flag=0;
  6. bit flag_REC=0;

  7. uchar i=0;
  8. uchar dat=0;

  9. sbit M11=P2^1;
  10. sbit M12=P2^2;
  11. sbit M21=P2^3;
  12. sbit M22=P2^4; /*驅動控制*/



  13. void delayms(uint xms)
  14. {
  15.     uint i,j;
  16.     for(i=xms;i>0;i--)
  17.       for(j=110;j>0;j--);
  18. }

  19. void back()
  20. {
  21.     M11=1;
  22.     M12=0;
  23.     M21=1;
  24.     M22=0;   
  25. }

  26. void forward()
  27. {
  28.     M11=0;
  29.     M12=1;
  30.     M21=0;
  31.     M22=1;
  32. }
  33. void stop()
  34. {
  35.     M11=0;
  36.     M12=0;
  37.     M21=0;
  38.     M22=0;
  39. }

  40. void turn_left()
  41. {
  42.     M11=1;
  43.     M12=0;
  44.     M21=0;
  45.     M22=1;
  46. }

  47. void turn_right()
  48. {
  49.     M11=0;
  50.     M12=1;
  51.     M21=1;
  52.     M22=0;
  53. }

  54. void main()
  55. {
  56.     TMOD=0X20;
  57.     TH1=0XFD;
  58.     TL1=0XFD;
  59.     TR1=1;
  60.     REN=1;
  61.     SM0=0;
  62.     SM1=1;
  63.     EA=1;
  64.     ES=1;
  65.     while(1)
  66.     {
  67.         if(flag_REC==1)
  68.           {
  69.               flag_REC=0;
  70.                
  71.                 switch(dat)
  72.                 {
  73.                     case 'F':
  74.                        forward();break;
  75.                     case 'B':
  76.                        back();break;
  77.                     case 'l':
  78.                        turn_left();break;
  79.                     case 'r':
  80.                        turn_right();break;
  81.                     case 'S':
  82.                        stop();break;
  83.                 }
  84.    
  85.           }
  86.          
  87.     }
  88. }

  89. void bluet() interrupt 4  /*中斷接收1個字節*/
  90. {
  91.     if(RI==1)
  92.     {
  93.         RI=0;
  94.           dat=SBUF;
  95.           flag_REC=1;
  96.          
  97.     }
  98. }
復制代碼
這是遙控器
  1. #include <REG52.H>        
  2. #include <math.h>    //Keil library  
  3. #include <stdio.h>   //Keil library        
  4. #include <INTRINS.H>
  5. typedef unsigned char  uchar;
  6. typedef unsigned short ushort;
  7. typedef unsigned int   uint;
  8. //****************************************
  9. // 定義51單片機端口
  10. //****************************************
  11. #define DataPort P2                //LCD1602數據端口

  12. sbit    SCL=P1^1;
  13. sbit    SDA=P1^0;
  14. sbit    LCM_RS=P0^7
  15. sbit    LCM_RW=P0^6;
  16. sbit    LCM_EN=P0^5;
  17. //****************************************
  18. sbit led=P1^2;


  19. // 定義MPU6050內部地址
  20. //****************************************
  21. #define        SMPLRT_DIV                0x19        //陀螺儀采樣率,典型值:0x07(125Hz)
  22. #define        CONFIG                        0x1A        //低通濾波頻率,典型值:0x06(5Hz)
  23. #define        GYRO_CONFIG                0x1B        //陀螺儀自檢及測量范圍,典型值:0x18(不自檢,2000deg/s)
  24. #define        ACCEL_CONFIG        0x1C        //加速計自檢、測量范圍及高通濾波頻率,典型值:0x01(不自檢,2G,5Hz)
  25. #define        ACCEL_XOUT_H        0x3B
  26. #define        ACCEL_XOUT_L        0x3C
  27. #define        ACCEL_YOUT_H        0x3D
  28. #define        ACCEL_YOUT_L        0x3E
  29. #define        ACCEL_ZOUT_H        0x3F
  30. #define        ACCEL_ZOUT_L        0x40
  31. #define        TEMP_OUT_H                0x41
  32. #define        TEMP_OUT_L                0x42
  33. #define        GYRO_XOUT_H                0x43
  34. #define        GYRO_XOUT_L                0x44        
  35. #define        GYRO_YOUT_H                0x45
  36. #define        GYRO_YOUT_L                0x46
  37. #define        GYRO_ZOUT_H                0x47
  38. #define        GYRO_ZOUT_L                0x48
  39. #define        PWR_MGMT_1                0x6B        //電源管理,典型值:0x00(正常啟用)
  40. #define        WHO_AM_I                0x75        //IIC地址寄存器(默認數值0x68,只讀)
  41. #define        SlaveAddress        0xD0        //IIC寫入時的地址字節數據,+1為讀取
  42. //****************************************
  43. //定義類型及變量
  44. //****************************************
  45. uchar dis[4];        //顯示數字(-511至512)的字符數組
  46. int        dis_data;        //變量

  47. void  delay(unsigned int k);//延時
  48. //LCD相關函數
  49. void  InitLcd();//初始化lcd1602
  50. void  lcd_printf(uchar *s,int temp_data);
  51. void  WriteDataLCM(uchar dataW);//LCD數據
  52. void  WriteCommandLCM(uchar CMD,uchar Attribc);        //LCD指令
  53. void  DisplayOneChar(uchar X,uchar Y,uchar DData);//顯示一個字符
  54. void  DisplayListChar(uchar X,uchar Y,uchar *DData,L);        //顯示字符串
  55. //MPU6050操作函數
  56. void  InitMPU6050();//初始化MPU6050
  57. void  Delay5us();
  58. void  I2C_Start();
  59. void  I2C_Stop();
  60. void  I2C_SendACK(bit ack);
  61. bit   I2C_RecvACK();
  62. void  I2C_SendByte(uchar dat);
  63. uchar I2C_RecvByte();
  64. void  I2C_ReadPage();
  65. void  I2C_WritePage();
  66. void  display_ACCEL_x();
  67. void  display_ACCEL_y();
  68. void  display_ACCEL_z();
  69. uchar Single_ReadI2C(uchar REG_Address);
  70. void  Single_WriteI2C(uchar REG_Address,uchar REG_data)
  71. //****************************************
  72. //整數轉字符串
  73. //****************************************
  74. void lcd_printf(uchar *s,int temp_data)
  75. {
  76.         if(temp_data<0)
  77.         {
  78.                 temp_data=-temp_data;
  79.                 *s='-';
  80.         }
  81.         else *s=' ';
  82.         *++s =temp_data/100+0x30;
  83.         temp_data=temp_data%100;     //取余運算
  84.         *++s =temp_data/10+0x30;
  85.         temp_data=temp_data%10;      //取余運算
  86.         *++s =temp_data+0x30;         
  87. }
  88. //****************************************
  89. //延時
  90. //****************************************
  91. void delay(unsigned int k)        
  92. {                                                
  93.         unsigned int i,j;                                
  94.         for(i=0;i<k;i++)
  95.         {                        
  96.                 for(j=0;j<121;j++);
  97.         }                                                
  98. }
  99. //****************************************
  100. //LCD1602初始化
  101. //****************************************
  102. void InitLcd()                                
  103. {                        
  104.         WriteCommandLCM(0x38,1);        
  105.         WriteCommandLCM(0x08,1);        
  106.         WriteCommandLCM(0x01,1);        
  107.         WriteCommandLCM(0x06,1);        
  108.         WriteCommandLCM(0x0c,1);
  109.         DisplayOneChar(0,0,'A');
  110. }                        
  111. //****************************************
  112. //LCD1602寫允許
  113. //****************************************
  114. void WaitForEnable(void)        
  115. {                                       
  116.         DataPort=0xff;               
  117.         LCM_RS=0;LCM_RW=1;_nop_();
  118.         LCM_EN=1;_nop_();_nop_();
  119.         //while(DataPort&0x80);        
  120.         LCM_EN=0;                                
  121. }                                       
  122. //****************************************
  123. //LCD1602寫入命令
  124. //****************************************
  125. void WriteCommandLCM(uchar CMD,uchar Attribc)
  126. {                                       
  127.         if(Attribc)
  128.          WaitForEnable();
  129.         LCM_RS=0;LCM_RW=0;_nop_();
  130.         DataPort=CMD;_nop_();        
  131.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  132. }                                       
  133. //****************************************
  134. //LCD1602寫入數據
  135. //****************************************
  136. void WriteDataLCM(uchar dataW)
  137. {                                       
  138.         WaitForEnable();               
  139.         LCM_RS=1;LCM_RW=0;_nop_();
  140.         DataPort=dataW;_nop_();        
  141.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  142. }               
  143. //****************************************
  144. //LCD1602寫入一個字符
  145. //****************************************
  146. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  147. {                                                
  148.         Y&=1;                                                
  149.         X&=15;                                                
  150.         if(Y)X|=0x40;                                       
  151.         X|=0x80;                        
  152.         WriteCommandLCM(X,0);               
  153.         WriteDataLCM(DData);               
  154. }                                                
  155. //****************************************
  156. //LCD1602顯示字符串
  157. //****************************************
  158. void DisplayListChar(uchar X,uchar Y,uchar *DData,L)
  159. {
  160.         uchar ListLength=0;
  161.         Y&=0x1;               
  162.         X&=0xF;               
  163.         while(L--)            
  164.         {                       
  165.                 DisplayOneChar(X,Y,DData[ListLength]);
  166.                 ListLength++;  
  167.                 X++;                        
  168.         }   
  169. }
  170. //**************************************
  171. //延時5微秒(STC90C52RC@12M)
  172. //不同的工作環境,需要調整此函數
  173. //當改用1T的MCU時,請調整此延時函數
  174. //**************************************
  175. void Delay5us()
  176. {
  177.         _nop_();_nop_();_nop_();_nop_();
  178.         _nop_();_nop_();_nop_();_nop_();
  179.         _nop_();_nop_();_nop_();_nop_();
  180.         _nop_();_nop_();_nop_();_nop_();
  181.         _nop_();_nop_();_nop_();_nop_();
  182.         _nop_();_nop_();_nop_();_nop_();
  183. }
  184. //**************************************
  185. //I2C起始信號
  186. //**************************************
  187. void I2C_Start()
  188. {
  189.     SDA = 1;                    //拉高數據線
  190.     SCL = 1;                    //拉高時鐘線
  191.     Delay5us();                 //延時
  192.     SDA = 0;                    //產生下降沿
  193.     Delay5us();                 //延時
  194.     SCL = 0;                    //拉低時鐘線
  195. }
  196. //**************************************
  197. //I2C停止信號
  198. //**************************************
  199. void I2C_Stop()
  200. {
  201.     SDA = 0;                    //拉低數據線
  202.     SCL = 1;                    //拉高時鐘線
  203.     Delay5us();                 //延時
  204.     SDA = 1;                    //產生上升沿
  205.     Delay5us();                 //延時
  206. }
  207. //**************************************
  208. //I2C發送應答信號
  209. //入口參數:ack (0:ACK 1:NAK)
  210. //**************************************
  211. void I2C_SendACK(bit ack)
  212. {
  213.     SDA = ack;                  //寫應答信號
  214.     SCL = 1;                    //拉高時鐘線
  215.     Delay5us();                 //延時
  216.     SCL = 0;                    //拉低時鐘線
  217.     Delay5us();                 //延時
  218. }
  219. //**************************************
  220. //I2C接收應答信號
  221. //**************************************
  222. bit I2C_RecvACK()
  223. {
  224.     SCL = 1;                    //拉高時鐘線
  225.     Delay5us();                 //延時
  226.     CY = SDA;                   //讀應答信號
  227.     SCL = 0;                    //拉低時鐘線
  228.     Delay5us();                 //延時
  229.     return CY;
  230. }
  231. //**************************************
  232. //向I2C總線發送一個字節數據
  233. //**************************************
  234. void I2C_SendByte(uchar dat)
  235. {
  236.     uchar i;
  237.     for (i=0; i<8; i++)         //8位計數器
  238.     {
  239.         dat <<= 1;              //移出數據的最高位
  240.         SDA = CY;               //送數據口
  241.         SCL = 1;                //拉高時鐘線
  242.         Delay5us();             //延時
  243.         SCL = 0;                //拉低時鐘線
  244.         Delay5us();             //延時
  245.     }
  246.     I2C_RecvACK();
  247. }
  248. //**************************************
  249. //從I2C總線接收一個字節數據
  250. //**************************************
  251. uchar I2C_RecvByte()
  252. {
  253.     uchar i;
  254.     uchar dat = 0;
  255.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  256.     for (i=0; i<8; i++)         //8位計數器
  257.     {
  258.         dat <<= 1;
  259.         SCL = 1;                //拉高時鐘線
  260.         Delay5us();             //延時
  261.         dat |= SDA;             //讀數據               
  262.         SCL = 0;                //拉低時鐘線
  263.         Delay5us();             //延時
  264.     }
  265.     return dat;
  266. }
  267. //**************************************
  268. //向I2C設備寫入一個字節數據
  269. //**************************************
  270. void Single_WriteI2C(uchar REG_Address,uchar REG_data)
  271. {
  272.     I2C_Start();                  //起始信號
  273.     I2C_SendByte(SlaveAddress);   //發送設備地址+寫信號
  274.     I2C_SendByte(REG_Address);    //內部寄存器地址,
  275.     I2C_SendByte(REG_data);       //內部寄存器數據,
  276.     I2C_Stop();                   //發送停止信號
  277. }
  278. //**************************************
  279. //從I2C設備讀取一個字節數據
  280. //**************************************
  281. uchar Single_ReadI2C(uchar REG_Address)
  282. {
  283.         uchar REG_data;
  284.         I2C_Start();                   //起始信號
  285.         I2C_SendByte(SlaveAddress);    //發送設備地址+寫信號
  286.         I2C_SendByte(REG_Address);     //發送存儲單元地址,從0開始        
  287.         I2C_Start();                   //起始信號
  288.         I2C_SendByte(SlaveAddress+1);  //發送設備地址+讀信號
  289.         REG_data=I2C_RecvByte();       //讀出寄存器數據
  290.         I2C_SendACK(1);                //接收應答信號
  291.         I2C_Stop();                    //停止信號
  292.         return REG_data;
  293. }
  294. //**************************************
  295. //初始化MPU6050
  296. //**************************************
  297. void InitMPU6050()
  298. {
  299.         Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠狀態
  300.         Single_WriteI2C(SMPLRT_DIV, 0x07);
  301.         Single_WriteI2C(CONFIG, 0x06);
  302.         Single_WriteI2C(GYRO_CONFIG, 0x18);
  303.         Single_WriteI2C(ACCEL_CONFIG, 0x01);
  304. }
  305. //**************************************
  306. //合成數據
  307. //**************************************
  308. int GetData(uchar REG_Address)
  309. {
  310.         char H,L;
  311.         int value;
  312.         H=Single_ReadI2C(REG_Address);
  313.         L=Single_ReadI2C(REG_Address+1);
  314.         //return (H<<8)+L;   //合成數據
  315.         value=(H<<8)+L;
  316.         value/=64;
  317.         return value;
  318. }
  319. //**************************************
  320. //在1602上顯示10位數據
  321. //**************************************
  322. void Display10BitData(int value,uchar x,uchar y) //num為XYZ的代表12
  323. {
  324.         //value/=64;        //轉換為10位數據
  325.         lcd_printf(dis, value);        //轉換數據顯示
  326.         DisplayListChar(x,y,dis,4);        //啟始列,行,顯示數組,顯示長度
  327. }

  328. void send(uchar pd)
  329. {
  330.     SBUF=pd
  331.     while(!TI);
  332.     TI=0;
  333.    
  334. }
  335. void send_init()
  336. {
  337.     TMOD=0X20;
  338.      TH1=0XFD;
  339.      TL1=0XFD;
  340.      TR1=1;
  341.      SM0=0;
  342.      SM1=1;
  343.      EA=1;
  344.      ES=1;
  345. }



  346. void main()
  347. {
  348.         int y;
  349.         led=0;
  350.         delay(500);                //上電延時               
  351.         InitLcd();                //液晶初始化
  352.         InitMPU6050();
  353.         send_init();
  354.         delay(150);
  355.         while(1)
  356.         {
  357.                 y=0;
  358.                
  359.                 Display10BitData(GetData(ACCEL_XOUT_H),2,0);
  360.                                 

  361.                 if(GetData(ACCEL_YOUT_H)>200)
  362.                 {
  363.                         send('f');
  364.                         led=1;
  365.                 }
  366.                 else if(GetData(ACCEL_YOUT_H)<=(-200))
  367.                 {
  368.                         send('b');
  369.                         led=1;
  370.                         
  371.                 }

  372.                 Display10BitData(GetData(ACCEL_YOUT_H),7,0)
  373.                 if(GetData(ACCEL_XOUT_H)>200)
  374.                 {
  375.                         send('r');
  376.                         y=1;
  377.                         led=1;
  378.                 }
  379.                 else if(GetData(ACCEL_XOUT_H)<(-200))
  380.                 {
  381.                         send('l');
  382.                         y=1;
  383.                         led=1;
  384.                 }

  385.                 if(GetData(ACCEL_YOUT_H)<200&&GetData(ACCEL_YOUT_H)>(-200)&&y==0)
  386.                 {
  387.                         send('s');
  388.                         led=1;
  389.                         
  390.                 }
  391.                 Display10BitData(GetData(ACCEL_ZOUT_H),12,0);
  392.                
  393.         
  394.                
  395.                 delay(500);
  396.         }
  397. }
復制代碼




評分

參與人數 2黑幣 +105 收起 理由
andongni + 5 贊一個!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:143842 發表于 2016-10-23 00:18 來自手機 | 顯示全部樓層
厲害  
回復

使用道具 舉報

ID:79544 發表于 2017-5-19 19:08 | 顯示全部樓層
多謝樓主分享,贊!!!!!!!!
回復

使用道具 舉報

ID:145130 發表于 2017-6-7 10:01 | 顯示全部樓層
受教了
回復

使用道具 舉報

ID:238009 發表于 2017-11-15 11:13 來自手機 | 顯示全部樓層
51有你更精彩
回復

使用道具 舉報

ID:87193 發表于 2017-11-30 14:54 | 顯示全部樓層
厲害厲害,作品看著不錯
回復

使用道具 舉報

ID:353100 發表于 2018-6-17 10:02 來自手機 | 顯示全部樓層
不錯,值得學習
回復

使用道具 舉報

ID:388016 發表于 2018-9-18 21:18 | 顯示全部樓層
贊一個
回復

使用道具 舉報

ID:399179 發表于 2018-9-30 09:45 來自手機 | 顯示全部樓層
樓主好厲害!
回復

使用道具 舉報

ID:148126 發表于 2018-10-26 13:24 | 顯示全部樓層
厲害了
回復

使用道具 舉報

ID:441552 發表于 2018-12-7 14:46 來自手機 | 顯示全部樓層
控制器程序編的的很厲害
回復

使用道具 舉報

ID:602799 發表于 2019-11-15 21:05 | 顯示全部樓層
這個是實現手勢遙控小車的嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一a| 国产免费视频在线 | 正在播放亚洲 | 久久久久综合 | 丝袜美腿av | 亚洲国产成人精品女人久久久 | 亚洲免费视频一区 | 中文一区| 国产伦精品一区二区 | 99久久精品一区二区毛片吞精 | 不卡的av一区 | 91影库 | 超碰精品在线 | 四虎影院在线播放 | 日韩成人在线看 | 日韩免费福利视频 | 超碰97在线免费 | 91在线观看免费 | 一区二区高清 | 小视频你懂得 | 91精品久久久久久久久久入口 | 午夜精品一区二区三区在线视 | 九九热在线观看 | 久久人体视频 | 中文字幕日韩欧美 | 91精品国产91久久久久久吃药 | 精品久久久久久亚洲精品 | 毛片久久久 | avtt国产 | 国产91av视频在线观看 | 中文字幕第一页在线 | 99热.com | 国产农村妇女毛片精品久久麻豆 | 国产午夜精品一区二区三区嫩草 | 亚洲福利在线视频 | 亚洲精品中文字幕在线观看 | 欧美a区 | 成人日b视频 | 国产高清在线视频 | 欧美精品一区二区三区在线 | 欧美人成在线视频 |