循迹小车
话从哪里说起,等到你要说话,什么话都是那样渺茫地找不到个源头。
假期来了,决定自己动手做点东西,于是刚接触51不久的我就将眼光转向了“简单”的循迹小车,但即使如此简单的一个东西也耗费了我许多的时间,更犯了很多的错误。
元器件的使用
考虑到简单方便,采用了51单片机开发板,L298N,四个电机,一对红外传感器用以循迹以及一块航模电池作为电源。
开发板的使用要慎重,毕竟五十多块钱的东西烧起来心都在滴血。
L298N这个元件真的需要弄明白在使用,并且要避免把所有的线都接在一起,那样真的让自己都会眼花缭乱。
红外传感器精度较低,要注意把它尽量放低一点。
电机的优劣是决定实验成功与否的重要因素,空转比太低的时候,电机容易停。
第一代电机
第二代电机
在整个制作过程中最令我头疼的就是电源的选择,刚开始使用的是学生电源,一个大块头,领着这个东西满地乱跑的画风不正常的很,图如下。
于是学长给了我一块航模电池,处于安全起见,他让我加个开关。
最蠢的是我居然把开关和电路还有电源并列了起来,一连上正负极就滋滋冒电火花那种,当时我居然还傻fufu去问学长,想到这里还是很羞愧。
代码部分
#include <reg51.h>
sbit IN1 = P1^2;
sbit IN2 = P1^3;
sbit IN3 = P1^4;
sbit IN4 = P1^5;
sbit ENA = P1^0;//左边两个电机的使能
sbit ENB = P1^1;//右边两个电机的使能
sbit lse1 = P3^0;//左边红外传感器的数据口
sbit lse2 = P3^1;//右边红外传感器的数据口
unsigned char zkb1 = 0;//定义了一下左边两个轮的占空比
unsigned char zkb2 = 0;//定义了一下右边两个轮的占空比
int t = 0;
void PIT_Init()
{
EA = 1;
TMOD |= 0x01;
TH0 = (65536 - 200) / 256;
TL0 = (65536 - 200) % 256;
ET0 = 1;
TR0 = 1;
}
void timer()interrupt 1//interrrupt 1ΪÄÚ²¿Öжϣ¬0ΪÍⲿÖжÏ
{
TH0 = (65536-200)/256;
TL0 = (65536-200)%256;
if(t<zkb1)
{
ENA = 1;
}
else
{
ENA = 0;
}
if(t<zkb2)
{
ENB = 1;
}
else
{
ENB = 0;
}
t = (t + 1) %50;
}
void run()
{ zkb1 = 10;
zkb2 = 10;
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void stop(void)
{ zkb1 = 0;
zkb2 = 0;
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
void leftrun(void)
{
zkb1 = 15;
zkb2 = 15;
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
void rightrun(void)
{
zkb1 = 15;
zkb2 = 15;
IN1 = 0;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
{
for(y=0;y<2000;y++);
}
}
void xunji()
{ unsigned char flag;
if((lse1==0)&&(lse2==1))
{
flag = 0;//左边检测到黑线
}
else if((lse1==1)&&(lse2==0))
{
flag = 1;//右边检测到黑线
}
else if((lse1==1)&&(lse2==1))
{
flag = 3;
}
else
{
flag = 4;
}
switch(flag)
{
case 0: rightrun();delay(48);stop(); delay(50);break;
case 1: leftrun();delay(48);stop(); delay(50);break;
case 3: run();delay(11);stop();delay(50);break;
case 4: run();delay(11);stop();delay(50);break;
default: run();delay(10);stop();delay(50);break;
}
}
void main()
{
PIT_Init();
zkb1 = 8 ;
zkb2 = 8 ;
IN1 = 1 ;
IN2 = 0 ;
IN3 = 1 ;
IN4 = 0 ;
while(1)
{
xunji() ;
}
}
文章最后
感谢学长的支持,和队友们的帮助,这是一个让我印象深刻的6天,也掌握了很多以前不曾了解过的知识。
今天的文章循迹小车51单片机编程_循迹小车有什么实际应用分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/79161.html