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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的2.4g小車制作資料 帶app

[復制鏈接]
跳轉到指定樓層
樓主
2.4g無重力感應小車里面只包含按鍵跟2.4g模塊通訊部分,想要添加重力感應,需要移植藍牙有重力感應小車部分代碼

所有制作資料打包下載:
2.4g小車.7z (7.7 MB, 下載次數: 75)

下面是小車的原理圖:





控制程序說明:
加速度模塊不同傾角時,向計算機發送不同數據
1 左偏時,發送0a
2 右偏時,發送a0
3 前偏時,發送aa
3 后偏是,發送55

發送數據時,數據類型具備優先級,當左右方向現有數據時,優先發送左右控制字符

優化了部分程序,刪除了多余的測試程序
優化了數組,相比于版本3,刪除了多余的數組
  1. #include  <REG52.H>        
  2. #include  <basic.h>
  3. #include  <INTRINS.H>
  4. sbit          SCL=P1^6;      //IIC時鐘引腳定義
  5. sbit           SDA=P1^7;      //IIC數據引腳定義
  6. #define        SlaveAddress   0xA6          //定義器件在IIC總線中的從地址,根據ALT  ADDRESS地址引腳不同修改
  7. #define JudgeP_M  0x8000   //正負數判斷
  8. #define Left_cmp  0x006e   //方向數據比較值,數值越小,越靈敏
  9. #define Right_cmp 0x006e
  10. #define Go_cmp    0x006e
  11. #define Back_cmp  0x006e
  12. #define Go    0xaa                   //小車實際動作控制字符,以實物為準
  13. #define Back  0x55
  14. #define Left  0xa5
  15. #define Right 0x5a
  16. #define Stop  0x00                   //停止控制字符
  17. Byte BUF[8];                         //接收數據緩存區
  18. Byte Sbuf[8];
  19. Word Wbuf[2];            
  20. void Init_ADXL345(void);             //初始化ADXL345
  21. void Single_Write_ADXL345(Byte REG_Address,Byte REG_data);   //單個寫入數據
  22. void Multiple_Read_ADXL345();                                  //連續的讀取內部寄存器數據
  23. void Delay5us();
  24. void Delay5ms();
  25. void Delay20ms();
  26. void ADXL345_Start();
  27. void ADXL345_Stop();
  28. void ADXL345_SendACK(bit ack);
  29. bit  ADXL345_RecvACK();
  30. void ADXL345_SendByte(Byte dat);
  31. Byte ADXL345_RecvByte();
  32. void send();
  33. void uart();
  34. void Data_Convert();
  35. void Data_Process();
  36. void direction_judge();
  37. //******主程序********
  38. void main()
  39. {
  40.         void Delay20ms();                                   //上電延時                                   
  41.         uart();        
  42.         Init_ADXL345();                         //初始化ADXL345
  43.         while(1)                                 //循環
  44.         {
  45.                 Multiple_Read_ADXL345();               //連續讀出數據,存儲在BUF中
  46.                 Data_Convert();
  47.         Data_Process();
  48.                 direction_judge();
  49.                 Delay20ms();                           //延時      
  50.         }
  51. }

  52. /*******************************/
  53. void Delay20ms()                //@11.0592MHz
  54. {
  55.         unsigned char i, j, k;

  56.         _nop_();
  57.         _nop_();
  58.         i = 1;
  59.         j = 216;
  60.         k = 35;
  61.         do
  62.         {
  63.                 do
  64.                 {
  65.                         while (--k);
  66.                 } while (--j);
  67.         } while (--i);
  68. }                                
  69. /**************************************
  70. 延時5微秒(STC90C52RC@12M)
  71. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  72. 當改用1T的MCU時,請調整此延時函數
  73. **************************************/
  74. void Delay5us()
  75. {
  76.     _nop_();_nop_();_nop_();_nop_();
  77.     _nop_();_nop_();_nop_();_nop_();
  78.         _nop_();_nop_();_nop_();_nop_();
  79. }
  80. /**************************************
  81. 延時5毫秒(STC90C52RC@12M)
  82. 不同的工作環境,需要調整此函數
  83. 當改用1T的MCU時,請調整此延時函數
  84. **************************************/
  85. void Delay5ms()
  86. {
  87.     Word n = 560;

  88.     while (n--);
  89. }
  90. /**************************************
  91. 起始信號
  92. **************************************/
  93. void ADXL345_Start()
  94. {
  95.     SDA = 1;                    //拉高數據線
  96.     SCL = 1;                    //拉高時鐘線
  97.     Delay5us();                 //延時
  98.     SDA = 0;                    //產生下降沿
  99.     Delay5us();                 //延時
  100.     SCL = 0;                    //拉低時鐘線
  101. }
  102. /**************************************
  103. 停止信號
  104. **************************************/
  105. void ADXL345_Stop()
  106. {
  107.     SDA = 0;                    //拉低數據線
  108.     SCL = 1;                    //拉高時鐘線
  109.     Delay5us();                 //延時
  110.     SDA = 1;                    //產生上升沿
  111.     Delay5us();                 //延時
  112. }
  113. /**************************************
  114. 發送應答信號
  115. 入口參數:ack (0:ACK 1:NAK)
  116. **************************************/
  117. void ADXL345_SendACK(bit ack)
  118. {
  119.     SDA = ack;                  //寫應答信號
  120.     SCL = 1;                    //拉高時鐘線
  121.     Delay5us();                 //延時
  122.     SCL = 0;                    //拉低時鐘線
  123.     Delay5us();                 //延時
  124. }
  125. /**************************************
  126. 接收應答信號
  127. **************************************/
  128. bit ADXL345_RecvACK()
  129. {
  130.     SCL = 1;                    //拉高時鐘線
  131.     Delay5us();                 //延時
  132.     CY = SDA;                   //讀應答信號
  133.     SCL = 0;                    //拉低時鐘線
  134.     Delay5us();                 //延時

  135.     return CY;
  136. }
  137. /**************************************
  138. 向IIC總線發送一個字節數據
  139. **************************************/
  140. void ADXL345_SendByte(Byte dat)
  141. {
  142.     Byte i;

  143.     for (i=0; i<8; i++)         //8位計數器
  144.     {
  145.         dat <<= 1;              //移出數據的最高位
  146.         SDA = CY;               //送數據口
  147.         SCL = 1;                //拉高時鐘線
  148.         Delay5us();             //延時
  149.         SCL = 0;                //拉低時鐘線
  150.         Delay5us();             //延時
  151.     }
  152.     ADXL345_RecvACK();
  153. }
  154. //從IIC總線接收一個字節數據
  155. Byte ADXL345_RecvByte()
  156. {
  157.     Byte i;
  158.     Byte dat = 0;
  159.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  160.     for (i=0; i<8; i++)         //8位計數器
  161.     {
  162.         dat <<= 1;
  163.         SCL = 1;                //拉高時鐘線
  164.         Delay5us();             //延時
  165.         dat |= SDA;             //讀數據               
  166.         SCL = 0;                //拉低時鐘線
  167.         Delay5us();             //延時
  168.     }
  169.     return dat;
  170. }
  171. //******單字節寫入*******************************************
  172. void Single_Write_ADXL345(Byte REG_Address,Byte REG_data)
  173. {
  174.     ADXL345_Start();                  //起始信號
  175.     ADXL345_SendByte(SlaveAddress);   //發送設備地址+寫信號
  176.     ADXL345_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf22頁
  177.     ADXL345_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf22頁
  178.     ADXL345_Stop();                   //發送停止信號
  179. }
  180. //連續讀出ADXL345內部加速度數據,地址范圍0x32~0x37
  181. void Multiple_read_ADXL345(void)
  182. {   Byte i;
  183.     ADXL345_Start();                          //起始信號
  184.     ADXL345_SendByte(SlaveAddress);           //發送設備地址+寫信號
  185.     ADXL345_SendByte(0x32);                   //發送存儲單元地址,從0x32開始        
  186.     ADXL345_Start();                          //起始信號
  187.     ADXL345_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  188.          for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
  189.     {
  190.         BUF[i] = ADXL345_RecvByte();          //BUF[0]存儲0x32地址中的數據
  191.         if (i == 5)
  192.         {
  193.            ADXL345_SendACK(1);                //最后一個數據需要回NOACK
  194.         }
  195.         else
  196.         {
  197.           ADXL345_SendACK(0);                //回應ACK
  198.        }
  199.    }
  200.     ADXL345_Stop();                          //停止信號
  201.     Delay5ms();
  202. }
  203. //初始化ADXL345,根據需要請參考pdf進行修改************************
  204. void Init_ADXL345()
  205. {
  206.    Single_Write_ADXL345(0x31,0x0B);   //測量范圍,正負16g,13位模式
  207.    Single_Write_ADXL345(0x2C,0x08);   //速率設定為12.5 參考pdf13頁
  208.    Single_Write_ADXL345(0x2D,0x08);   //選擇電源模式   參考pdf24頁
  209.    Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中斷
  210.    Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根據測試傳感器的狀態寫入pdf29頁
  211.    Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根據測試傳感器的狀態寫入pdf29頁
  212.    Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根據測試傳感器的狀態寫入pdf29頁
  213. }
  214. void uart()
  215. {
  216. SCON=0x50;
  217. TMOD=0x20;
  218. PCON=0x00;
  219. TH1=0xfd;
  220. TL1=0xfd;
  221. IE=0x90;
  222. TR1=1;
  223. }

  224. void send(unsigned char ch)
  225. {
  226. ES=0;
  227. SBUF=ch;
  228. while (TI==0);
  229. TI=0 ;
  230. ES=1;
  231. }
  232. void Data_Convert()                                                //將兩個八位數據合成為一個16位數據
  233. {
  234.   Wbuf[0]=BUF[1]<<8|BUF[0];
  235.   Wbuf[1]=BUF[3]<<8|BUF[2];
  236.   Wbuf[2]=BUF[5]<<8|BUF[4];
  237. }
  238. void Data_Process()
  239. {
  240.    Word i=0;
  241.     i=Wbuf[0]&JudgeP_M;           //X軸數據處理
  242.   if(i==0x8000)                   //當結果為負數時
  243.   {
  244.    Wbuf[0]=~Wbuf[0]+1;
  245.    Wbuf[0]=Wbuf[0]&0x7fff;
  246.    if(Wbuf[0]>Left_cmp)
  247.    {
  248.    Sbuf[0]=Left;
  249.    }
  250.    else
  251.    {
  252.    Sbuf[0]=Stop;
  253.    }
  254.   }
  255.   else                                           //當結果為正數時
  256.   {
  257.    if(Wbuf[0]>Right_cmp)
  258.    {
  259.       Sbuf[0]=Right;
  260.    }
  261.    else
  262.    {
  263.            Sbuf[0]=Stop;
  264.    }
  265.   }
  266.   i=Wbuf[1]&JudgeP_M;                   //Y軸數據處理
  267.   if(i==0x8000)                   //當結果為負數時
  268.   {
  269.    Wbuf[1]=~Wbuf[1]+1;
  270.    Wbuf[1]=Wbuf[1]&0x7fff;
  271.    if(Wbuf[1]>Back_cmp)
  272.    {
  273.    Sbuf[1]=Back;
  274.    }
  275.    else
  276.    {
  277.    Sbuf[1]=Stop;
  278.    }
  279.   }
  280.   else                                           //當結果為正數時
  281.   {
  282.    if(Wbuf[1]>Go_cmp)
  283.    {
  284.      Sbuf[1]=Go;
  285.    }
  286.    else
  287.    {
  288.          Sbuf[1]=Stop;
  289.    }
  290.   }
  291. }
  292. void direction_judge()
  293. {

  294.   if(Sbuf[0]==Left|Sbuf[0]==Right)
  295.   {
  296.    send(Sbuf[0]);
  297.   }
  298.   else
  299.   {
  300.    send(Sbuf[1]);
  301.   }
  302. }
