基于单片机的自动往返小车Word文档下载推荐.docx

上传人:b****6 文档编号:19903640 上传时间:2023-01-12 格式:DOCX 页数:14 大小:73.21KB
下载 相关 举报
基于单片机的自动往返小车Word文档下载推荐.docx_第1页
第1页 / 共14页
基于单片机的自动往返小车Word文档下载推荐.docx_第2页
第2页 / 共14页
基于单片机的自动往返小车Word文档下载推荐.docx_第3页
第3页 / 共14页
基于单片机的自动往返小车Word文档下载推荐.docx_第4页
第4页 / 共14页
基于单片机的自动往返小车Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于单片机的自动往返小车Word文档下载推荐.docx

《基于单片机的自动往返小车Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机的自动往返小车Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

基于单片机的自动往返小车Word文档下载推荐.docx

1.光电检测部分:

我们采用反射式光电检测电路对跑道上的黑线进行检测,并用两个遮光套管套住发光管和接收管以一定的角度紧贴跑道,这样可以消除外界光线的干扰,用LM358电压比较器输出高低电平检测信号。

如图所示:

2.STC89C52单片机基本系统

此系统以89C52为核心,每检测到一个黑带由光电检测部分产生一个的脉冲,使单片机产生一个外部中断1,定义检测黑带数的变量加1,同时车轮每转一圈,霍尔元件输出一个脉冲,是安单片机产生一个外部中断0,定义圈数的变量加1.通过和控制L298来控制电机的正转与反转及刹车。

当输出低电平,输出高电平时,电机正转,相反则电机反转,当和都是低电平时,使电动机被短路,提高了刹车效率,基本杜绝了由于制动惯性造成的小车的前冲现象。

通过P0口进行两个数码管的位选,P2口进行段码输出,其中一个数码管显示行驶时间,另外一个数码管显示行驶路程。

3.L298N电动机驱动模块部分

该电路采用电动机驱动芯片L298来控制电动机的正转与反转,加以第二路电机电源保证了电动机启动时有足够的电流。

在试验中控制电压为单片机输出的高低电平直接控制。

具体电路图连接如下:

4.电源部分

由于电动机工作电流大,需要选用内阻小,供电电流强,质量轻,可反复使用的经济型电池,我们选用可充电电池组。

为使单片机工作稳定,避免电动机开关机和其转动时对其电源的影响,在此用两个电池组和稳压块7805分别为89C52和电动机驱动显示部分分别进行供电。

保证小车工作和显示的稳定性。

5.软件设计部分

单片机控制电路主要由一片STC89C52组成,通过P3口控制小车正转与反转,刹车,加速减速,通过两个四联数码管控制显示时间和里程以及小车行驶的时间。

其中P0口进行位选,P2口进行显示段码输出。

该系统采用上电复位加上手动复位联合复位系统进行初始化,单片机通过,输出脉冲控制电机正转反转以及刹车,当,分别输出01是电动机正转,输出10时电动机反转,输出00时电动机两边短路,小车立即刹车。

流程图如下:

(1)外部中断0

车轮美转一次,霍尔元件产生一个脉冲,通过下降沿触发外部中断0,并且在每进行一次外部中断记录圈数的变量加1.

(2)外中断1

光电检测每检测到一条黑带就产生一个脉冲输入口,通过下降沿的方式触发外中断1,每中断一次记录黑带的变量加1,当检测到第六条黑带时,=1,=1,小车的电动机由于短路刹车,当检测到第十二条黑带时,小车再次刹车同时关掉所有中断

(3)定时器中断0

使用定时器T0产生5ms定时中断,每次执行该中断前要先给定时器0赋初值,定时器中断每执行一次,变量加1。

当i=200时,即每当计时1秒时,时间变量t加1,速度等于一秒转的圈数和小车车轮的周长相乘。

(4)定时器中断1

主要用来产生不同的占空比的波型进行高低速控制,每次执行时,定时器1要赋初值。

(5)主程序

主程序主要用来控制两个四联数码管的显示,通过循环语句不断的调用显示程序,使两个四联数码管按位不断循环亮点,当小车行驶时动态显示时间和路程,小车停止时显示小车行驶过程中的时间和路程。

6.安装与调试

自动小车为玩具遥控小汽车的改装品,在改装的过程中最重要的是考虑设计光电检测管的位置,检测黑带的光电管放在车体的中央,用遮光管将其以一定反射角度压到跑道上。

路程检测用槽型光耦,放在小车的从动轮上。

轮子的周长约为厘米,在轮子上用了一个霍尔元件,每转一圈一个脉冲。

在组装前对每一个单元电路进行测试,以保证外部硬件电路的无误,有利于最后的统调。

调整是以点到线,最后到整体调试的方法。

在调整的过程中我们发现了许多问题,如响应中断的次数的调整等。

并且为了小车碰到墙壁不至于停车,我们在小车的四角上都加上了导向轮,导向轮用随身听的压带轮制作即可。

