[活动] 【21ic项目外包平台DIY大赛——蓝牙智能小车DIY】

[复制链接]
 楼主| molun 发表于 2023-11-24 17:48 | 显示全部楼层 |阅读模式
本帖最后由 molun 于 2023-12-12 11:00 编辑

#申请原创# @21小跑堂 21ic项目外包平台DIY大赛——蓝牙智能小车DIY

成品展示
前言
说起玩具车,没有哪一个“男孩子”是可以拒绝的,即便是像我这样初为人父,400多个月的“大男孩”,也希望拥有一辆自己DIY的玩具小车。

恰逢21ic论坛项目外包举办DIY大赛,有幸中签,希望我对电子DIY的热爱可以延续到我的一对双胞胎宝宝,激起他们将来对电子技术的热爱,将来成为这个行业当中的一员!

遥控玩具小车,已经有很多人做过了,在网络上搜索,可以找到很多教程展示,有基于51单片机、STM32单片机、ESP32、Arduino UNO为主控的小车项目;有基于蓝牙、WIFI、4G、红外遥控、语音控制等多种控制形式;有使用双电机双轮、双电机双轮+万向轮、四电机四轮的版本,甚至独轮平衡的版本;根据使用车轮的不同、驱动芯片的不同,车体框架的不同,有各种形态,发挥你的动手能力,可以基于开源项目打造出自己独一无二的遥控小车。



开箱
本次我们拿到是基于51单片机STC89C52RC和“HC-05”蓝牙模块,车体材质为FR-4电路板。



该套件某宝有售,清单如下:




准备工作


我这里准备有正点原子T65电烙铁、100W Type-C笔记本电源(为T65供电)、镊子两把、焊锡丝(材料包中也有)、高温海绵、硅胶垫、指甲刀(剪去插件多余引脚)、螺丝刀,辅助工具:手机支架、充电宝、LED灯。PWLINK2烧录器、CH340 USB转串口工具。

首先拆分电路板上的扩展版,掰下来即可,多余的部分可以使用水口钳剪去,我手头没拿,使用镊子加紧,掰掉多余部分。

所有扩展板拆分完毕后,可以进入焊接环节。

焊接

高温海绵泡水湿润,电烙铁预热。
T65小巧便携,出门就随身带着,使用RedmiBook Pro  15笔记本电源供电,升温迅速。
根据PCB上的丝印对元器件进行焊接。
需要注意IN5822二极管、电解电容、以及二极管的极性。


焊接完毕这些后先可以进行组装,使用铜柱、螺丝、螺母、扩展片把电池盒、电机、车轮、万向轮、电流表组装到车架上。

电池盒使用2颗平头螺丝固定。
两个电机接线焊接一致即可。(如图正极在左,负极在右)


镊子夹住螺母,方便上紧螺丝。

我第一次焊接专门焊接接线端子相反,看资料焊接一致更好,因为涉及参考程序,建议新手如此。


没拿水口钳,心疼坏我了,怕把我的指甲钳剪坏,还好,小米9.9的指甲钳扛住了所有。

所有零件焊接完成展示
焊接喇叭和LED刚开始有点蒙住了,找了找原理图,焊接就有方向了。

原理图

这里L293D电路部分功能等同于L298N驱动模块


  
9012 NPN型三极管驱动喇叭和LED,需要注意区分引脚第一脚,平面朝向自己,左边为第一脚,集电极C。(B代表基极,C代表集电极,E代表发射极)
根据原理图所示,喇叭正极接5V,负极接9012第一脚,9012第三脚接GND,第二脚与电阻连接。电阻另一端与排针连接,方便使用杜邦线与51最小系统板连接。




4只LED灯并联,正极接入5V,负极连接9012第一脚,9012第三脚接GND,第二脚与电阻连接。电阻另一端与排针连接。蓝牙模块只需要把6针排母、4针排针焊接到洞洞板,4个排针分别与中间的排母针连接即可。
至此,电路焊接完成。这里建议洞洞板区域连接可以使用原件引脚做跳线,容易焊接,只靠焊锡连接2.54的焊接孔,不仅浪费焊锡丝也需要很高的技巧。