復制代碼

NRF24L01發送模塊
  1. /*****************************************
  2. 創建:HAPPY 可兒
  3. 時間:2016.6.25
  4. 功能:工程主函數(主機發射部分)
  5. /*****************************************/
  6. #include"reg52.h"
  7. #include"Allhead.h"
  8. /*按鍵定義*/
  9. sbit KEY1 = P2^6;
  10. sbit KEY2 = P2^4;
  11. sbit KEY3 = P2^5;
  12. sbit KEY4 = P2^7;
  13. sbit KEY5 = P1^4;
  14. sbit LED1 = P0^0;
  15. sbit LED2 = P0^1;

  16. /*鍵盤掃描*/
  17. void KeyScan()
  18. {
  19.    char TxDate[4];
  20.    {
  21.   
  22.      if(!KEY1) //如果檢測到低電平,說明按鍵按下
  23.       {
  24.         Delay(10); //延時去抖,一般10-20ms
  25.         if(!KEY1) //再次確認按鍵是否按下,沒有按下則退出
  26.          {
  27.             while(!KEY1)//如果確認按下按鍵等待按鍵釋放,沒有則退出
  28.             {
  29.                 TxDate[0] = 0;//前進
  30.                 TxDate[1] = 1;
  31.                 TxDate[2] = 0;
  32.                 TxDate[3] = 1;
  33.                 NRFSetTxMode(TxDate);//發送數據·
  34.                 while(CheckACK()); //檢測是否發送完畢
  35.              }
  36.                          Delay(10); //延時去抖,一般10-20ms
  37.                          while(!KEY1);
  38.                          TxDate[0] = 1;//空操作
  39.              TxDate[1] = 1;
  40.              TxDate[2] = 1;
  41.              TxDate[3] = 1;
  42.                          NRFSetTxMode(TxDate);//發送數據·
  43.              while(CheckACK()); //檢測是否發送完畢
  44.         }
  45.       }
  46. /********************************************************/
  47.    else if(!KEY2) //如果檢測到低電平,說明按鍵按下
  48.    {
  49.      Delay(10); //延時去抖,一般10-20ms
  50.      if(!KEY2) //再次確認按鍵是否按下,沒有按下則退出
  51.       {
  52.         while(!KEY2)//如果確認按下按鍵等待按鍵釋放,沒有則退出
  53.           {
  54.             TxDate[0] = 0;//向左轉
  55.             TxDate[1] = 1;
  56.             TxDate[2] = 1;
  57.             TxDate[3] = 0;
  58.             NRFSetTxMode(TxDate);//發送數據
  59.             while(CheckACK()); //檢測是否發送完畢
  60.          }
  61.                  Delay(10); //延時去抖,一般10-20ms
  62.                  while(!KEY1);
  63.                  TxDate[0] = 1;//空操作
  64.          TxDate[1] = 1;
  65.          TxDate[2] = 1;
  66.          TxDate[3] = 1;
  67.                  NRFSetTxMode(TxDate);//發送數據·
  68.          while(CheckACK()); //檢測是否發送完畢
  69.      }
  70.    }
  71. /********************************************************/
  72.    else if(!KEY3) //如果檢測到低電平,說明按鍵按下
  73.     {
  74.       Delay(10); //延時去抖,一般10-20ms
  75.       if(!KEY3) //再次確認按鍵是否按下,沒有按下則退出
  76.         {
  77.           while(!KEY3)//如果確認按下按鍵等待按鍵釋放,沒有則退出
  78.             {
  79.               TxDate[0] = 1;//向右轉
  80.               TxDate[1] = 0;
  81.               TxDate[2] = 0;
  82.               TxDate[3] = 1;
  83.               NRFSetTxMode(TxDate);//發送數據
  84.               while(CheckACK()); //檢測是否發送完畢
  85.            }
  86.                    Delay(10); //延時去抖,一般10-20ms
  87.                          while(!KEY1);
  88.                      TxDate[0] = 1;//空操作
  89.              TxDate[1] = 1;
  90.              TxDate[2] = 1;
  91.              TxDate[3] = 1;
  92.                          NRFSetTxMode(TxDate);//發送數據·
  93.              while(CheckACK()); //檢測是否發送完畢
  94.         }
  95.    }
  96. /********************************************************/
  97.    else if(!KEY4) //如果檢測到低電平,說明按鍵按下
  98.     {
  99.       Delay(10); //延時去抖,一般10-20ms
  100.       if(!KEY4) //再次確認按鍵是否按下,沒有按下則退出
  101.         {
  102.           while(!KEY4)//如果確認按下按鍵等待按鍵釋放,沒有則退出
  103.             {
  104.               TxDate[0] = 1;//后退
  105.               TxDate[1] = 0;
  106.               TxDate[2] = 1;
  107.               TxDate[3] = 0;
  108.               NRFSetTxMode(TxDate);//發送數據
  109.               while(CheckACK()); //檢測是否發送完畢
  110.             }
  111.                          Delay(10); //延時去抖,一般10-20ms
  112.                          while(!KEY1);
  113.                          TxDate[0] = 1;//空操作
  114.              TxDate[1] = 1;
  115.              TxDate[2] = 1;
  116.              TxDate[3] = 1;
  117.                          NRFSetTxMode(TxDate);//發送數據·
  118.              while(CheckACK()); //檢測是否發送完畢
  119.         }
  120.      }

  121. }  
  122. }
  123. /*********************主函數***************************/
  124. void main()
  125. {
  126.     NRF24L01Int(); //初始化NRF24L01
  127.     while(1)
  128.     {         
  129.           KeyScan();   
  130.         }
  131. }
