出租车计价器Word文档下载推荐.docx
《出租车计价器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《出租车计价器Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
5课程设计体会4
参考文献4
附1源程序代码4
附2系统原理图4
1概述
功能要求
(1)能显示里程,单位为公里,最后一位为小数位。
(2)能显示金额数,单位为元,最后一位为小数位。
(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。
(4)车速<
5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里。
(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计算价格。
(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。
1.2设计参数
由于要求没有给出车轮的相关参数,所以这里进行一些基本参数的查询。
据调查统计,现行出租车轮胎直径大致有四种,直径分别为520mm、540mm、560mm和580mm.
本作品针对560mm的出租车进行设计。
它的周长为:
1.7584m,57圈行驶100m.
1.3系统原理
本设计硬件电路分为五个单元:
软件系统分为五个大的模块为:
2系统总体方案及硬件设计
2.1系统总体方案
本设计可以分为五个单元,单片机最小系统单元,指示灯电路单元,按键电路单元,路程时间与金额显示单元,转速信号接收单元,如下图:
单片机最小系统单元主控机系统采用了Atmel公司生产的AT89S52单片机,它含有256字节数据存储器,内置8K的电可擦除FLASHROM,可重复编程,大小满足主控机软件系统设计。
AT89S51芯片的40个引脚功能为:
VCC电源电压。
GND接地。
RST复位输入。
当RST变为高电平并保持2个机器周期时,将使单片机复位。
WDT溢出将使该引脚输出高电平,设置SFRAUXR的DISRTO位(地址8EH)可打开或关闭该功能。
DISKRTO位缺省为RESET输出高电平打开状态。
XTAL1反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2来自反向振荡放大器的输出。
P0口一组8位漏极开路型双向I/O口。
也即地址/数据总线复用口。
作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
Flash编程和程序校验期间,P1接收低8位地址。
P2口一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器时,P2口线上的内容在整个访问期间不改变。
Flash编程和程序校验期间,P2亦接收低8位地址。
P3口一个带内部上拉电阻的8位双向I/O口。
P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写“1”时,它们被内部的上拉电阻把拉到高电并可作输入端口。
作输入端口使用时,被外部拉低的P3口将用上拉电阻输出电流。
P3口除了作为一般的I/O口线外,还作特殊功能口。
原理图如下:
图1
2.3转动信号采集单元
转动信号采集是利用霍尔传感器来实现的,转轮每转动一周,霍尔传感器发出一个脉冲,然后发给单片机的外部中断0端口P3.2,通过中断来接受传感器的信号。
2.4显示单元
采用两个四个一组的八位数码管来显示,一组显示金额,另一组显示路程与等待时间配合按键来切换。
数据端都用单片机P1口,片选端分别接在P2口的高四位和低四位。
它们的连线如下:
图二
2.5键盘与指示单元
本设计按照功能要求设置了四个按键和四个LED灯。
(1)按键说明如下:
key0系统清零,用来将整个计费系统的显示清零;
key1显示切换,用来切换路程与等待时间的显示;
key2单程双程,用来设置是单程还是往返计费;
key3系统暂停,用来将整个计费系统暂停;
(2)指示灯说明如下:
led1指示单程还是双程,当选择双程计费时亮;
led2指示系统暂停与否,当选择暂停时亮;
led3指示是否进入等待计费,计入等待计费时亮;
led4指示显示的是路程还是等待时间,显示等待时间时亮。
3软件设计
3.1总体流程
3.2计算模块
计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
总金额=起步价+(里程-3)*单价+等待时间*等待单价;
否则,执行公式:
总金额=起步价+等待时间*等待单价。
对于里程数采用外部中断零来记录,车轮没转一周,霍尔传感器发一个脉冲然后进入中断子程序,对相应的变量进行更新。
对于速度的判断及等待时间的记录采用定时器零中断,设定10ms一个中断,然后判断车速,小于5公里/小时时,则开始记录等待时间。
3.3键盘扫描
键盘扫描才用查询方式,当有按键按下时就对相应的标志进行取反,或调用其他子函数,在消抖过程中,这里将数码管显示程序潜入以保证显示的稳定。
3.4显示程序
显示程序利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
本设计采用两个四个一组的八位数码管来显示,一组显示金额,另一组显示路程与等待时间配合按键来切换。
4Proteus软件仿真
将整个系统原理图在Proteus连接好后,下载如编写好的程序仿真如下:
如图显示的状态设置为:
单程,车速大于5km/h,当路程等于4.5km时的显示情况。
5课程设计体会
经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。
在课程设计的过程中,还是碰到了许多的问题。
比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;
对于代码的前后顺序及调用掌握得还不够好;
对于一些相关的应用软件没能熟练掌握。
通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。
通过这次课程设计我们最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。
在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;
这次设计给了我们极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
参考文献:
[1]谭浩强著.C程序设计[M].北京:
清华大学出版社,2005
[2]张友德、赵志英、涂时亮著.单片微型机原理、应用与实验[M].上海:
复旦大学出版社,2006.10
[3]吴戈、李玉峰编著.案例学单片机C语言开发[M].北京:
人民邮电出版社,2008.10
[4]孙余凯.传感器应用电路300例[M].北京:
电子工业出版社,2008.
[5]田立.51单片机C语言程序设计快速入门[M].北京:
人民邮电出版社,2007
附1源程序代码:
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharqianwei,baiwei,shiwei,gewei;
//显示数据各个位置数字的临时变量
charled_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//段码表示0-9
uinttt,aa,round,distance,cost,price,wait;
//定义路程、价钱、等待时间及一些全局的变量等;
uchardengdai,second,minute;
unsignedlongwait_ten_ms;
//记录等待时间多少个10ms
//按键的定义,所有按键按下去为低电平
sbitkey0=P1^0;
//清零
sbitkey1=P1^1;
//切换路程与等待时间
sbitkey2=P1^2;
//单程还是往返设置
sbitkey3=P1^3;
//暂停按钮
sbitled1=P1^4;
//双程
sbitled2=P1^5;
//暂停
sbitled3=P1^6;
//堵车
sbitled4=P1^7;
//切换
//标志位定义
bitkey1_flag;
//由于按键会自动复位,这个为标志位
bitkey2_flag;
bitkey3_flag;
bitflag;
//初始化函数
voidinitial_data(void)
{
distance=0;
cost=0;
second=0;
minute=0;
wait_ten_ms=0;
key1_flag=1;
//
key2_flag=0;
//单程or往返,接指示灯;
key3_flag=1;
//暂停,接指示灯;
flag=0;
round=0;
dengdai=0;
led1=0;
//双程指示
led2=0;
//暂停指示
led3=0;
//堵车指示
led4=0;
//等待时间切换标志
}
//暂停程序
voidzanting(void)
{
if(key3_flag)
{
EX0=0;
//关闭中断和定时器
TR0=0;
}
else
EX0=1;
TR0=1;
key3_flag=!
key3_flag;
}
//计算数据处理
voidjisuan()
distance=round/57+wait_ten_ms/3000;
//车轮转57圈为100m,等待时间30s为100m
if(distance<
=30)
cost=50;
price=20;
//单程价格
if(key2_flag)
price=15;
//往返价格
if(distance>
30)
cost=price*(distance-30)/10+50;
wait=minute*100+second;
//显示的辅助程序,分离一个数的各个数字
voidfenli(uinttemp)//数据的分离处理
if(temp>
9999)temp=9999;
qianwei=temp/1000;
baiwei=temp/100%10;
shiwei=temp%100/10;
gewei=temp%10;
//延时供数码管显示时使用
voiddiplay_delay(void)
uinti;
for(i=0;
i<
290;
i++);
//显示程序;
voidled_show()
//-----显示路程或者等待时间----
if(key1_flag)fenli(distance);
elsefenli(wait);
P2=0xfe;
P0=led_seg_code[gewei];
diplay_delay();
P2=0xfd;
if(key1_flag)P0=led_seg_code[shiwei]|0x80;
//如果是路程,点亮小数点儿
elseP0=led_seg_code[shiwei];
//如果是时间,不需要点亮小数点儿
P2=0xfb;
if(key1_flag)P0=led_seg_code[baiwei];
elseP0=led_seg_code[baiwei]|0x80;
P2=0xf7;
P0=led_seg_code[qianwei];
//-----显示价格----
fenli(cost);
P2=0xef;
P2=0xdf;
P0=led_seg_code[shiwei]|0x80;
P2=0xbf;
P0=led_seg_code[baiwei];
P2=0x7f;
P2=0xff;
//延时时基为1ms
voiddelay(uintx)
inti,j;
for(i=x;
i>
0;
i--)
for(j=340;
j>
j--);
//键盘的扫描
voidkeyscan()
{if(key1==0)//显示切换
{delay(5);
if(key1==0)
key1_flag=!
key1_flag;
while(!
key1)led_show();
delay(5);
if(key0==0)//清零
if(key0==0)
initial_data();
if(key3==0)//暂停
if(key3==0)
zanting();
key3)led_show();
if(key2==0)//单程还是往返
if(key2==0)
key2_flag=!
key2_flag;
while(!
key2)led_show();
//指示等扫描
led1=!
//指示,单程还是往返,灯低电平点亮;
往返亮;
led2=key3_flag;
//指示,暂停时亮;
led3=flag;
//指示是否等待;
led4=key1_flag;
//切换指示,显示路程还是等待时间;
diplay_delay();
//中断及定时器初始化
voidinitial_time()
TMOD=0x01;
//工作在模式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
IE=0x83;
IT0=1;
//外部边沿触发方式
TR0=1;
//中断记录脉冲数
voidzd()interrupt0//中断0
aa++;
if(flag)round++;
//*********定时器********
voidtime0()interrupt1//定时0
//10ms
tt++;
//由于发的电机转速较高不宜调,为方便演示,设置每秒转动少于25周进入当代计费,
//实际则可以另外设置
if(tt>
=100)//1s采样
tt=0;
if(aa<
=25)flag=0;
elseflag=1;
aa=0;
if(!
flag)
{
wait_ten_ms++;
dengdai++;
if(dengdai==100)
{dengdai=0;
second++;
if(second==60)
{
minute++;
second=0;
}
//主程序
voidmain(void)
//初始化数据
initial_time();
//初始化定时器
while
(1)
keyscan();
jisuan();
led_show();
附2系统
原理图