7.附录元器件及程序如下:

基本元器件列表

一个STC89C52单片机

2个四位共阳数码管

一个L298N芯片

一个霍尔元件和小磁钢片

一路循迹模块

晶振(12M)及30pf电容

开关

电阻10k100欧姆1k20k可调

程序:

#include<

>

//包含头文件

#defineuintunsignedint//宏常量定义

#defineucharunsignedchar//宏常量定义

sbitdianji1=P1^0;

//P1_0设置为电机控制一

sbitdianji2=P1^1;

//P1_1设置为电机控制二

sbithdjc=P3^2;

//P3_2设置为黑带检测位

ucharcodeduma[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};

//段编码

ucharcodedianduma[]={

0xbf,0x86,0xdb,0xcf,

0xe6,0xed,0xfd,0x87,

0xff,0xef};

//带小数点段编码

ucharcodewema[]={

0x01,0x02,0x04,0x08,

0x10,0x20,0x40,0x80,

0x00,0xff};

//位编码

ucharnum,ge,shi,bai,qian;

//定义几个字符型变量

uintmiao,lc,heidai=0;

//定义几个整形变量

longintqs;

//定义一个长整形变量用来记录小车所转的圈数

voidfenwei(uint);

//声明一个分位函数用来把要显示的数分位

voidshuma(uchar,uchar);

//声明一个数码上显示函数用来在数码管上显示数据

voidshumadian(uchar,uchar);

//声明另一个数码显示函数用来显示带小数点的数据

voidmiaoxianshi(uint);

//声明一个显示时间的函数

voidlcxs(uint);

//声明一个显示路程的函数

voiddjkz();

//声明一个电机控制函数

voiddelay(uchar);

//声明一个延时函数

voiddelay10s();

//声明另一个延时函数用来延时十秒钟

voidfenwei(uintx)//把需要在数码管上显示的数据分位

{

ge=x%10;

shi=(x%100)/10;

bai=(x%1000)/100;

qian=x/1000;

}

voidshuma(ucharx,uchary)//将需要显示的数据显示在数码管上

P0=wema[8];

P2=duma[x];

P0=wema[y];

delay(5);

voidshumadian(ucharx,uchary)//将需要显示的数据显示在数码管上

P2=dianduma[x];

voidmiaoxianshi(uintx)//将定时器0输出的时间显示在数码管上

fenwei(x);

shuma(ge,3);

shuma(shi,2);

shumadian(bai,1);

shuma(qian,0);

voidlcxs(uintz)//将外部中断1输出的路程显示在数码

fenwei(z);

shuma(ge,7);

shuma(shi,6);

shumadian(bai,5);

shuma(qian,4);

voiddjkz()//控制电机运转

ucharn=20,m=60;

switch(heidai)

{

case0:

case1:

case2:

dianji1=1;

dianji2=0;

miaoxianshi(miao);

lcxs(lc);

break;

case3:

while(m--)

{

dianji1=1;

dianji2=0;

delay(70);

dianji1=0;

delay(30);

miaoxianshi(miao);

lcxs(lc);

}

while(heidai==3)

{

dianji1=1;

dianji2=0;

delay(13);

dianji1=0;

delay

(1);

miaoxianshi(miao);

lcxs(lc);

}

case4:

while(heidai==4)

delay(25);

case5:

case6:

while(n--)

delay(50);

dianji2=1;

delay10s();

while(heidai==6)

dianji2=1;

case7:

case8:

dianji1=0;

case9:

while(heidai==7)

delay(90);

delay

(1);

case10:

case11:

case12:

TR0=0;

while

(1)

default:

}

voiddelay(ucharx)//延时

uchari,j;

for(i=x;

i>

0;

i--)

for(j=50;

j>

j--);

voiddelay10s()//延时十秒钟

uinti,j;

for(i=15;

for(j=123;

j--)

}

voidext0()interrupt0//外部中断0,用来检测黑带

delay(50);

if(hdjc==0)

heidai++;

voidtime0()interrupt1//函数功能:

定时器中断0,用来记录时间

TH0=(65536-500)/256;

TL0=(65536-500)%256;

num++;

if(num==20)

num=0;

miao++;

}

}

voidext1()interrupt2//函数功能:

外部中断1,记录车轮转过的圈数

qs++;

lc=(int)(qs*;

voidmain()

{

EA=1;

//打开总中断

ET0=1;

//打开定时器中断0

EX0=1;

//打开外部中断1

IT0=1;

//外部中断0设置为跳变沿触发方式

EX1=1;

IT1=1;

//外部中断1设置为跳变沿触发方式

TMOD=0x01;

//设置定时器0为方式1

//定时器0高八位装初值

TL0=(65536-500)%256;

//定时器0低八位装初值

TR0=1;

//打开定时器0

while

(1)//进入主循环

{

djkz();

//进入电机控制函数

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1