电路连接
根据原理图,使用杜邦线把最小系统板与各端口连接起来。
IN1连接P1.2;
IN2连接P1.3;
IN3连接P1.6;
IN4连接P1.7;
EN1连接P1.4;
EN2连接P1.5;
蜂鸣器连接P2.3;
LED连接 P2.7;
HC-05 TXD连接 P3.0(RXD);
HC-05 RXD连接 P3.1(TXD);


代码
51 Bluetooth car.c
  1. #include <string.h>
  2. #include "reg51.h"           //包含51系统头文件
  3. #include "bst_car.h"         //包含bst_car.h智能小车头文件

  4. unsigned char pwm_val_left = 0; //变量定义
  5. unsigned char pwm_val_right = 0;
  6. unsigned char push_val_left ;   //左轮占空比N/20 //速度调节变量 0-20 0最小,20最大
  7. unsigned char push_val_right ;  //右轮占空比N/20
  8.                                                            
  9. bit Right_PWM_ON = 1;                  //右轮PWM开关
  10. bit Left_PWM_ON = 1;                              //左轮PWM开关

  11. bit startBit = 0;                                        //串口接收开始标志位
  12. bit newLineReceived = 0;                     //串口一帧协议包接收完成

  13. unsigned char control=0X03;                  //车运动控制全局变量
  14. unsigned char inputString[50];  //接收数据协议

  15. /*小车运行状态枚举*/
  16. enum{
  17.   enSTOP = 0,
  18.   enRUN,
  19.   enBACK,
  20.   enLEFT,
  21.   enRIGHT
  22.         }enCarState;

  23. #define         enMinMin()         {push_val_left =20;push_val_right =20;}
  24. #define         enMin()                 {push_val_left =24;push_val_right =24;}
  25. #define         enMidle()        {push_val_left =28;push_val_right =28;}
  26. #define                enMax()                 {push_val_left =32;push_val_right =32;}
  27. #define         run_car     '1'//按键前
  28. #define         back_car    '2'//按键后
  29. #define         left_car    '3'//按键左
  30. #define         right_car   '4'//按键右
  31. #define         stop_car    '0'//按键停

  32. int g_volume = 0;
  33. int g_carstate = 0;
  34. char returntemp[] = "$0,0,0,0,0,0,0,0,0,0,0,0,0#";

  35. //延时函数        
  36. void delay(unsigned int xms)                                
  37. {
  38.     unsigned int i,j;
  39.         for(i=xms;i>0;i--)     //i=xms即延时约xms毫秒
  40.     for(j=112;j>0;j--);
  41. }

  42. //前进
  43. void run(void)
  44. {
  45.         Left_moto_go;   //左轮前进
  46.         Right_moto_go;  //右轮前进
  47. }

  48. //左转
  49. void leftrun(void)
  50. {         
  51.   Right_moto_go;   //右轮前进
  52.   Left_moto_Stop;  //左轮停止
  53. }

  54. //右转
  55. void  rightrun(void)
  56. {
  57.   Left_moto_go;    //左轮前进
  58.   Right_moto_Stop; //右轮停止        
  59. }

  60. //后退
  61. void back(void)
  62. {
  63.    Left_moto_back;  //左轮后退
  64.    Right_moto_back; //右轮后退
  65. }

  66. //停转
  67. void stop(void)
  68. {
  69.   Left_moto_Stop;   //左轮停转
  70.   Right_moto_Stop;  //右轮停转
  71. }

  72. //左旋转
  73. void tleft(void)
  74. {
  75.         Left_moto_back;   //左轮后退
  76.         Right_moto_go;    //右轮前进
  77. }

  78. //右旋转
  79. void tright(void)
  80. {
  81.         Left_moto_go ;    //左轮前进
  82.         Right_moto_back ; //右轮后退
  83. }

  84. //PWM调制电机转速  
  85. /************************************************************************/                                 
  86. /*                   左轮调速                                           */
  87. /*调节push_val_left的值改变左电机转速,占空比*/
  88. void pwm_out_left_moto(void)
  89. {  
  90.     if(Left_PWM_ON)
  91.     {
  92.         if(pwm_val_left<=push_val_left)
  93.             {
  94.                 EN1=1;
  95.             }
  96.             else
  97.             {
  98.                 EN1=0;
  99.         }
  100.         if(pwm_val_left>=32)
  101.             pwm_val_left=0;
  102.     }
  103.     else   
  104.     {
  105.         EN1=0;    //若未开启PWM则EN1=0 左轮 停止
  106.     }
  107. }
  108. /************************************************************************/
  109. /*                    右轮调速                                          */  
  110. /*调节push_val_right的值改变右电机转速,占空比*/
  111. void pwm_out_right_moto(void)
  112. {
  113.     if(Right_PWM_ON)
  114.     {
  115.         if(pwm_val_right<=push_val_right)        //20ms内电平信号 111 111 0000 0000 0000 00
  116.             {
  117.                 EN2=1;                                                         //占空比6:20
  118.         }
  119.             else
  120.             {
  121.                 EN2=0;
  122.         }
  123.             if(pwm_val_right>=32)
  124.             pwm_val_right=0;
  125.     }
  126.     else   
  127.     {
  128.         EN2=0;    //若未开启PWM则EN2=0 右轮 停止
  129.     }
  130. }
  131.       
  132.       
  133. //TIMER0中断服务子函数产生PWM信号
  134. void timer0()interrupt 1 using 2
  135. {
  136.      TH0=0XFC;          //1Ms定时
  137.          TL0=0X66;
  138.          pwm_val_left++;
  139.          pwm_val_right++;
  140.          pwm_out_left_moto();
  141.          pwm_out_right_moto();
  142. }        

  143. void timer2()  interrupt 5         //定时器2
  144. {
  145.          TF2 = 0;
  146.      TH2 = 0;          //1Ms定时
  147.          TL2 = 0;
  148. }
  149. /******************************************************************/
  150. /* 串口中断程序*/
  151. /******************************************************************/

  152. void UART_SER () interrupt 4
  153. {
  154.         unsigned char n;         //定义临时变量
  155.         static int num = 0;

  156.         if(RI)                 //判断是接收中断产生
  157.         {
  158.                 RI = 0;         //标志位清零
  159.                 n = SBUF;   //读入缓冲区的值

  160.                 //control=n;
  161.             if(n == '[backcolor=rgb(247, 247, 247)]reg51.h
  162. [code]#ifndef __STC89C5xRC_RDP_H__
  163. #define __STC89C5xRC_RDP_H__

  164. /////////////////////////////////////////////////

  165. /* The following is STC additional SFR */

  166. /* sfr  AUXR  = 0x8e; */
  167. /* sfr  AUXR1 = 0xa2; */
  168. /* sfr  IPH   = 0xb7; */

  169. sfr  P4  = 0xe8;
  170. sbit P46 = P4^6;
  171. sbit P45 = P4^5;       //ISP下载需勾选"ALE脚用作P4.5口"
  172. sbit P44 = P4^4;
  173. sbit P43 = P4^3;
  174. sbit P42 = P4^2;
  175. sbit P41 = P4^1;
  176. sbit P40 = P4^0;

  177. sfr  XICON = 0xc0;

  178. sfr  WDT_CONTR = 0xe1;

  179. sfr ISP_DATA  = 0xe2;
  180. sfr ISP_ADDRH = 0xe3;
  181. sfr ISP_ADDRL = 0xe4;
  182. sfr ISP_CMD   = 0xe5;
  183. sfr ISP_TRIG  = 0xe6;
  184. sfr ISP_CONTR = 0xe7;

  185. /* Above is STC additional SFR */

  186. /*--------------------------------------------------------------------------
  187. REG51F.H

  188. Header file for 8xC31/51, 80C51Fx, 80C51Rx+
  189. Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.
  190. All rights reserved.

  191. Modification according to DataSheet from April 1999
  192. - SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives
  193. --------------------------------------------------------------------------*/

  194. /*  BYTE Registers  */
  195. sfr P0   = 0x80;
  196. sbit P00 = P0^0;
  197. sbit P01 = P0^1;
  198. sbit P02 = P0^2;
  199. sbit P03 = P0^3;
  200. sbit P04 = P0^4;
  201. sbit P05 = P0^5;
  202. sbit P06 = P0^6;
  203. sbit P07 = P0^7;
  204. sfr P1   = 0x90;
  205. sbit P10 = P1^0;
  206. sbit P11 = P1^1;
  207. sbit P12 = P1^2;
  208. sbit P13 = P1^3;
  209. sbit P14 = P1^4;
  210. sbit P15 = P1^5;
  211. sbit P16 = P1^6;
  212. sbit P17 = P1^7;
  213. sfr P2   = 0xA0;
  214. sbit P20 = P2^0;
  215. sbit P21 = P2^1;
  216. sbit P22 = P2^2;
  217. sbit P23 = P2^3;
  218. sbit P24 = P2^4;
  219. sbit P25 = P2^5;
  220. sbit P26 = P2^6;
  221. sbit P27 = P2^7;
  222. sfr P3   = 0xB0;
  223. sbit P30 = P3^0;
  224. sbit P31 = P3^1;
  225. sbit P32 = P3^2;
  226. sbit P33 = P3^3;
  227. sbit P34 = P3^4;
  228. sbit P35 = P3^5;
  229. sbit P36 = P3^6;
  230. sbit P37 = P3^7;
  231. sfr PSW  = 0xD0;
  232. sfr ACC  = 0xE0;
  233. sfr B    = 0xF0;
  234. sfr SP   = 0x81;
  235. sfr DPL  = 0x82;
  236. sfr DPH  = 0x83;
  237. sfr PCON = 0x87;
  238. sfr TCON = 0x88;
  239. sfr TMOD = 0x89;
  240. sfr TL0  = 0x8A;
  241. sfr TL1  = 0x8B;
  242. sfr TH0  = 0x8C;
  243. sfr TH1  = 0x8D;
  244. sfr IE   = 0xA8;
  245. sfr IP   = 0xB8;
  246. sfr SCON = 0x98;
  247. sfr SBUF = 0x99;

  248. /*  80C51Fx/Rx Extensions  */
  249. sfr AUXR   = 0x8E;
  250. sfr AUXR1  = 0xA2;
  251. sfr SADDR  = 0xA9;
  252. sfr IPH    = 0xB7;
  253. sfr SADEN  = 0xB9;
  254. sfr T2CON  = 0xC8;
  255. sfr T2MOD  = 0xC9;
  256. sfr RCAP2L = 0xCA;
  257. sfr RCAP2H = 0xCB;
  258. sfr TL2    = 0xCC;
  259. sfr TH2    = 0xCD;

  260. /* PCA SFR
  261. sfr CCON   = 0xD8;
  262. sfr CMOD   = 0xD9;
  263. sfr CCAPM0 = 0xDA;
  264. sfr CCAPM1 = 0xDB;
  265. sfr CCAPM2 = 0xDC;
  266. sfr CCAPM3 = 0xDD;
  267. sfr CCAPM4 = 0xDE;
  268. sfr CL     = 0xE9;
  269. sfr CCAP0L = 0xEA;
  270. sfr CCAP1L = 0xEB;
  271. sfr CCAP2L = 0xEC;
  272. sfr CCAP3L = 0xED;
  273. sfr CCAP4L = 0xEE;
  274. sfr CH     = 0xF9;
  275. sfr CCAP0H = 0xFA;
  276. sfr CCAP1H = 0xFB;
  277. sfr CCAP2H = 0xFC;
  278. sfr CCAP3H = 0xFD;
  279. sfr CCAP4H = 0xFE;
  280. */

  281. /*  BIT Registers  */
  282. /*  PSW   */
  283. sbit CY   = PSW^7;
  284. sbit AC   = PSW^6;
  285. sbit F0   = PSW^5;
  286. sbit RS1  = PSW^4;
  287. sbit RS0  = PSW^3;
  288. sbit OV   = PSW^2;
  289. sbit F1   = PSW^1;
  290. sbit P    = PSW^0;

  291. /*  TCON  */
  292. sbit TF1  = TCON^7;
  293. sbit TR1  = TCON^6;
  294. sbit TF0  = TCON^5;
  295. sbit TR0  = TCON^4;
  296. sbit IE1  = TCON^3;
  297. sbit IT1  = TCON^2;
  298. sbit IE0  = TCON^1;
  299. sbit IT0  = TCON^0;

  300. /*  IE   */
  301. sbit EA   = IE^7;
  302. sbit EC   = IE^6;
  303. sbit ET2  = IE^5;
  304. sbit ES   = IE^4;
  305. sbit ET1  = IE^3;
  306. sbit EX1  = IE^2;
  307. sbit ET0  = IE^1;
  308. sbit EX0  = IE^0;

  309. /*  IP   */
  310. /*  sbit PPC  = IP^6;*/
  311. sbit PT2  = IP^5;
  312. sbit PS   = IP^4;
  313. sbit PT1  = IP^3;
  314. sbit PX1  = IP^2;
  315. sbit PT0  = IP^1;
  316. sbit PX0  = IP^0;

  317. /*  P3  */
  318. sbit RD   = P3^7;
  319. sbit WR   = P3^6;
  320. sbit T1   = P3^5;
  321. sbit T0   = P3^4;
  322. sbit INT1 = P3^3;
  323. sbit INT0 = P3^2;
  324. sbit TXD  = P3^1;
  325. sbit RXD  = P3^0;

  326. /*  SCON  */
  327. sbit SM0  = SCON^7; // alternatively "FE"
  328. sbit FE   = SCON^7;
  329. sbit SM1  = SCON^6;
  330. sbit SM2  = SCON^5;
  331. sbit REN  = SCON^4;
  332. sbit TB8  = SCON^3;
  333. sbit RB8  = SCON^2;
  334. sbit TI   = SCON^1;
  335. sbit RI   = SCON^0;
  336.             
  337. /*  P1  */
  338. /* PCA
  339. sbit CEX4 = P1^7;
  340. sbit CEX3 = P1^6;
  341. sbit CEX2 = P1^5;
  342. sbit CEX1 = P1^4;
  343. sbit CEX0 = P1^3;
  344. sbit ECI  = P1^2;
  345. */

  346. sbit T2EX = P1^1;
  347. sbit T2   = P1^0;

  348. /*  T2CON  */
  349. sbit TF2   = T2CON^7;
  350. sbit EXF2  = T2CON^6;
  351. sbit RCLK  = T2CON^5;
  352. sbit TCLK  = T2CON^4;
  353. sbit EXEN2 = T2CON^3;
  354. sbit TR2   = T2CON^2;
  355. sbit C_T2  = T2CON^1;
  356. sbit CP_RL2= T2CON^0;

  357. /*  CCON  */
  358. /*  PCA
  359. sbit CF    = CCON^7;
  360. sbit CR    = CCON^6;

  361. sbit CCF4  = CCON^4;
  362. sbit CCF3  = CCON^3;
  363. sbit CCF2  = CCON^2;
  364. sbit CCF1  = CCON^1;
  365. sbit CCF0  = CCON^0;
  366. */

  367. /////////////////////////////////////////////////

  368. #endif


bst_car.h
  1. #ifndef __BSTCAR_H__
  2. #define __BSTCAR_H__
  3. /************51 Bluetooth car头文件*************/


  4. //定义小车驱动输入IO口
  5. sbit IN1=P1^2;
  6. sbit IN2=P1^3;
  7. sbit IN3=P1^6;
  8. sbit IN4=P1^7;
  9. sbit EN1=P1^4;
  10. sbit EN2=P1^5;

  11. //定义蜂鸣器驱动IO口
  12. sbit FM=P2^3;

  13. //定义车灯驱动IO口
  14. sbit FIRE = P2^7;


  15. #define Left_moto_go   {IN1=0,IN2=1;}      //左轮前进               
  16. #define Right_moto_go   {IN3=1,IN4=0;}     //右轮前进

  17. #define Left_moto_back   {IN1=1,IN2=0;}    //左轮后退
  18. #define Right_moto_back   {IN3=0,IN4=1;}   //右轮后退

  19. #define Left_moto_Stop   {IN1=0,IN2=0;}    //左轮停转   //EN1=0;
  20. #define Right_moto_Stop   {IN3=0,IN4=0;}   //右轮停转   //EN2=0;

  21. #endif
reg51.h
  1. #ifndef __STC89C5xRC_RDP_H__
  2. #define __STC89C5xRC_RDP_H__

  3. /////////////////////////////////////////////////

  4. /* The following is STC additional SFR */

  5. /* sfr  AUXR  = 0x8e; */
  6. /* sfr  AUXR1 = 0xa2; */
  7. /* sfr  IPH   = 0xb7; */

  8. sfr  P4  = 0xe8;
  9. sbit P46 = P4^6;
  10. sbit P45 = P4^5;       //ISP下载需勾选"ALE脚用作P4.5口"
  11. sbit P44 = P4^4;
  12. sbit P43 = P4^3;
  13. sbit P42 = P4^2;
  14. sbit P41 = P4^1;
  15. sbit P40 = P4^0;

  16. sfr  XICON = 0xc0;

  17. sfr  WDT_CONTR = 0xe1;

  18. sfr ISP_DATA  = 0xe2;
  19. sfr ISP_ADDRH = 0xe3;
  20. sfr ISP_ADDRL = 0xe4;
  21. sfr ISP_CMD   = 0xe5;
  22. sfr ISP_TRIG  = 0xe6;
  23. sfr ISP_CONTR = 0xe7;

  24. /* Above is STC additional SFR */

  25. /*--------------------------------------------------------------------------
  26. REG51F.H

  27. Header file for 8xC31/51, 80C51Fx, 80C51Rx+
  28. Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.
  29. All rights reserved.

  30. Modification according to DataSheet from April 1999
  31. - SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives
  32. --------------------------------------------------------------------------*/

  33. /*  BYTE Registers  */
  34. sfr P0   = 0x80;
  35. sbit P00 = P0^0;
  36. sbit P01 = P0^1;
  37. sbit P02 = P0^2;
  38. sbit P03 = P0^3;
  39. sbit P04 = P0^4;
  40. sbit P05 = P0^5;
  41. sbit P06 = P0^6;
  42. sbit P07 = P0^7;
  43. sfr P1   = 0x90;
  44. sbit P10 = P1^0;
  45. sbit P11 = P1^1;
  46. sbit P12 = P1^2;
  47. sbit P13 = P1^3;
  48. sbit P14 = P1^4;
  49. sbit P15 = P1^5;
  50. sbit P16 = P1^6;
  51. sbit P17 = P1^7;
  52. sfr P2   = 0xA0;
  53. sbit P20 = P2^0;
  54. sbit P21 = P2^1;
  55. sbit P22 = P2^2;
  56. sbit P23 = P2^3;
  57. sbit P24 = P2^4;
  58. sbit P25 = P2^5;
  59. sbit P26 = P2^6;
  60. sbit P27 = P2^7;
  61. sfr P3   = 0xB0;
  62. sbit P30 = P3^0;
  63. sbit P31 = P3^1;
  64. sbit P32 = P3^2;
  65. sbit P33 = P3^3;
  66. sbit P34 = P3^4;
  67. sbit P35 = P3^5;
  68. sbit P36 = P3^6;
  69. sbit P37 = P3^7;
  70. sfr PSW  = 0xD0;
  71. sfr ACC  = 0xE0;
  72. sfr B    = 0xF0;
  73. sfr SP   = 0x81;
  74. sfr DPL  = 0x82;
  75. sfr DPH  = 0x83;
  76. sfr PCON = 0x87;
  77. sfr TCON = 0x88;
  78. sfr TMOD = 0x89;
  79. sfr TL0  = 0x8A;
  80. sfr TL1  = 0x8B;
  81. sfr TH0  = 0x8C;
  82. sfr TH1  = 0x8D;
  83. sfr IE   = 0xA8;
  84. sfr IP   = 0xB8;
  85. sfr SCON = 0x98;
  86. sfr SBUF = 0x99;

  87. /*  80C51Fx/Rx Extensions  */
  88. sfr AUXR   = 0x8E;
  89. sfr AUXR1  = 0xA2;
  90. sfr SADDR  = 0xA9;
  91. sfr IPH    = 0xB7;
  92. sfr SADEN  = 0xB9;
  93. sfr T2CON  = 0xC8;
  94. sfr T2MOD  = 0xC9;
  95. sfr RCAP2L = 0xCA;
  96. sfr RCAP2H = 0xCB;
  97. sfr TL2    = 0xCC;
  98. sfr TH2    = 0xCD;

  99. /* PCA SFR
  100. sfr CCON   = 0xD8;
  101. sfr CMOD   = 0xD9;
  102. sfr CCAPM0 = 0xDA;
  103. sfr CCAPM1 = 0xDB;
  104. sfr CCAPM2 = 0xDC;
  105. sfr CCAPM3 = 0xDD;
  106. sfr CCAPM4 = 0xDE;
  107. sfr CL     = 0xE9;
  108. sfr CCAP0L = 0xEA;
  109. sfr CCAP1L = 0xEB;
  110. sfr CCAP2L = 0xEC;
  111. sfr CCAP3L = 0xED;
  112. sfr CCAP4L = 0xEE;
  113. sfr CH     = 0xF9;
  114. sfr CCAP0H = 0xFA;
  115. sfr CCAP1H = 0xFB;
  116. sfr CCAP2H = 0xFC;
  117. sfr CCAP3H = 0xFD;
  118. sfr CCAP4H = 0xFE;
  119. */

  120. /*  BIT Registers  */
  121. /*  PSW   */
  122. sbit CY   = PSW^7;
  123. sbit AC   = PSW^6;
  124. sbit F0   = PSW^5;
  125. sbit RS1  = PSW^4;
  126. sbit RS0  = PSW^3;
  127. sbit OV   = PSW^2;
  128. sbit F1   = PSW^1;
  129. sbit P    = PSW^0;

  130. /*  TCON  */
  131. sbit TF1  = TCON^7;
  132. sbit TR1  = TCON^6;
  133. sbit TF0  = TCON^5;
  134. sbit TR0  = TCON^4;
  135. sbit IE1  = TCON^3;
  136. sbit IT1  = TCON^2;
  137. sbit IE0  = TCON^1;
  138. sbit IT0  = TCON^0;

  139. /*  IE   */
  140. sbit EA   = IE^7;
  141. sbit EC   = IE^6;
  142. sbit ET2  = IE^5;
  143. sbit ES   = IE^4;
  144. sbit ET1  = IE^3;
  145. sbit EX1  = IE^2;
  146. sbit ET0  = IE^1;
  147. sbit EX0  = IE^0;

  148. /*  IP   */
  149. /*  sbit PPC  = IP^6;*/
  150. sbit PT2  = IP^5;
  151. sbit PS   = IP^4;
  152. sbit PT1  = IP^3;
  153. sbit PX1  = IP^2;
  154. sbit PT0  = IP^1;
  155. sbit PX0  = IP^0;

  156. /*  P3  */
  157. sbit RD   = P3^7;
  158. sbit WR   = P3^6;
  159. sbit T1   = P3^5;
  160. sbit T0   = P3^4;
  161. sbit INT1 = P3^3;
  162. sbit INT0 = P3^2;
  163. sbit TXD  = P3^1;
  164. sbit RXD  = P3^0;

  165. /*  SCON  */
  166. sbit SM0  = SCON^7; // alternatively "FE"
  167. sbit FE   = SCON^7;
  168. sbit SM1  = SCON^6;
  169. sbit SM2  = SCON^5;
  170. sbit REN  = SCON^4;
  171. sbit TB8  = SCON^3;
  172. sbit RB8  = SCON^2;
  173. sbit TI   = SCON^1;
  174. sbit RI   = SCON^0;
  175.             
  176. /*  P1  */
  177. /* PCA
  178. sbit CEX4 = P1^7;
  179. sbit CEX3 = P1^6;
  180. sbit CEX2 = P1^5;
  181. sbit CEX1 = P1^4;
  182. sbit CEX0 = P1^3;
  183. sbit ECI  = P1^2;
  184. */

  185. sbit T2EX = P1^1;
  186. sbit T2   = P1^0;

  187. /*  T2CON  */
  188. sbit TF2   = T2CON^7;
  189. sbit EXF2  = T2CON^6;
  190. sbit RCLK  = T2CON^5;
  191. sbit TCLK  = T2CON^4;
  192. sbit EXEN2 = T2CON^3;
  193. sbit TR2   = T2CON^2;
  194. sbit C_T2  = T2CON^1;
  195. sbit CP_RL2= T2CON^0;

  196. /*  CCON  */
  197. /*  PCA
  198. sbit CF    = CCON^7;
  199. sbit CR    = CCON^6;

  200. sbit CCF4  = CCON^4;
  201. sbit CCF3  = CCON^3;
  202. sbit CCF2  = CCON^2;
  203. sbit CCF1  = CCON^1;
  204. sbit CCF0  = CCON^0;
  205. */

  206. /////////////////////////////////////////////////

  207. #endif

以上代码基于开源代码修改,另外可以借助AI编写代码,对于基础比较薄弱的爱好者来说非常利好。

通过通译灵码还可以对代码进行分析注释,甚至生成测试程序





代码编译
代码的编译需要使用到keil,需要下载MDK-ARM,C51,C251。下载地址:https://www.keil.com/download/product/烧录固件需要使用STC-ISP工具,下载地址:https://www.stcai.com/gjrj







固件烧录
这里需要注意,串口工具TX、RX分别连接最小系统RXD、TXD,将串口工具插入电脑,打开STC-ISP工具后,选择芯片型号为STC89C52RC,扫描串口,选择你串口工具的COM端口,点击打开程序文件,选择使用keil进行编译之后生成的.hex格式固件,点击 下载/编程 按钮,同时把串口工具GND VCC插到最小系统板上,操作无误的话,程序会烧录进单片机,程序操作日志中有提示烧录完成。





我第一次使用51单片机,这一步折腾过很多次,更换了2个串口工具,究其然是需要掌握正确的烧录步骤。

遥控体验



小车遥控可以通过上面这两个软件,蓝牙小车APP或者HC蓝牙助手

蓝牙小车软件是别人开源的,搜索蓝牙模块信号,输入配对码1234进行连接,连接成功即可进行操作

HC蓝牙助手是汇承科技开发的调试工具,搜素到HC-05后进行连接

可以对按钮进行设置,这里有方向按钮和按钮组

设置按钮名称和发送的值(代码中定义的值)




设置完毕后关闭该按钮即可进行调试



同理设置其他按钮
还可以在通信界面发送其他值进行调试控制

关于供电

电路设计是需要2颗18650电池进行串联供电,手头只有自己为随身WIFI棒子DIY的电源,只能提供5V输出,接入系统后电机勉强能动一下

后来细看原理图,L293D是需要2组电压供电的,考虑到L7805还是比较耐压的,于是把TP路由器的电源接入小车,9V 600mA输出,恰好可以正常工作。


关于拓展
后续可以加入家中吃灰的超声波模块、红外避障模块等,对小车功能做进一步增强,当然也可以使用ESP-32、安信Ai-M61-32S开发板、甚至合宙Air780E、移远EC600S开发板替代51最小系统作为主控,学习尝试WIFI、4G控制的小车,实现ESP32-CAM摄像头图传、GPS定位等功能。


鸣谢
感谢21ic项目外包平台提供的此次DIY机会,最后在晒晒我的娃,希望他们将来也能够爱上电子技术,能够成为从业者,为我们国家的信息与电子产业添砖加瓦!









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| molun 发表于 2023-12-5 11:18 | 显示全部楼层
大家的车车都有啥新**?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

94

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部