新手入门单片机实战超详细以及遇到一些坑-避障小车1【更新中】
说明
本人系电子信息工程大二的大学牲一名,一直以来想尝试做一些项目,但是出于各种理由一直推脱。去年准备电赛的时候也只是草草学了学单片机(仅不算深入依然很菜),一味的照着视频写例程属实感觉进步不大。正好上学期学校刚开完单片机这门课程,学期结束想利用假期从简单项目入手,顺便把学习过程记录下来,避免以后踩坑,如果顺便能帮助大家那当然更好了。也希望大佬能留下恳切的建议供我学习改正。
个人介绍
对于想今后从事嵌入式系统开发和单纯对单片机控制感兴趣想的同学来说,51单片机绝对是大家入门的首选,听多了各路大佬分享关于七天速成单片机的经验,个人感觉还是有必要较系统的对重要的部分系统学习一下寄存器配置搞懂原理,把基础夯实。今后确实可以不用重复造*,在别人的代码基础上改进就可以,但是搞懂原理对于纠错还是大有裨益的。(学校单片机课程时深有体会,一个例程就几十行代码改一下午)
具有想提高能力还是建议大家有一定基础以后,买块板子和工具自己尝试不同项目积累软硬件经验,这篇文章也是博主之前看到某位带佬“问题导向型”学习的方法的效仿。
先交个底吧,本人之前没有做项目的经验,只是简单尝试过“焦耳小偷”类似的简单纯硬件升压点亮LED的实验,接触过烙铁焊接,学习了数电模电电路知识,掌握程度一般。科技类的比赛参加过机器人比赛,但是抱的大腿水了个奖没有实际贡献。希望大家看的时候不要太过在意我拙略的能力,能不吝啬的给新人一些指点。
项目简述
开始项目之前产生了各种想法,之前就是被多种想法和自己预想的困难给劝退了。所以大家不要有太多顾虑,从失败中吸取经验也是一件很好的事,有想法莽就完了!
初步想法是尝试做一个避障机器人项目,加深对51单片机的熟练,顺便当准备10月份的电赛和以后的相关比赛准备个半成品。因为在家博主手头只有当时学习51买的开发板和学院电子协会发的一个STC1524K32S4系列的最小系统。最小系统只用它点过个灯,然后就用它开干了。
工具和元件方面的话,博主在家只有一支烙铁,所以初步准备了如下的一些东西供大家参考:
工具类:
1、烙铁(已有)建议配一个烙铁座
2、海绵、锡丝、松香/助焊剂、吸锡器等焊接必备
3、飞线、各种杜邦线(公母头,双公头、双母头)
4、万用表、尖嘴钳、绝缘胶带,也可以备个螺丝刀、镊子
5、热熔胶枪、胶棒(可有可无吧,挺好玩的)
项目元件类:
1、单片机最小系统板x1(入门的话可以直接用51)
2、小车底盘x1(带*电机,可以直接买现成的套件,也可以分开亚克力底盘、*、电机等单独买确保配套就行)
3、L298N电机驱动模块x1
4、12V锂电池(带充电器,用于电机供电)x1
5、小车避障传感器x2(因为便宜初步打算使用红外实现避障了)
**说明:**最小系统供电的方法需要考虑清楚,博主用的15最小系统带了一个TTL转USB接口可以充电宝供电,如果大家用51单片机的话还得买下载器和电源线,也可以买稳压模块通过电池供电。
硬件搭建
首先就是底盘拼接了,自带图纸了大家可以跟着装一下。不算难,略花时间,就是那个*装上去让自己手糟了不少罪最后大力出奇迹怼上去了。
**ps:**电机最好先用烙铁在电机两端焊接上飞线在组装,不然后面组装好以后还得用各种奇怪的姿势焊飞线,不过也不难问题不大。固定电机螺丝在外,螺母在内,不然卡轮。
底盘搭好以后如图(电机的线后接的图中没有):
然后上驱动模块和电池:
12v电池的话买的时候图便宜和送充电器没看到是2.54插头的,不过还好送了一个转接头接上去以后就是两根独立飞线。电池把图上底盘翻过来用绝缘胶带固定一下就行。
电机驱动模块用热熔胶枪固定了一下,L298N连线还说比较好连的,三端输出口分别是12V、5V、GND通过飞线或者杜邦线接12V电池正极、负极、最小系统VCC即可,四个引脚通过杜邦线接最小系统IO口即可,ENA、ENB有跳线帽保持高电平暂时可以不接,两侧是输出接对应侧电机即可。
接好大概这样:
我使用的最小系统板:(卒)
建议大家接好以后马上用最小系统写一点代码测试一下电机是否正常:
代码后来有改动,定时器部分可以去掉没什么实际用处就是测试一下配置的对不对,方便以后拿来写PWM调速
#include <stc15.h>
#include <stdio.h>
#include <gpio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*实际端口为0时电机转,因为左右电机正转反转定义反
可以理解为给1电机转 eg:Left_T=1为左轮电机正转 */
sbit Left_T = P0^0;
sbit Left_F = P0^1;
sbit Right_T = P0^2;
sbit Right_F = P0^3;
sbit LED = P1^6;
uchar time = 0;
/* 毫秒级延时 */
void delay_ms(uint x)
{
uint j;
uchar i;
for(j=0;j<x;j++)
{
for(i=0;i<120;i++);
}
}
void Timer0Init(void) //500微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xEA; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/* 定时器0中断服务函数 */
void tm0_isr() interrupt 1 using 1
{
// time++;
// if(time == 100)
// {
// time = 0;
// LED = !LED; //将测试口取反
// }
}
void straight() //前进
{
Left_T = 1;
Left_F = 0;
Right_T = 1;
Right_F = 0;
}
void back() // 后退
{
Left_T = 0;
Left_F = 1;
Right_T = 0;
Right_F = 1;
}
void stop()
{
Left_T = 0;
Left_F = 0;
Right_T = 0;
Right_F = 0;
}
void turn_left()
{
Left_T = 1;
Left_F = 0;
Right_T = 0; //行驶中左转
// Right_T = 1; //原地左转
Right_F = 1;
}
void turn_Right()
{
Left_T = 0; //行驶中右转
Left_T = 1; //原地右转
Left_F = 1;
Right_T = 1;
Right_F = 0;
}
void main()
{
gpio();
Timer0Init();
EA = 1;
ET0 = 1;
straight();
while(1);
}
大家还可以参考:
http://www.51hei.com/bbs/dpj-115132-1.html
https://wenku.baidu.com/view/cbc52180ae45b307e87101f69e3143323868f51e.html
以上基本就是Day01和Day02的工作量,博主每天只利用了每天下午时间搞一搞进度感人。不过还算顺利,电机可以正常转起来了。如果你也成功了,恭喜你成功迈出了第一步。(忘记拍视频了,不展示了)
遇到的坑
Day02电机可以正常转以后,第三天打算开始测试PWM调速加红外模块,但是突然最小系统就崩了,反复出现这个情况:
问题描述:然后自此开始就感觉最小系统无尽烫手,尝试冷启动、降低传输波特率无果,但是电脑可以检测到最小系统而且最小系统内的程序可以驱动电机。
刚开始以为是TTL转USB接口杜邦线连线问题,后来拔下来重插了一遍,手忙脚乱的就真的插错了,VCC和GND短接。插上去瞬间电脑提示电涌过大报错,给我吓坏了感觉拔下来,好在后来发现电脑接口没事。(大家遇事千万别慌)
自此单片机进入歇菜状态插上去电脑也检测不到了,过了几分钟就秽土转生又复活了可以检测了而且与电机驱动模块连接,转接口和电源指示方面正常,可以驱动电机还是不可以烧录而且巨烫。自此单片机进入抽风状态,时而在线时而歇菜。
电机上电会突然转停(不会上传本地视频不展示了)
事情出现转机是在又一次挣扎过程中单片机冒烟了后来果断放弃。
逃避问题虽然可耻,但是管用
对于新手来说,确定硬件出现问题大家最好果断换新,修可能比换代价更大。
后果断掏出了吃灰的51学习板接着坐,51还是和15有区别的代码和烧录部分做了调整。
提示:博主使用的是STC公司的89C51,51的定时器相较于STC15系列模式0的16位自动重装载模式成了13位定时/计数器,直接使用STC-ISP的定时器计算器进行设置的话要修改配置。
89C51系列只有六分频和十二分频模式,相比STC15系列没有AUXR寄存器,需要自己设置或者直接删去配置时的这句指令。即使是15系列使用定时器计算器最好也对照手册检查一下寄存器配置是否符合预期。比如:需要使用中断服务程序增加总中断和定时器中断开关或需要接入外部中断控制也要修改。
定时器原理介绍和一些问题解决可以参考这两篇文章:
https://blog.csdn.net/DDM76/article/details/43225751
https://blog.csdn.net/qq_44051174/article/details/100851970
上一篇: 手写 tomcat (nio)
下一篇: 51单片机实现智能小车的寻轨避障功能