復制代碼


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:141094 發表于 2016-11-1 03:50 | 只看該作者
下載看看
回復

使用道具 舉報

板凳
ID:326450 發表于 2019-6-12 12:02 | 只看該作者
十分感謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区欧美 | 国产日韩电影 | 殴美成人在线视频 | 日韩免费一二三区 | а_天堂中文最新版地址 | 久久久av中文字幕 | 久久久不卡网国产精品一区 | 亚洲91| 一级毛片成人免费看a | 精品视频一区二区三区 | 精品久久久久国产 | 国产精品国产三级国产aⅴ原创 | 国产一区电影 | 久久久人成影片免费观看 | 欧美啊v在线观看 | 日韩不卡在线 | 一区二区三区高清不卡 | 日韩一级二级片 | 日韩手机在线视频 | 亚洲美女在线一区 | 天天插天天干 | 中国大陆高清aⅴ毛片 | 日日噜噜夜夜爽爽狠狠 | 欧美成人免费在线视频 | 欧美国产亚洲一区二区 | 亚洲视频免费在线播放 | 99久久久99久久国产片鸭王 | 久久久精品一区 | 国产精品久久久久久久久久 | 免费在线观看一区二区 | 国产精品亚洲一区 | 人妖一区| 亚洲欧美国产精品久久 | 欧美一区二区大片 | 99久久精品免费看国产免费软件 | 日韩成人 | 国产成人福利在线观看 | 日本午夜视频 | 超碰电影| 福利片一区二区 | 蜜桃视频在线观看免费视频网站www |