前不久在网上发了《led金字塔》教程,得到了不少好评,很多单片机爱好者都向我咨询关于金字塔或立方体,作品得到大家的肯定自然是值得欣慰的。和极客迷的管理交流了各自的想法后,我打算把极客迷网站作为展示自己工作室设计的平台,以后会更多的上传51单片机作品,并且公开全部资料和程序代码。
在正式讲解之前,先简单的自我介绍下我的工作室。工作室取名为“Chinked-out”是王力宏曲风的名字,取这个的名字的意义在于,我更注重表达的内容,而不是表达的方式,加上自己非常喜欢Chinked-out的曲风,所以就想了这个名字
本工作室由重庆三峡职业学院信息科技系和机械与电子工程系共同成立,其目的在于改善教学质量,培养学生对单片机的学习兴趣。为了好的利用互联网平台来拓展工作室的知识面和交往面,广交51单片机爱好者,特此做开源性的DIY设计和单片机课程。目前工作室人数不多,作品产量不高,期待有能力者加入,共同建立一个开源、开放的团队,一起学习,一起进步!!!联系群:231931086,联系人QQ:136678431
我对开源的理解:其实,很多51制作网上都是有现成资料的,但是因为种种原因,要么是电路不全,要么是程序只有部分,这种情况想必困扰过每一个单片机初学者,即便是有现成全套资料,但是在制作过程中遇到了问题,又无从询问,这也是单片机初学者的一大难题,在这里我代表工作室向大家保证,所有制作教程和课程教材本人都亲自实验,确保正确性。至于程序代码,全部开源,不做任何保留,而且也会给出详细的中文注释,现在只能给出汇编或者C语言的教程,后期会给出双语教程,敬请期待!
关于转载:我写的所有文章只发表在极客迷里(首创作品也会投稿和另一网站),绝不会再有第三网站登出我们工作室的文章,如果您觉得工作室的作品比较好,请您把极客迷的网址发给你的朋友,一起学习交流,如果您觉得又不足之处或者发现错误,请联系我QQ:136678431,如需教学性的转载,请务必著名出处和原作者(本人网名Chinked-out实名李志远),在此,我希望各位读者尊重开源人的劳动成果。尽管现在的作品没有什么技术含量,但是做到了真正的开源,相信以后有大家的一起努力,会做出更好的作品,形成良性循环,这样对大家都好。我代表全体工作室成员对所有尊重我们劳动成果的读者表达最真挚的谢意!!!希望大家和我们一起把极客迷建设成为51初学者、单片机开源教程的良好平台。
好了,说了这么多,现在就开始进入教程。
小车参数:控制键5个:前进、后退、左转、右转、停止;有效距离200米;速度:
我想遥控小车大家都玩过,网上也有各种DIY小车的制作详解,我做的这个遥控小车和其他的作品大同小异,但作为单片机设计,这次设计我主要强调单片机控制,就是说,这个小车是由单片机控制的,这次我把单片机按键发送程序、无线模块使用、电机驱动作为本教程的核心内容。
一 硬件组装
1 小车运动部分
此图是我师弟组装好的,请大家作为参考
所需工件:直流电机4个,L293D电机驱动模块,蓄电池一块,车身底盘
说明:车身底盘大家根据自己的购买力自行购买,蓄电池也是,至于L293D模块,淘宝上卖的比较贵,不过我用的就是成品模块,效果非常好,钱不多的同学可以自己买芯片,自制模块,原理很简单,官方资料是很详细的;或者改为继电器控制都可以,具体看自己的实际购买力。用模块的好处是,模块可以输出5V电源给系统供电,详细请参考淘宝网。
如果你买的是现成的底盘,那就和我的一样了,组装实在是没啥可说的,把电机固定上去就是,不行?别开玩笑了,小学生都会的!至于想自己做底盘的,我想说,要搞结实点,咱这次的小车马力是很足的,因为有电机驱动,速度比较快(不带减速齿轮的底盘一定要小心,速度非常的快),后劲也足,不小心撞墙很正常,所以不好的底盘就得小心了!
组装好后,就是电机和驱动模块的接线了,下面我就详细的说一下L293D模块的使用:
L293D是专门的电机驱动芯片,工作电压5V,驱动电压输入可达36V,输出电流正负600ma,4个控制端,4个输出端,原理如
图:
其中A为输出控制端,Y为输出控制端,1A即控制1Y,以此类推。1,2EN 3,4EN需要短接,芯片最大工作电压不得超过7V。
封装图:
Vcc1接工作电压,5V,Vcc2接电机的驱动电源,一般来说,这个电压要比5V高,我用的是12V蓄电池,就把12v的正极接到VCC2,要记住的是,芯片、单片机、蓄电池电源是需要共地的,不要觉得你电机是12V,单片机控制部分是5V就把电源完全独立开来,正极是完全独立的没错,但是GND(负极)都必须是接在一起的。
驱动芯片与电机的接法:
例:左边前后轮:
1Y接电机红线,2Y接电机黑线,左边前轮电机
3Y接电机红线,4Y接电机黑线,左边后轮电机
前进指令:1A=1(输出12V),2A=0(输出0V),3A=1(输出12V),4A=0(输出0V)
后退指令:1A=0(输出12V),2A=1(输出0V),3A=0(输出12V),4A=1(输出0V)
右边的和左边的接法是完全一样的
注意:前进和后退并不是绝对的,因为是直流电机,不刻意的强调正负极,就看你电机是怎么接线的,结果完全可以与我的相反。不过一定要保证电机接线的统一性,不能随意,不能说前轮接的是顺时针线序,后轮是逆时针线序,如果买的电机连接线不带颜色,一定要自己测好了那种接法是顺时针的,哪种是逆时针,否则前轮前进后轮后退,很摧残电机的,或者左右边的2对电机转动方向不统一,导致编程麻烦。
芯片默认输出0V ,所以在没有程序的时候,大家不需要担心电机会转动。一个芯片只能控制2个电机,右边的再接个芯片就可以了,网上卖的模块都是2个驱动芯片的,刚刚好够4个电机。买模块的好处就是拿来可以直接接线,而且模块上有标号,不必担心接错,希望初学者还是买模块,贵是贵了,但是速度有保证的!驱动模块如图:
接好之后,我就说下小车的转动方式:前进后退就是4个电机同时的正转、反转;左转弯和有转弯有2种方式:A一边转动一边不转,B一边正向转动一边反向转动,这两种各有个的好处,各位可以根据自己的实际情况来确定转弯的方式,不同车的底盘效果肯定是不一样的,转弯的方式是程序控制的,本程序是B种方式。
我的小车图:
这种电机是减速的,所以不会很快,如果是直接电机带动的轮子,再用12V电源的话,那速度就非常快了,模块的输出直接连接电机电源线,输出根据标号或根据程序接入到单片机上
单片机的接线:
如图:
这是我的最小系统板,全部引出IO,带板载USB下载功能,P0口输出接了8路流水灯(有选通开关),这样设计板子是为了P0口做输出时专门看输出状态的。板子是我们工作室自己设计的,我们所有的作品调试都是建立在它的基础上,网上也有的卖这种USB下载板,40元左右吧!
我这个人比较懒,用的是电机驱动模块,L293D的输入是有标号的,1——8直接按照顺序接到P1.0——P1.7就可以了,说到这里,我不得不说一下,单片机的接线是非常自由的,因为是程序控制,无法就是改改端口而已,我只根据我的程序来说明接线,有基础的可以自己设计!
驱动芯片和电机连接好后,就是要把线固定好,留出要与单片机连接的8跟控制线。也要注意给无线模块留一个小空间。
无线模块解说:
我们工作室一直使用的是433无线串口模块,具体型号和价格我会附在清单表里,现在我说下它的性能、这种无线模块最大的好处就是有较强的抗干扰性,2个模块直接可以设置ID,只有在一个ID号下的个模块才可以通信,而且可以实现一对多通信;而且这种模块是无需编程的,直接把数据发送到串口即可,模块会自动调制解调,就目前使用的情况而言,还没发现它有调制解调错误的时候,可以说,在数据传输上,这个模块误码率还是极低的,不过需要注意的是,模块2次接收(发送)之间的间隔要大于200ms,这是非常重要的一个参数,如果想做高速数据传输的朋友请慎重选用!(本段文字来源于淘宝睿迪无线模块手册,本人也已经上传,也请读者尊重该店的著作权)。
模块的接线还是蛮简单的,电源2根线,数据线2根:TX(接单片机RX)、RX(接单片机TX),关于无线模块的设置方案,请参考淘宝睿迪无线XL02-232AP1型号的资料手册。模块在通电的一瞬间红灯绿灯同时会闪一下,然后熄灭,此时进入待机状态,模块发送数据时,红灯亮;接收数据时,绿灯亮。
组装好之后的图:
我用是12v蓄电池,接到驱动模块后,模块的5V输出又可以直接给无线模块和最小系统部分供电。虽然看起来比较笨重,但是12V的电源,与一般的小车在速度和耐力上,都有了本质的提高!
遥控部分:
下面是原理图和hex代码,以后程序我会直接挂在网页上,仿真提供16进制文件
本例仿真图和元件清单下载:
http://www.51hei.com/f/原理仿真14.zip
http://www.51hei.com/f/原件清单14.rar
源代码: ;接收程序 ORG 0 ;程序起始地址 SJMP STAR ;跳转到主程序 ORG 30H ;串口中断地址 sjmp loop ;跳转到中断服务程序 STAR: MOV SP,#5FH ;设置堆栈 MOV SCON,#50H ;串行数据格式(详情请参考51手册) MOV TMOD,#20H ;定时器工作方式(请参考51手册) MOV PCON,#0 ;波特率不倍速(请参考51手册) MOV TH1,#0fdH ;设置波特率在9600 MOV TL1,#0fdH ;设置波特率在9600 SETB EA ;开起中断 clr ET1 ;关闭定时1中断 SETB ES ;开起串口中断 SETB TR1 ;启动定时器1 mov a,#0 ; mov p1,a ;设置初始值,即开机p1输出00h小车不动作 main: mov p1,a ;把a值给p1端口 sjmp main ;无限循环main程序 LOOP: jnb ri,$ ;判断接收位是否接收完 clr ri ;接收完后清空接收位 mov a,sbuf ;发送的数据给a reti ;返回后,a的值就会给p1 END ;发送程序 ORG 0 ;程序起始地址 SJMP START ;跳转到主程序 ORG 30H ;串口中断地址 START: MOV SP,#5FH ;设置堆栈 MOV TMOD,#20H ;定时器工作方式(请参考51手册) MOV PCON,#0 ;波特率不倍速(请参考51手册) MOV SCON,#50H ;串行数据格式(详情请参考51手册) MOV TH1,#0fdH ;设置波特率在9600 MOV TL1,#0fdH setb EA ;开起中断 clr ET1 ;关闭定时1中断 setb ES ;开起串口中断 SETB TR1 ;启动定时器1 main: lcall kcs ;调用按键扫描程序 jnz key ;有键按下则跳转到key程序段 sjmp main ;无限循环main程序 kcs: mov p1,#0ffh ;p1给初值 mov a,p1 ;p1的数值给a cpl a ;取反a anl a,#0ffh ;与运算 ret key: lcall delay ;软件延时程序,按键去抖 jb acc.0,send1 jb acc.1,send2 jb acc.2,send3 jb acc.3,send4 jb acc.4,send5 ret DELAY: MOV R5,#20 D1:MOV R6,#10 D2:MOV R7,#100 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 ret send1: mov r1,#10101010b ;前进指令 sjmp send send2: mov r1,#01010101b ;后退指令 sjmp send send3: mov r1,#01011010b ;左转指令 sjmp send send4: mov r1,#10100101b ;右转指令 sjmp send send5: mov r1,#00h ;停止指令 sjmp send send: MOV SBUF,r1 ;指令给sbuf JNB TI,$ ;判断是否发送完 reti ;中断返回 END