基于MCS51单片机出租车计价器的设计.docx
《基于MCS51单片机出租车计价器的设计.docx》由会员分享,可在线阅读,更多相关《基于MCS51单片机出租车计价器的设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于MCS51单片机出租车计价器的设计
微型计算机技术专业方向课程设计
任务书
题目名称:
基于MCS-51单片机的
出租车计价器的设计
专业自动化班级122班
姓名张欣学号********2
学校:
青岛理工大学自动化学院
*******
2014年12月9日
课程设计任务书
课程名称:
微型计算机技术
设计题目:
基于MCS-51单片机的
出租车计价器的设计
系统硬件要求:
出租车计价按4公里起步费为7元,每公里2元计费,无等待计费功能。
要求每1s采样一次,假设轮胎周长1米,使用中断完成,费用精度要求1元。
显示部分为LED动态显示设计;并有键盘设计;
硬件设计:
1)最小系统设计:
AT89C51单片机为本设计的控制器,包括外扩ROM,RAM各32M(其大小由设计者自己设计),系统时钟电路、复位电路等构成的最小系统;
2)接口电路的设计:
设计者扩展一个并行接口〔8155或8255〕,键盘设计由设计者根据需要设计键盘的数量,显示采用LED显示,显示电路也根据显示的内容设计;
3)有开机显示状态(如显示000000);
4)在完成基本设计功能同时可以增加功能。
软件设计:
1)主程序设计(包括初始化芯片,定时器,中断以及SP指针等);
2)各功能子程序设计,温度采集计
算子程序、键盘子程序\显示子程序设计,定时,中断程序等;)
其他要求:
1、每位同学独立完成本设计。
2、依据题目要求,提出系统设计方案。
3、设计系统电路原理图。
调试系统硬件电路、功能程序。
编制课程设计报告书并装订成册,报告书内容(按顺序)
(1)报告书封面
(2)课程设计任务书
(3)系统设计方案的提出、分析
(4)系统中典型电路的分析
(5)系统软件结构框图
(6)系统电路原理图
(7)源程序
(8)课设字数不少于2000字
成绩
评语
摘要
本文是以MCS-51单片机系统为基础的,通过霍尔传感器检测车轮转动,生成计数脉冲,由MCS-51单片机内部计数器进行计数,从而计算出行驶距离,以及随行驶距离变化而变化的收费金额,通过多位数码管显示出来。
由于51单片机内部ROM容量小,采用2764扩展外部ROM来存储程序。
本系统最大化地利用了单片机的内部资源,结构简单,性能稳定,操作方便。
关键词:
计价器,MCS-51,霍尔传感器,2764
第一章系统总体设计
1.1系统概述
根据课程设计要求的性能指标,本系统要满足一定精度的价格计算的基本功能,同时系统还具有动态显示当前的计费值的功能和键盘操作的功能。
1.2系统原理分析
本文以MCS-51单片机系统为基础,通过霍尔传感器对车轮转动进行检测。
车轮轴上有一个小磁钢,车轮每转动一圈,磁钢靠近一次霍尔传感器,传感器输出一个脉冲。
单片机通过T1计数器对该脉冲进行计数,并根据轮胎周长计算行程,再根据计价规则算出计费值,通过数码管显示,计费精度达到1元。
本系统设计简单,性能稳定,能够通过单片机灵活编程进行各种功能的设定和修改。
根据本课题的设计目标以及硬件的特点,本系统的总体设计框图如图所示。
设计思路:
主程序主要执行定时器、计数器、中断的初始化,以及对数码管进行扫描显示。
首先开中断,包括定时器0中断、外部中断0和1;然后配置外部中断触发模式,以及定时器初值;最后扫描显示数码管。
其中,由于计数器每次返回计数值不确定,为了准确地工作,定时器与计数器均工作在方式一模式,外部中断触发方式为下降沿触发。
晶振频率为12MHz,定时器0每次重装值为65536-5000,即每次定时器中断计时为5000*12/(12MHz)=5ms.
流程图:
程序代码:
IE=0X8F;//开中断
TMOD=0X51;
TH0=(65536-5000)/256;//定时器初值为60536,即5ms
TL0=(65536-5000)%256;
IT0=1;
IT1=1;//中断定时器初始化
while
(1){
while(z==1)//未检测到开始按键之前显示0
{
JG(0);
}
while(z==0)//开始之后数码管显示当前计费值q
{
JG(q);
}
}
T0作为定时器开中断,进入中断首先执行定时器初值的重装,然后判断计费器是否处于计费状态,从而决定是否向TH1和TL1取回计数值,计算总行程以及当前计费值并存入单片机。
总行程与当前计费值分别记为zong和q.计算方法根据设计要求得到,起步价为4km7元,以后2元/km,要求精度为1元,所以程序为每500m计费1元。
流程图:
是
是
否
程序代码:
staticnum=0;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;//定时器初值重装为60536
num++;
if(flag==0)//若flag为0,则按下了暂停键,此时每次定时器时间到计数器清零
{
TH1=0;
TL1=0;
}
if((num>=2)&&flag)//若flag为1,且定时器时间到采样时间,为了更灵敏地显
{//示计费,扫描周期设定为2个中断周期
num=0;
shu=TH1*256+TL1;
zong=zong+shu;//定时器数值存入zong
TH1=0;
TL1=0;//计数器清零
if(zong>=4000)
{
q=(zong-4000)/500+7;//若果zong大于起步公里数(4km)进行此步计算价格
}
}
外部中断0用于检测按键“开始/暂停”。
“开始”被按下表示计价器从非计费状态转为计费状态或暂停,此时计数器与定时器均为开通状态。
程序代码:
flag=!
flag;//按下一次开始,再次按下取反
z=0;
TR0=1;//定时器开通
TR1=1;//计数器开通
外部中断0用于检测按键“复位”。
“复位”被按下表示计价器从计费状态转为非计费状态或保持非计费状态,总行程(zong)与计费值(q)回到初值,关闭定时器与计数器,清空计数值。
程序代码:
z=1;//非计费状态
flag=0;
q=7;
zong=0;
TR0=0;//关闭定时器
TR1=0;//关闭计数器
TL1=0;
TH1=0;
此系统采用数码管显示,因此需要计算每一位的显示值。
这里采用多位数码管,每次只能显示一位,为了让多位数码管看起来都亮,程序必须高速扫描显示,由于人的视觉暂留效应,会看起来多位数码管都亮了。
值得注意的是,随着程序运行,同一位的显示值会变,这体现在数码管段的亮灭上,为了不使显示不清晰,下次点亮之前必须先关闭该位,即不显示。
程序代码:
sbitL1=P3^6;//千位
sbitL2=P3^4;//百位
sbitL3=P3^1;//十位
sbitL4=P3^0;//个位
#definecom1L1=1;L2=0;L3=0;L4=0
#definecom2L1=0;L2=1;L3=0;L4=0
#definecom3L1=0;L2=0;L3=1;L4=0
#definecom4L1=0;L2=0;L3=0;L4=1
#definecom0L1=0;L2=0;L3=0;L4=0//单个数码管点亮定义
P1=tab[a%10];//最低位(个位)
com4;//点亮个位
delay(10);//延时
com0;//关闭显示
P1=tab[(a/10)%10];//十位
com3;
delay(10);
com0;
P1=tab[(a/100)%10];//百位
com2;
delay(10);
com0;
P1=tab[a/1000];//千位
com1;
delay(10);
com0;
voiddelay(uintb)//延时函数
{
uintx=110;
for(x;x>0;x--)
for(b;b>0;b--);
}
第三章硬件部分
3.1单片机最小系统及键盘模块
80C51有两个16位定时计数器,两个外中断,两个定时计数中断,及一个串行中断,并有4个8位并行输入口。
80C51内部有时钟电路,但需要石英晶体和微调电容外接,本系统中采用12MHz的晶振频率。
由于80C51的系统性能满足系统数据采集及时间精度的要求,而且产品产量丰富来源广,应用也很成熟,故采用来作为控制核心。
80C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
本系统包括晶振电路,复位电路,扩展外部ROM电路,键盘电路等,为了不使电路看起来过于混乱,这里采用网络标号的方法代替连线。
电路图如下:
图1
3.2数码管显示模块
用数码管显示价格低廉且亮度高,很适合用于计价器显示。
图中P1口(网络编号B)用于显示数码管,接数码管段选端。
P3.0、P3.1、P3.4、P3.6(网络编号C)接数码管位选端。
图2
3.3霍尔传感器模块
霍尔传感器是对磁敏感的传感元件,常用于开关信号采集的有CS3020、CS3040等,这种传感器是一个3端器件,外形与三极管相似,只要接上电源、地,即可工作,输出通常是集电极开路(OC)门输出,工作电压范围宽,使用非常方便。
如图1所示是CS3020的外形图,将有字面对准自己,三根引脚从左向右分别是Vcc,地,输出。
图3
使用霍尔传感器获得脉冲信号,其机械结构也可以做得较为简单,只要在车轮转轴的圆周上粘上一粒磁钢,让霍尔开关靠近磁钢,就有信号输出,转轴旋转时,就会不断地产生脉冲信号输出。
所以霍尔传感器测速实际上是测转轴转动频率。
在粘磁钢时要注意,霍尔传感器对磁场方向敏感,粘之前可以先手动接近一下传感器,如果没有信号输出,可以换一个方向再试。
这种传感器不怕灰尘、油污,在工业现场应用广泛。
霍尔传感器测速电路原理图如下:
图4
在仿真电路中,为了更清晰明了地展示计价器的工作,霍尔传感器采样的部分用一个模拟脉冲发生器代替了(见图1),接P3.5/T1计数器计数通道。
3.4外部存储器模块
本系统扩展8KROM,用了一片2764以及一片地址锁存器74LS373,其中使用地址线P0.0~P0.7及P2.0~P2.4,P0.0~P0.7复用为数据线。
单片机EA脚接地,程序存储地址均为外部ROM.地址范围为:
0000H~1FFFH
扩展原理图如下:
图5
第四章辅助调试工具
使用proteus辅助调试,可以直观地看到程序及硬件电路的实现效果,设计者可以很方便地根据效果分析系统存在的问题,并找出解决方法,而且可以通过模拟测量仪器对电路进行实时监控。
如图所示:
图6
图7
总结
出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。
所以,我们小组进行了出租车计价器的设计。
经过一段时间的学习设计,出租车计费器系统的设计已经全部完成,能按预期的效果进行模拟汽车启动,停止,暂停等功能并能够通过数码管显示车费数目。
即使这样,在设计调试仍然存在一些问题,可能无法做到真正的实践使用,还需要一些调整改正。
这一段时间,经过小组成员的努力,我们基本完成了初始设计目的,但在这个过程中我发现自己存在一些问题,那就是我平时学习积累远远不够,在参与设计的过程中,有许多力不能及的地方,都是在上网学习后者组员帮助下才能完成。
这说明了一点,书本上的东西真要实践起来是完全不一样的,在这方面我有很大的不足,实践方面的能力远远不够。
虽然在这次设计中我有很多的不足,但正是在这次设计中我学到了很多东西,通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。
经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。
通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。
这在以前的学习过程中是不曾学到的。
并且这次设计还使我认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。
参考文献:
《单片机原理及其接口技术》(第三版)胡汉才主编
《数字电子技术基础》(第五版)清华大学电子学教研室组编阎石主编
《自动检测技术及仪表控制系统》(第三版)张毅张宝芬曹丽彭黎辉编
附录一程序代码
#include
typedefunsignedintuint;
typedefunsignedcharuchar;
voiddelay(uintb);//延时函数声明
voidJG(uinta);//价格数值拆分及显示函数
sbitL1=P3^6;
sbitL2=P3^4;
sbitL3=P3^1;
sbitL4=P3^0;
#definecom1L1=1;L2=0;L3=0;L4=0
#definecom2L1=0;L2=1;L3=0;L4=0
#definecom3L1=0;L2=0;L3=1;L4=0
#definecom4L1=0;L2=0;L3=0;L4=1
#definecom0L1=0;L2=0;L3=0;L4=0//单个数码管点亮定义
ucharcodetab[]={
0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0x0F8,0x80,0x90
};
ucharz=1,flag=0;
uintq=7,zong=0,shu=0;
voidmain()
{
IE=0X8F;
TMOD=0X51;
TL0=(65536-5000)%256;
TH0=(65536-5000)/256;
IT0=1;
IT1=1;//中断定时器初始化
while(z==1)//未检测到开始按键之前显示0
{
JG(0);
}
while(z==0)//开始之后数码管显示
{
JG(q);
}
}
voidTT0(void)interrupt1//定时器中断
{
staticnum=0;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
if(flag==0)//若flag为0,则按下了暂停键,此时每次定时器时间到计数器清零
{
TH1=0;
TL0=0;
}
if((num>=2)&&flag)//若flag为1,且定时器时间到扫描时间
{
num=0;
shu=TH1*256+TL1;
zong=zong+shu;//定时器数值存入zong
TH1=0;
TL1=0;//计数器清零
if(zong>=1000)
{
q=(zong-500)/500+7;//若果zong大于起步公里数进行此步计算价格
}
}
}
voidTT1(void)interrupt3
{
}
voidkaishi0(void)interrupt0//开始暂停按键检测
{
flag=!
flag;//按下一次开始,再次按下取反
z=0;
TR0=1;
TR1=1;
}
voidfuwei(void)interrupt2//复位按键检测
{
z=1;
flag=0;
q=7;
zong=0;
TR0=0;
TR1=0;
TL1=0;
TH1=0;
}
voidJG(uinta)//价格数值拆分及显示函数
{
P1=tab[a%10];
com4;
delay(10);
com0;
P1=tab[(a/10)%10];
com3;
delay(10);
com0;
P1=tab[(a/100)%10];
com2;
delay(10);
com0;
P1=tab[a/1000];
com1;
delay(10);
com0;
}
voiddelay(uintb)//延时函数
{
uintx=110;
for(x;x>0;x--)
for(b;b>0;b--);
}
附录二硬件电路图
附录三PCB图