找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3848|回复: 2
收起左侧

基于89c51的红外寻迹小车的制作

[复制链接]
ID:479983 发表于 2019-5-10 08:21 来自手机 | 显示全部楼层 |阅读模式
一、        总体分析        3
二、        材料清单:        4
三、        系统原理图        5
1.        L298n电机驱动:        5
2.        红外模块:        6
3.        51单片机:        6
4.        7805稳压        7
四、        模块功能        8
1.        L298n电机驱动:        8
2.        红外模块:        8
3.        51单片机:        8
4.        7805稳压:        9
五、        软件编程        10
1.        程序1:        10
2.        程序2:        12



材料清单:
小车底盘(带轮胎,直流减速马达,万向轮);
红外对管若干;
L9110和L298n电机驱动模块(推荐L298n);
51最小系统板(含51单片机);
7805稳压芯片;
杜邦线若干;
铜柱若干;
18650电池(含电池盒);


系统原理图
L298n电机驱动:



红外模块:

51单片机:


7805稳压








模块功能
L298n电机驱动:

L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机可以控制两路电机。
红外模块:

红外传感器黑线的检测原理是红外发射管发射光线到路面,红外光遇到白底则被反射,接收管接收到反射光,经施密特触发器整形后输出低电平;当红外光遇到黑线时则被吸收,接收管没有接收到反射光
51单片机:

AT89C51单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、并行I/O口(4个8位I/O口)、串行口、定时器/计数器、中断系统及特殊功能寄存器。它们都是通过片内单一总线连接而成,其基本结构依旧是微处理器(CPU)加上外围芯片的传统结构模式。但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式,以实现不同的功能
7805稳压:
7805三端稳压集成电路,电子产品中,常见的三端稳压集成电路有正电压输出的78 ×× 系列和负电压输出的79××系列。顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。


软件编程
程序1:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit left1=P1^0;
sbit left2=P1^1;
sbit right1=P1^2;
sbit right2=P1^3; //
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;//红外传感
void delay(uint z)
{
uchar i;
while(z--)
{
for(i=0;i<121;i++);
}
} //延时函数}
void straight() //走直线函数
{
left1=0;
left2=1;
right1=0;
right2=1;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void turn_left() //左转弯函数
{
left1=0;
left2=1;
right1=0;
right2=0;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void turn_right() //右转弯函数
{

left1=0;
left2=0;
right1=0;
right2=1;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void tingzhi()//停止函数
{
left1=0;
left2=0;
right1=0;
right2=0;
left1=0;
left2=0;
right1=0;
right2=0;
}
void infrared() //循迹       
{
uchar flag;
{flag=3;}
else
if(led5==0&&(led3==1)&&(led2==1))                                                                          
{flag=4;}
else
if(led5==0&&(led1==1)&&(led4==1))                                  
{flag=4;}
else
if((led1==1)||(led2==1))
{flag=2;}
else
if((led3==1)||(led4==1))
{flag=1;}
else
flag=0;
switch (flag)
{
case 0: straight();
break;
case 2: turn_left();
break;
case 1: turn_right();
break;
case 3: straight();
break;
case 4: tingzhi();
break;
default: tingzhi();
break;
}
}
void main(void)
{
while(1)
{
infrared();
}
}

程序2:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar pro_zuo,pro_you,i,j; //左右占空比标志
sbit left1=P1^0;
sbit left2=P1^1;       
sbit right1=P1^2;
sbit right2=P1^3; //
sbit led1=P2^0;       
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3; //红外传感
sbit led5=P2^4;               
sbit en1=P0^1;      
sbit en2=P0^2;     
void delay(uint z)
{
uchar i;
while(z--)
{for(i=0;i<121;i++);}
}
void init()
{
/*led1=0; //白线位置
led2=0; //白线位置
led5=1; //黑线位置
led3=0; //白线位置
led4=0; //白线位置 */
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1
{
i++;
j++;
if(i<=pro_you) {en1=1;}
   else en1=0;
if(i==40) {en1=~en1;i=0;}
if(j<=pro_zuo) {en2=1;}
   else en2=0;
if(j==40) {en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight() //走直线函数
{
pro_you=4;
pro_zuo=5;
left1=0;
left2=1;
right1=0;
right2=1;
}
void turn_left() //左转弯函数
{
pro_you=0;
pro_zuo=5;
left1=0;
left2=1;
right1=0;
right2=1;
}
void turn_right() //右转弯函数
{
pro_you=5;
pro_zuo=0;
left1=0;
left2=1;
right1=0;
right2=1;
}
void tingzhi()//停止函数
{
left1=0;
left2=0;
right1=0;
right2=0;
left1=0;
left2=0;
right1=0;
right2=0;
}
void infrared() //循迹       
{
uchar flag;
if(led5==1&&(led3==1)&&(led2==1))                                                                 
{flag=3;}
else
if(led5==0&&(led3==1)&&(led2==1))                                                                 
{flag=4;}
else
if(led5==0&&(led1==1)&&(led4==1))                                                                 
{flag=4;}
else
if((led1==1)||(led2==1))
{flag=2;}
else
if((led3==1)||(led4==1))
{flag=1;}
else
flag=0;
switch (flag)
{
case 0: straight();
break;
case 1: turn_left();
break;
case 2: turn_right();
break;
case 3: straight();
break;
case 4: tingzhi();
break;
default: tingzhi();
break;
}
}
void main(void)
{
init();
delay(1);
while(1)
{
   infrared();
}
}
void int0(void)interrupt 0
{
}
回复

使用道具 举报

ID:1 发表于 2019-5-10 18:20 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:479983 发表于 2019-5-19 17:07 来自手机 | 显示全部楼层
好的,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表