|
遥控车是基于STC89C52RC单片机开发,车体组成有底盘,直流电机33GB-520-18.7,L298N电机驱动模块,LM2596降压模块,12V DC电源,HC-05蓝牙模块。其中HC-05蓝牙模块与单片机是串口通信所以要注意连线,STC89C52RC中P3^0,P3^1为串口引脚,具体连线如下示意图:
本次制作目的是:通过手机蓝牙调试器发送信号控制车辆的前进,后退,原地左转,原地右转,单独左转,单独右转,舵机扫描以及寻迹模式的切换(在这里声明一下,本次代码的寻迹模式切换模式还不太完善,未达到理想效果,电子发烧友们可以多多指点。在下学艺不精,在接下来的解说中如有错误望大佬纠正。)手机采用蓝牙调试器,需要自己进行按键编辑以及字符发送。
程序编译好后即可烧录,对手机上的蓝牙调试器进行相应字符编辑即可进行操作。对于想基于此程序继续开发的朋友们,如果加入更多功能函数时操作未响应,建议你们逐条加入排除问题。
谢谢大家的认真阅读,有更好的逻辑可以留言。
将硬件设备搭建完成后,我们即将开始软件的编程:
话不多说,单片机代码走起!!!哈哈
- #include <reg52.h> //头文件
- #include <intrins.h>
- 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<t;a++)
- for(b=0;b<120;b++);
- }
- 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();
- // delay1ms();
- // delay500us();
- // PWM1=0;
- // for(i=0;i<17;i++)
- // delay1ms();
- // delay500us();
- // PWM1=0;
- // for(i=0;i<20;i++)
- // delay1ms();
- // }
- //}
- void Cont() // 数据处理函数
- {
- switch(Com)
- {
- case '5':
- motor1=0;
- motor2=0;
- motor3=0;
- motor4=0;
- Send(Com);
- break;
- case '2':
- qianjin();
- Send(Com);
- break;
- case '4':
- zuozhuan();
- Send(Com);
- break;
- case '6':
- youzhuan();
- Send(Com);
- break;
- case '8':
- houtui();
- Send(Com);
- break;
- case '1':
- xunji();
- Send(Com);
- break;
- case '9':
- L2_45();
- delay(30);
- L2_90();
- delay(30);
- L2_135();
- delay(30);
- L2_45();
- delay(30);
- L2_90();
- delay(30);
- L2_135();
- delay(30);
- L2_90();
- Send(Com);
- break;
- case 'F':
- YOU();
- Send(Com);
- break;
- case 'E':
- ZUO();
- Send(Com);
- break;
- default:
-
- motor1=0;
- motor2=0;
- motor3=0;
- motor4=0;
- Send(Com);
- }
- }
复制代码
以上程序打包下载:
蓝牙.zip
(20.86 KB, 下载次数: 38)
|
评分
-
查看全部评分
|