|
智能往返小车的控制,这是2003年全国电子设计大赛的题目,我用51单片机来实现控制,现在拿出来跟大家分享:
实现任务
小车能在起跑线与终点线自动往返。
(1)车辆从起跑线出发,到达终点线后停留10S,然后自动返回起跑线。
(2)中间300CM的限速区,车辆往返均要求以低速通过,通过时间8S。
跑道宽度0.5m,表面为瓷砖地板,两侧有2cm的黑线作为跑道分界线,终点有黑带提示‘,跑道如下图所示
![]()
(原文件名:000.jpg)
2.系统方案选择
根据题目要求,电动车系统应具有:起点加速前进、减速, 限速区减速,加速,终点停留,后退、限速区减速、加速,起点停留等功能,为此按功能,系统可划分若干基本模块:黑白、检测模块,控制器模块,电机驱动模块。
2. 主要硬件设计
(1)控制电路电路的设计,如下图所示:
![]()
(原文件名:红外检测和光藕隔离.jpg)
![]()
(原文件名:H桥.jpg)
![]()
单片机 (原文件名:4.jpg)
程序:
#include <reg52.h> //
#define uchar unsigned char // 开头定义,方便下面使用
#define uint unsigned int
#define ulong unsigned long
sbit P32=P3^2; // 红外检测口
sbit P12=P1^2; // 直流电机I/O口1
sbit P13=P1^3; // 直流电机IO口2
void delly(ulong y); //
void unit();
uint code data_table[]={250,250,250,150,250,0,250,150,250};//用数组,调制每个期间的PWM
uchar i,timeh,timel;
uint pwm_data,time_counter,counter1;
main()
{
unit();
while(1)
{
if(i<5)//开始前进
{
P12=1;
P13=0;
delly(pwm_data);
P12=0;
delly(1000-pwm_data);//占空比
}
else if(i==5)//到打终点后,停止
{
P13=0;
P12=0;
delly(333333);
P13=1;
while(i==5); }
else if(i>5&i<9)//到达终点之后返回
{
P12=0;
P13=1;
delly(pwm_data);
P13=0;
delly(1000-pwm_data);//返回到起跑线上停止
}
else
{
P13=0;
P12=0;
while(1);
}
//
}
}
void unit()
{
i=0;
P3=0xff;//
P1=0xff;
time_counter=0;
pwm_data=data_table;
TMOD=0x11;//
TH0=0x00;//
TL0=0x00;
EA=1;//
ET0=1;
EX0=1; //
IT0=1;//′
}
//// óê±′|àí/////
void delly(ulong y) //延时
{
while(y)
y--;
}
//////////// D ′|àí2 · ////////////
void int0() interrupt 0 using 0//中断0
{
//timel=TL0;
if(i>=1)
{
if((time_counter-counter1)>20)
i++;
}
else
{
i++;
TR0=1;
}
pwm_data=data_table;
counter1=time_counter;
//timeh=TH0;
}
void timer0() interrupt 1 using 1 //定时器0中断,
{
TR0=0;
if(time_counter<10000)
time_counter++;
else
time_counter=0;
//ET0=0;
TH0=0x00;
TL0=0x00;
TR0=1;
// t1_flag=1;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|