遥控车是基于STC89C52RC单片机开发,车体组成有底盘,直流电机33GB-520-18.7,L298N电机驱动模块,LM2596降压模块,12V DC电源,HC-05蓝牙模块。其中HC-05蓝牙模块与单片机是串口通信所以要注意连线,STC89C52RC中P3^0,P3^1为串口引脚,具体连线如下示意图:
本次制作目的是:通过手机蓝牙调试器发送信号控制车辆的前进,后退,原地左转,原地右转,单独左转,单独右转,舵机扫描以及寻迹模式的切换(在这里声明一下,本次代码的寻迹模式切换模式还不太完善,未达到理想效果,电子发烧友们可以多多指点。在下学艺不精,在接下来的解说中如有错误望大佬纠正。)手机采用蓝牙调试器,需要自己进行按键编辑以及字符发送。
程序编译好后即可烧录,对手机上的蓝牙调试器进行相应字符编辑即可进行操作。对于想基于此程序继续开发的朋友们,如果加入更多功能函数时操作未响应,建议你们逐条加入排除问题。
谢谢大家的认真阅读,有更好的逻辑可以留言。
将硬件设备搭建完成后,我们即将开始软件的编程:
话不多说,单片机代码走起!!!哈哈
#include #include sbit blackorwhite1=P2^5;//黑白传感器定义引脚 sbit blackorwhite2=P2^6; sbit blackorwhite3=P2^7; sbit motor1=P1^0; sbit motor2=P1^1;//电机1定义引脚 sbit motor3=P1^3; sbit motor4=P1^4;//电机2定义引脚 sbit PWM1=P2^0;//SG90信号定义引脚 typedef unsigned char uc; typedef unsigned int ui; //复杂名称函数的替代 uc Com; int i; void Init(); //在这里一定要注意在main()函数后的子函数要进行声明,不声明虽然不会报错但有可能会忽略子函数导致一些功能不能实现 void Send(uc a); void Cont(); void qianjin(); void houtui(); void youzhuan(); void zuozhuan(); void xunji(); //void L2_0(); void L2_45(); void L2_90(); void L2_135(); //void L2_180(); void delay(int t); void delayx1ms(int x); void delay1ms(); void delay500us(); void ZUO(); void YOU(); void delay(int t) //延迟函数 { int a,b; for(a=0;a } void delayx1ms(int x) { unsigned char a,b; for(x;x>0;x--) for(b=102;b>0;b--) for(a=3;a>0;a--); } void delay1ms() { unsigned char a,b; for(b=102;b>0;b--) for(a=3;a>0;a--); } void delay500us() { unsigned char a,b; for(b=1;b>0;b--) for(a=227;a>0;a--); } void main() // 主函数 { Init(); // 串口初始化函数调用 while (1) { if (RI==1) // 判断是否有数据 { RI = 0; // 置0 Com = SBUF; // 暂时存放接收的数据 Cont(); // 调用数据处理函数 } } } void Init() //串口初始化 { ES=0; //中断关闭 SCON = 0x50; // 串行控制寄存器 01010000串口工作方式1并允许中断接收数据 TMOD = 0x20; // 定时器/计[color=rgb(34, 34, 34)][backcolor=rgb(248, 248, 248)][font=PingFang SC,Arial,5FAE软雅黑,5B8B体,simsun,sans-serif][size=0.48] [/font][/backcolor][/color]数器1设置为工作方式 TH1=TL1=0xFD; // 设置波特率9600=110592*1000000/12/(0x100-0xfd)/32 本次实验晶振(11.0592) PCON &= 0x7f; // 波特率不倍增 TR1 = 1; // 开启定时器1 TI=0; // 发送中断位 RI=0; // 接收中断位 ES=1; // 开启串口中断 motor1=0; motor2=0; // 电机初始化 motor3=0; motor4=0; } void Send(uc a) //单字节数据发送 { TI=0; // TI是串口接收标志位 SBUF=a; //SBUF---即串口数据缓冲寄存器 将数据存入 while (TI==0) ;//等待发送结束 TI=0; //清零 } void qianjin() //前进功能函数 { motor1=1; motor2=0; motor3=1; motor4=0; } void zuozhuan() //原地左转功能函数 { motor1=0; motor2=1; motor3=1; motor4=0; } void youzhuan() //原地右转功能函数 { motor1=1; motor2=0; motor3=0; motor4=1; } void houtui() //后退功能函数 { motor1=0; motor2=1; motor3=0; motor4=1; } void ZUO() // 单独左转功能函数 { motor1=0; motor2=0; motor3=1; motor4=0; } void YOU() // 单独右转功能函数 { motor1=1; motor2=0; motor3=0; motor4=0; } void xunji() //寻迹模式切换 功能函数 { // while(1) { if((blackorwhite1==1)&& (blackorwhite2==0)&&(blackorwhite3==1)) qianjin(); else if ((blackorwhite1==0&&blackorwhite2==0&&blackorwhite3==1)||(blackorwhite1==0&&blackorwhite2==1&&blackorwhite3==1)) zuozhuan(); else if((blackorwhite1==1&&blackorwhite2==1&&blackorwhite3==0)||(blackorwhite1==1&&blackorwhite2==0&&blackorwhite3==0)) youzhuan(); else if ((blackorwhite1==0)&&(blackorwhite2==0)&&(blackorwhite3==0)) qianjin(); else houtui(); } } //void L2_0() SG90舵机0度函数 若需要可以解禁此功能 /{ // int i,j; // for(j=0;j<43;j++) // { // PWM1=1; // delay500us(); // // delay1ms(); // PWM1=0; // for(i=0;i<19;i++) // delay1ms(); // delay500us(); // PWM1=0; // for(i=0;i<20;i++) // delay1ms(); // } //} void L2_45() //舵机45度旋转函数 { int i,j; for(j=0;j<43;j++) { PWM1=1; // delay500us(); delay1ms(); PWM1=0; for(i=0;i<20;i++) delay1ms(); // delay500us(); PWM1=0; for(i=0;i<21;i++) delay1ms(); } } void L2_90() //舵机90度旋转函数 { int i,j; for(j=0;j<43;j++) { PWM1=1; delay1ms(); delay500us(); PWM1=0; for(i=0;i<18;i++) delay1ms(); delay500us(); PWM1=0; for(i=0;i<20;i++) delay1ms(); } } void L2_135() //舵机135度旋转函数 { int i,j; for(j=0;j<43;j++) { PWM1=1; delay1ms(); delay1ms(); // delay500us(); PWM1=0; for(i=0;i<18;i++) delay1ms(); // delay500us(); PWM1=0; for(i=0;i<20;i++) delay1ms(); } } //void L2_180() //舵机180度旋转函数,有需要可解禁此功能 //{ // int i,j; // for(j=0;j<43;j++) // { // PWM1=1; // delay1ms();
上一篇:Proteus仿真LCD12864液晶显示极详细的教程
下一篇:基于51单片机的串口控制led灯的亮灭源程序
推荐阅读最新更新时间:2024-11-13 11:53
设计资源 培训 开发板 精华推荐
- LTM4632EY 2 模块并联、3.6V 至 15V 输入、1.2V/6A VDDQ、0.6V/±6A VTT 和 10mA VTTR 设计的典型应用电路
- 基于ISD4004-12M录音回放的ISD-ES302、ES302演示板
- LT2940IMS 120W 电源监视器的典型应用电路包括 ICC
- 使用 Analog Devices 的 LTC2415-1CGN 的参考设计
- C8051F800DK、8051 MCU 开发套件旨在用作 C8051F336 微控制器的开发平台
- LTC1655CS8 的典型应用,用于数字可编程电流源的 16 位轨至轨微功率 DAC
- 具有双输入的 LTC3126EUFD 5V、2MHz 降压转换器的典型应用电路
- 使用 NXP Semiconductors 的 MC34SB0410AE 的参考设计
- 基于运算放大器的多功能扩展板,用于STM32 Nucleo
- 符合 IrDA 标准的发射器/接收器