电气工程学院
一、课程设计任务书
1.课程设计项目
寻迹小车设计
2.设计内容
1) 设计题目总体设计方案
2) 硬件电路设计
3) C语言程序编制与调试
4) 电路系统的综合调试
5) 撰写课程设计论文
6) 完成课程设计论文答辩
3.设计要求
1) 设计一台自动寻电动小车。
2) 电动车能自动寻迹,按设定好的轨迹前进。
3) 寻迹由小车前端左右两个光电开关完成,通过调整RW2和RW4可以改变光电开关的灵敏度。
4) 设计结束学生应撰写课程设计报告一份,完成课程设计答辩;
5) 课程设计报告内容包括:课程设计题目;设计计划与方案论证;设计方案实现(含程序);课程设计心得。
6)课程设计报告的撰写格式应符合单片机实用技术课程设计报告格式要求。
4、参考资料
[1]李广弟,朱月秀,王秀山编著.单片机基础. 北京:北京航空航天大学出版社,2001
[2] 何立民编著.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:北京航空航天大学出版社,1999
[3] 蔡美琴等编著.MCS-51 单片机系统及应用.北京:高等教育出版社.1992
5.设计进度(20##年6月13日至20##年6月24日)
6.设计地点
新实验楼323微机实验室
单片机原理及
应用课程设计
班 级:
姓 名:
学 号:
指导教师:
撰写日期:
目 录
第一章 课程设计内容与要求分析. 1
1.1课程设计内容. 1
1.2课程设计要求分析. 1
1.3系统单元电路组成. 2
1.3.1循迹模块部分. 2
1.3.2电机驱动部分. 4
1.3.3 静态显示及按键. 6
第二章 控制系统程序设计. 7
单片机原理及应用课程设计. 8
参考文献. 9
第一章 课程设计内容与要求分析
1.1课程设计内容
本题目以89C51单片机为核心器件组成小车循迹控制系统,采用定时中断实现精确定时;利用提供的单元模块构成硬件系统。
循迹小车控制系统的设计要求:
1)基本功能:
循迹小车在不同区域速度不一样。沿着导航线,一次通过区域1(慢速区)、区域2(加速区)、区域3(慢速区)实现分段限速控制,到达终点后停下。循迹用小车前端左右两个光电开关完成,通过调整RW2和RW4可以改变光电开关的灵敏度。循迹小车路径如图1-1所示:
图1-1 循迹小车路径图
2)扩展功能:
利用按键实现小车的运行控制,一个按键控制小车的前进,一个按键控制小车的停止,还有一个按键控制小车每一段区域所消耗时间及三段区域所消耗时间总和的控制。设置数码管时间显示模块:即当小车经过一个区域,显示出总时间。
1.2课程设计要求分析
小车设计分析如下表1-1所示:
表1-1 循迹小车模块设计任务
1.3系统单元电路组成
基于题目要求实现的各项功能及难易程度,在车辆选择上,对模型车进行简单改装,车辆性能良好,易于控制,运行稳定。在处理器方面,智能小车采用STC10F04XE单片机作为核心的控制系统,结合STC10F04XE单片机实现小车沿各种不同黑线运行、显示等功能。循迹小车硬件部分可以分为三个模块:分别是驱动模块、循迹检测模块和显示模块。
1.3.1循迹模块部分
循迹模块是整个设计的关键部分,小车能够按照黑线运行到目的地位置是能够顺利完成的重要环节。循迹检测原理如图5-1所示,由光电开关和比较器组成,漫反射式光电开关能反映反射光的强弱,用比较器进行分辨,从而循迹。
小车首先能够按照黑线路径行驶,其次能够准确检测判断起点和终点。采用红外线发射接收一体管,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。最后通过LM339把输出的电压信号转化为TTL电平信号送给单片机。为了屏蔽外界光的影响,使灵敏度大幅提升,可以在对管上套一塑料纸。这种设计应用简单,体积小,工作稳定,精度较高。
红外对管原理图如图1-2所示。
图1-2红外对管原理图
LM339集成块内部装有四个独立的电压比较器,该电压比较器的特点是:
1)失调电压小,典型值为2mV;
2)电源电压范围宽,单电源为2-36V,双电源电压为±1V-±18V;
3)对比较信号源的内阻限制较宽;
4)共模范围很大,为0~(Ucc-1.5V)Vo;
5)差动输入电压范围较大,大到可以等于电源电压;
6)输出端电位可灵活方便地选用。
LM339的功能:
输出负载电阻能衔接在可允许电源电压范围内的任何电源电压上,不受 Vcc端电压值的限制.此输出能作为一个简单的对地SPS开路(当不用负载电阻没被运用),输出部分的陷电流被可能得到的驱动和器件的β值所限制.当达到极限电流(16mA)时,输出晶体管将退出而且输出电压将很快上升.输出饱和电压被输出晶体管大约60ohm 的γSAT限制。当负载电流很小时,输出晶体管的低失调电压(约1.0mV)允许输出箝位在零电。
1.3.2电机驱动部分
电机驱动电路是单片机控制信号的数字信号和电机驱动信号的模拟信号相互衔接的地方,采用L293D芯片的驱动模块。L293D采用16引脚DIP封装,其内部集成了双极型H-桥电路,所有的开量都做成n型。这种双极型脉冲调宽方式具有很多优点,如电流连续;电机可四角限运行;电机停止时有微振电流,起到“动力润滑”作用,消除正反向时的静摩擦死区:低速平稳性好等。L293D通过内部逻辑生成使能信号。H-桥电路的输入量可以用来设置马达转动方向,使能信号可以用于脉宽调整(PWM)。另外,L293D将2个H-桥电路集成到1片芯片上,这就意味着用1片芯片可以同时控制2个电机。每1个电机需要3个控制信号EN12、IN1、IN2,其中EN12是使能信号,IN1、IN2为电机转动方向控制信号,IN1、IN2分别为1,0时,电机正转,反之,电机反转。选用一路PWM连接EN12引脚,通过调整PWM的占空比可以调整电机的转速。选择一路I/O口,经反向器74HC14分别接IN1和IN2引脚,控制电机的正反转。
L293D 是单块集成电路,高电压,高电流,四通道驱动, 设计用来接受DTL或者TTL逻辑电平,驱动感性负载(比如 继电器,直流和步近马达),和开关电源晶体管, 电机驱动原理图如图1-4所示。
简单的使用是作为2个桥,一对通道连接起来有一个使能输入。分离的输入引脚提供某种逻辑,允许用低电压操作,并且还包括内置的钳位二极管。
这个设备适用于高达5KHz的开关应用。 L293D是16引脚塑料封装,中间的4个引脚是短路的(为了散热)。 最高工作电压为36V,最低工作电压为7V.
图1-3 电机驱动原理图
L293D的逻辑控制见如下表1-2。其中C、D分别为IN1、IN2或IN3、IN4;L为低电平,H为高电平。
表1-2 L298对直流电机控制的逻辑真值表
1.3.3 静态显示及按键
第二章 控制系统程序设计
这次单片机课设主要就是检验我们的单片机程序设计编写能力。在老师给定元器件的基础上,了解各元器件的功能,按照课设要求编写程序,实现小车的分段速及及每段消耗时间的数码显示,并且利用按键来控制小车的前进与停止及时间的显示。
程序编写要分段进行调试,最后把所有的分段程序放在一起,实现最后的课设要求。首先进行的是小车循迹的编程调试,即对小车的前进,左转,右转,停止四个状态进行编程;其次是能实现变速分区域行驶和扫描到三条黑线后自停,分区域变速行驶,主要就是判断小车前面的两个对管同时扫描到黑线的次数,由于各段的速度不一样,致使一个扫描周期内小车所走过的路程也不一样,要保证小车无论通过以何种速度通过黑线时,小灯均能够及时的同时扫描到黑线并记录。因此,在进行测试的时候,尽可能使第二道黑线稍微宽一下,这样确保小车在第二段区域快速行驶时,能够扫描到黑线。但宽度不宜太宽,否则容易使小车扫描到两次,迫使小车在第二段区域便停车。最后是通过按键自动记录各段所消耗的时间以及利用令外两个按键控制小车的急停和启动。
单片机原理及应用课程设计
此次寻迹小车这个课程设计主要就是在老师提供现有元器件基础上,通过了解电路结构及原理设计一个程序,使小车满足按黑线寻迹的要求,并且在区域一缓慢行驶,当到达区域二时全速行驶,到达区域三时又变为缓慢行驶。此外,小车的速度控制主要是通过脉宽调速进行,将第一个区域和第三个区域设置成相同的较低速度,将区域二设置成全速前进。
最后老师要求修改程序利用按键控制小车的运行状态,即一个键按下时小车立即停止,另一个键按下时小车又能够按照原来的状态要求继续前进,还有一个键按下时显示小车每一段运行的时间以及最后显示消耗时间总和。
本设计主要用到了单片机的通用I/O口的读写功能,通过实际操作进一步掌握了51单片机的使用。同时,通过单片机外围电路的设计,更深入学习了51单片机在日常生活中的应用。通过编写程序,也进一步提高了我们的动手能力以及分析解决错误的能力,使我们能够更好的将所学知识应用到实际中来。
本系统虽然能够基本满足设计要求,能够较快较平稳的是小车沿黑带线行驶,但由于经验能力水平有限,该系统还存在着许多不尽人意的地方有待于进一步的完善与改进,最后感谢老师们的细心指,如果没有你们的帮助此次课程设计我应该不会那么顺利的完成。
总结人:
总结日期:
参考文献
[1]李广弟,朱月秀,王秀山编著.单片机基础. 北京:北京航空航天大学出版社,2001
[2]何立民编著.MCS-51系列单片机应用系统设计系统配置与接口技术.北京:北京航空航天大学出版社,1999
[3] 蔡美琴等编著.MCS-51 单片机系统及应用.北京:高等教育出版社.1992
附录
本系统是以STC89S51单片机为控制器,在KEIL开发环境中,运用C语言对单片机进行编写。主程序主要起导向和决策作用,它控制整个系统协调稳定地运作。系统各种功能主要通过调用具体的子程序来实现。系统程序如下:
#include <reg51.h>
sbit en1= P0^0; //右边电机
sbit RIN1=P0^1;
sbit RIN2=P0^2;
sbit LIN1=P0^3; //左边电机
sbit LIN2=P0^4;
sbit en2= P0^5;
sbit R_CQG=P0^6; //接收信号处理口
sbit L_CQG=P0^7;
unsigned char flag;
unsigned char t,t1,t2,t3; //定义总时间、一段时间、二段时间、三短时间
unsigned char LPWM,RPWM; //左、右PWM变量
unsigned char disp[4]; //定义4个显示缓冲单元
unsigned char code dtab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,
0x01,0x09,0x91,0xfd,0xff};
//共阳极接法的数字0~9段码表
void Delayms(unsigned int x); //定义xms延时函数,x就是形式参数
void Disply164(void); //显示函数
/***************************************************
显示函数:用串行口方式0驱动74L164
***************************************************/
void Disply164(void) //显示函数
{
unsigned char i;
for(i=0;i<4;i++) //循环4次(4个数码管)
{
SBUF=dtab[disp[i]]; //查表取段码,串行送出
Delayms(2);
while(TI==0);
TI=0;
}
}
void timer0(void) interrupt 1
{
static unsigned char click=0; //中断次数计数器变量
static unsigned char num;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
++click;
if (click>=100)
click=0;
if (click<=LPWM) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
LIN1=0;
else
LIN1=1;
if (click<=RPWM)
RIN1=0;
else
RIN1=1;
if(++num>=250) //50ms送一次显示
{
num=0;
Disply164();
}
}
void timer1(void) interrupt 3
{
static unsigned char num; //中断次数计数器变量
TH1=0X3c; //恢复定时器初始值
TL1=0Xb0;
if(++num>=20)
{
num=0;
if(flag==0)
t1++;
else if(flag==1)
t2++;
else if(flag==2)
t3++;
}
disp[2]=12;
disp[3]=flag;
}
void init()
{
SCON=0X00;
TMOD=0X11;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
TH1=0X3c; //恢复定时器初始值
TL1=0Xb0;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
}
void main()
{
init();
en1=1;
en2=1;
LIN2=1;
RIN2=1;
disp[0]=0;
disp[1]=0;
disp[2]=0;
disp[3]=0;
while(1)
{
if(L_CQG==0&&R_CQG==0)
{
Delayms(1050);
if(L_CQG==0&&R_CQG==0)
{
flag++;
if(flag>=3)
flag=3;
}
}
if(flag==0)
{
disp[0]=t1%10;
disp[1]=t1/10;
if(L_CQG==1&&R_CQG==1)
{LPWM=50;RPWM=60;}
else if(L_CQG==0&&R_CQG==1)
{LPWM=15;RPWM=60;}
else if(L_CQG==1&&R_CQG==0)
{LPWM=50;RPWM=20;}
}
else if(flag==1)
{
disp[0]=t2%10;
disp[1]=t2/10;
if(L_CQG==1&&R_CQG==1)
{LPWM=90;RPWM=100;}
else if(L_CQG==0&&R_CQG==1)
{LPWM=20;RPWM=100;}
else if(L_CQG==1&&R_CQG==0)
{LPWM=90;RPWM=15;}
}
else if(flag==2)
{
disp[0]=t3%10;
disp[1]=t3/10;
if(L_CQG==1&&R_CQG==1)
{LPWM=50;RPWM=60;}
else if(L_CQG==0&&R_CQG==1)
{LPWM=15;RPWM=60;}
else if(L_CQG==1&&R_CQG==0)
{LPWM=50;RPWM=20;}
}
else if(flag==3)
{
t=t1+t2+t3;
en1=0;
en2=0;
Delayms(20000);
disp[0]=t%10;
disp[1]=t/10;
disp[2]=11;
disp[3]=10;
TR1=0;
}
}
}
/**************************************************************
函数功能:延时函数
**************************************************************/
void Delayms(unsigned int x) //定义xms延时函数,x就是形式参数
{
unsigned int i;
unsigned char j;
for(i=x;i>0; i--)
for(j=110;j>0;j--);
}
二、评语及成绩