1、蓝牙小车作品展示河南理工大学 电器开发部电子作品设计报告题目:手机控制的蓝牙小车姓 名: 学 号: 专业班级: 指导人员: 所在学院: 电气学院 2015 年 4 月24 日摘要 本设计是做成这样的一款蓝牙小车,灵感来自于无线电-一本偶然碰到的书,书中对车的制作勾起了我对童年的回忆。我曾经玩过四驱赛车,也玩过遥控车,但还没有玩过通过手机便可控制的蓝牙小车,所以头脑发热从京东上买了一辆小遥控车决定自己改装一下。当各种模块都做好之后,我先仔细研究了几天L298N电路原理,然后我下载了好几种手机蓝牙软件通过比较确定了一款好用的。然后我对51单片机最小系统进行了简化,只留下了晶振电路,这样不仅不影响整
2、体功能的实现,也减少了投入成本和工作量。 通过改装买来的遥控小车,将其遥控设备用手机蓝牙代替,将从360助手上下载的蓝牙小车软件作为上位机,将拥有hc06蓝牙模块的蓝牙小车作为下位机,将L298作为小车的电机驱动。可以实现小车的前进、后退、左拐、右拐、刹车、重力感应、加速、减速等功能。做完这件作品我的收获有很多,对单片机的一些知识有了更深一步的理解。同时给了我一种畅想,我畅想着未来我们将会用手机控制我们所有的家用电器,不再需要那么多的遥控器了,我们的生活将会更便捷。这也是我的梦想,用科技改变生活。1 概述.4 2 系统总体方案及硬件设计.5 2.1 L298N 电机驱动模块.5 2.2 HC0
3、6 蓝牙模块说明.5 2.3 最小系统板说明.5 3课程设计体会.6附1:源程序代码 .7附2:系统原理图 .231 概述 通过改装买来的遥控小车,将其遥控设备用手机蓝牙代替,将从360助手上下载的蓝牙小车软件作为上位机,将拥有hc06蓝牙模块的蓝牙小车作为下位机,将L298作为小车的电机驱动。可以实现小车的前进、后退、左拐、右拐、刹车、重力感应、加速、减速等功能。 在我眼里没有完美的东西,只有更完美的东西,而快乐就在追求完美的路上。小车能动后我发现从网上下载的程序有错误,导致小车的左拐右拐相反,并且前进后退都会拐弯,没有加速减速。这样的作品我怎么能拿的出手?刚好那时电开给我们培训中断,定时器
4、等内容,再加上寒假我学了点C语言,便对程序进行了大刀阔斧的改革。终于前进后退左拐右拐正常了,可加减速怎么办呢?之前通过学长我稍微了解了pwm,随后我对pwm的原理深入了解了一下,我先通过借用延时函数模拟pwm让led灯渐亮渐灭随后我应用到直流电机上,结果,成功了!当然对于目前的作品,我还是觉得不太完美,我准备再给他加上转向灯、喇叭甚至更多功能。 做完这件作品我的收获有很多,对单片机的一些知识有了更深一步的理解。同时给了我一种畅想,我畅想着未来我们将会用手机控制我们所有的家用电器,不再需要那么多的遥控器了,我们的生活将会更便捷。这也是我的梦想,用科技改变生活。2 系统总体方案及硬件设计2.1 L
5、298N电机驱动模块 298n是直流电机驱动集成电路,内部包含4通道逻辑驱动电路,可以方便地驱动两个直流电机,或一个两相步进电机。l298n可接受标准ttl逻辑电平信号vss,9脚vss可接4.57v的电压。4脚vs接电源电压,vs电压范围vih为2.546v2。1脚和15管脚下的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。l298可驱动2个电动机,此时out1,out2和out3,out4之间可分别接电动机。5、7、10、12脚接输入控制电平,控制电机正反转;ena,enb脚接控制使能端,控制电机的停转3。 l298n采取输入输出并联的连接方式,即in1与in4(5脚和12脚)
6、、in2与in3(7脚和10脚)、out1与out4(2脚和14脚)、out2与out3(3脚和13脚)分别连接在一起。(电路图见附录2)2.2 HC06蓝牙模块说明 本作品使用的是hc06从机,设置其波特率为96002.3 最小系统板说明 经过多次修改简化本作品只使用了晶振电路,这样不仅对作品的功能没有影响而且减少了成本与工作量。(电路图见附录2)3课程设计及体会 做成这样的一款蓝牙小车,灵感来自于无线电-一本偶然碰到的书,书中对车的制作勾起了我对童年的回忆。我曾经玩过四驱赛车,也玩过遥控车,但还没有玩过通过手机便可控制的蓝牙小车,所以头脑发热从京东上买了一辆小遥控车决定自己改装一下。买回来
7、的当天我就把它拆了(一副很败家的样子)。当时我对单片机知识还是零基础,对于串口、中断、定时器什么的都不懂,于是我就去问负责我的学长,我说:“我要做这么个车,但我对单片机还什么都不懂,你说我可以吗?”他说:“赶紧做吧,做好的话就可以进实验室了。”激情再一次被点燃,本来只想自己做个玩的,没想到做好还能进实验室,下定决心get it!从图书馆借了基本单片机入门的书,便疯狂的搞起。 做完这件作品之后我的收获有很多,首先我对单片机的一些知识有了更深一步的理解。同时给了我一种畅想,我畅想着未来我们将会用手机控制我们所有的家用电器,不再需要那么多的遥控器了,我们的生活将会更便捷。这也是我的梦想,用科技改变生
8、活。 成功的道路是被无数的失败铺就的。当各种模块都做好之后,我迫不及待的将它们连接起来,连接蓝牙之后却发现小车没像预想的那样动起来。我XX了蓝牙模块的连接方式后发现RXD与TXD应交叉连接,交换之后,还是不能动。我又仔细研究了几天L298N电路原理,发现原来自己的电路驱动连接有错误,改过之后小车还是没反应,再次陷入绝望。我又怀疑是不是手机软件的是我又换了好几个软件,都不行。持续一个星期没有任何进展。有一天我在单片机上的txd上加了一个上拉电阻,小车奇迹般的动了,我简直欣喜若狂,赶紧跑到实验室告诉丁柯学长,可到实验室怎么连蓝牙也连不上。沮丧地又回到宿舍研究了一下午用万用表测量到底哪的问题,可什么
9、也没发现。我又一次绝望。躺在床上想既然能动一次就一定能再动一次。我要从头再来!我把原来的最小系统板扔掉,重新再焊一个,这次我把复位电路甩掉,只留下晶振电路,重新连接,这一次没再让我失望蓝牙连接非常顺利。 在我眼里没有完美的东西,只有更完美的东西,而快乐就在追求完美的路上。小车能动后我发现从网上下载的程序有错误,导致小车的左拐右拐相反,并且前进后退都会拐弯,没有加速减速。这样的作品我怎么能拿的出手?刚好那时电开给我们培训中断,定时器等内容,再加上寒假我学了点C语言,便对程序进行了大刀阔斧的改革。终于前进后退左拐右拐正常了,可加减速怎么办呢?之前通过学长我稍微了解了pwm,随后我对pwm的原理深入
10、了解了一下,我先通过借用延时函数模拟pwm让led灯渐亮渐灭随后我应用到直流电机上,结果,成功了!当然对于目前的作品,我还是觉得不太完美,我准备再给他加上转向灯、喇叭甚至更多功能。附1 源程序代码/*作品名称:蓝牙小车*作者:*功能:实现通过手机蓝牙控制小车*/#include #include #define uchar unsigned char #define uint unsigned intuchar Buffer 10 = 1; /从串口接收的数据uint i,j;sbit en1 = P24; /* L298的Enable A */ sbit en2 = P25; /* L298
11、的Enable B */ sbit s1 = P20; /* L298的Input 1 */ sbit s2 = P21; /* L298的Input 2 */ sbit s3 = P22; /* L298的Input 3 */ sbit s4 = P23; /* L298的Input 4 */uchar t = 0; /*中断计数器 */ uchar m1 = 0; /*电机1速度值 */ uchar m2 = 0; /*电机2速度值 */ uchar tmp1, tmp2; /*电机当前速度值 */ /* 函数功能: 微秒级精确延时* 参数范围: 1us65535us(0.001ms65.
12、535ms)* 运行环境: STC1232.000MHz* 最大误差: 0.00%* 作者日期: 电器开发部 - (2015-2-23)*/# pragma optimize(4, SPEED)void delay_us(unsigned int n) extern void _nop_(void); register unsigned char i = n, j = (n8); _nop_(); _nop_(); _nop_(); if (-i) | j) do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _n
13、op_(); if (0xFF = (i-) j-; else _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while (i | j); /* 毫秒延时函数 */void delay_ms(unsigned int n) while (n-) delay_us(1000);/* 名称 : Init() /系统初始化* 功能 : 初始化,晶振11.0592,波特率9600,使串口中断,同时定时器0控制PWM ?* 输入 : 无* 输出 : 无 */void Init() TMOD = 0x22; /T/c方式寄存器 PCON = 0
14、x00; /电源控制寄存器 SCON = 0x50; /UART串口控制寄存器,此处为10位异步收发 TH0 = 0x9b; /高八位 TL0 = 0x9b; /低八位 TH1 = 0xFd; /设置波特率 9600 TL1 = 0xFd; /T/c1计数寄存器低八位 TR1 = 1; /*启动定时器1 ET0 = 1; /* ET0时定时计数器0溢出中断允许控制位 ET1时定时计数器1溢出中断允许控制位*/ TR0 = 1; ES = 1; /开串口中断 EA = 1; /开总中断 void motorL( char speed) m1 = abs(speed); / 取速度的绝对值 (返回
15、数字的绝对值) if(speed 0) s1 = 0; s2 = 1; else if(speed = 0) s1 = 1; s2 = 1; else s1 = 1; s2 = 0; void motorR( char speed) m2 = abs(speed); /* 电机2的速度控制 */ if(speed 0) s3 = 0; s4 = 1; else if(speed = 0) s3 = 1; s4 = 1; else s3 = 1; s4 = 0; void GO(void) motorL(50); motorR(0); void BACK() motorL(-20); motor
16、R(0); void TR(void) motorL(20); motorR(-20); void TL(void) motorL(-20); motorR(20); void STOP(void) s1 = 1; s2 = 1; s3 = 1; s4 = 1; void SPEED1(void) /通过不同的速度,实现加减速 s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1); s1 = 1; delay_us(10000); void SPEED2(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(100);
17、s1 = 1; delay_us(1000); void SPEED3(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(200); s1 = 1; delay_us(1000); void SPEED4(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(300); s1 = 1; delay_us(100); void SPEED5(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(400); s1 = 1; delay_us(100); void SPEED6
18、(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(500); s1 = 1; delay_us(100); void SPEED7(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(600); s1 = 1; delay_us(100); void SPEED8(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(700); s1 = 1; delay_us(100); void SPEED9(void) s2 = 1; s3 = 1; s4 = 1; s1 =
19、0; delay_us(800); s1 = 1; delay_us(100); void SPEED10(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(900); s1 = 1; delay_us(100); void SPEED11(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1000); s1 = 1; delay_us(100); void SPEED12(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1100); s1 = 1; delay
20、_us(100); void SPEED13(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1200); s1 = 1; delay_us(100); void SPEED14(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1300); s1 = 1; delay_us(100);void SPEED15(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1400); s1 = 1; delay_us(100); void SPEED16(void) s2
21、 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1500); s1 = 1; delay_us(100); void SPEED17(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1600); s1 = 1; delay_us(100); void SPEED18(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(1700); s1 = 1; delay_us(100); void SPEED19(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0;
22、delay_us(1900); s1 = 1; delay_us(100); void SPEED20(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(2000); s1 = 1; delay_us(100); void SPEED21(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(2100); s1 = 1; delay_us(100); void SPEED22(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(2200); s1 = 1; delay_
23、us(100); void SPEED23(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(2300); s1 = 1; delay_us(100); void SPEED24(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(2400); s1 = 1; delay_us(100); void SPEED25(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(2500); s1 = 1; delay_us(100); void SPEED26(void) s2
24、 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(2600); s1 = 1; delay_us(100); void SPEED27(void) s2 = 1; s3 = 1; s4 = 1; s1 = 0; delay_us(2700); s1 = 1; delay_us(100); void main(void) delay_ms(100); Init(); /初始化 while(1) switch(Buffer0) case 1: STOP(); break; case 4: GO(); break; case 5: TL(); break; case 7:
25、 BACK(); break; case 6: TR(); break; case 0x7D:SPEED1(); break; case 0x82:SPEED2(); break; case 0x87:SPEED3(); break; case 0x8C:SPEED4(); break; case 0x91:SPEED5(); break; case 0x96:SPEED6(); break; case 0x9B:SPEED7(); break; case 0xA0:SPEED8(); break; case 0xA5:SPEED9(); break; case 0xAA:SPEED10();
26、break; case 0xAF:SPEED11();break; case 0xB4:SPEED12();break; case 0xB9:SPEED13();break; case 0xBE:SPEED14();break; case 0xC3:SPEED15();break; case 0xC8:SPEED16();break; case 0xCD:SPEED17();break; case 0xD2:SPEED18();break; case 0xD7:SPEED19();break; case 0xDC:SPEED20();break; case 0xE1:SPEED21();break; case 0xE6:SPEED22();break; case 0xEB:SPEED23();break;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1