单片机课程设计出租车计价器.docx
《单片机课程设计出租车计价器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计出租车计价器.docx(22页珍藏版)》请在冰豆网上搜索。
![单片机课程设计出租车计价器.docx](https://file1.bdocx.com/fileroot1/2023-1/14/4165648d-ec75-4239-8b52-066f1a717f5e/4165648d-ec75-4239-8b52-066f1a717f5e1.gif)
单片机课程设计出租车计价器
河南理工大学
《单片机应用与仿真训练》设计报告
题目:
出租车计价器设计
姓名:
吴昊
学号:
3
姓名:
林涛
学号:
31
专业班级:
自动化10—8班
指导老师:
刘巍
所在学院:
电气工程与自动化学院
2012年1月16日
摘要
随着科技的进步和社会的发展,出租车行业已经成为交通的重要部分,因此是制定一个合适的出租车计价系统对于出租车公司和乘客是非常重要的。
本课程设计以STC10F08XE单片机为核心,实现对出租车多功能计价设计。
出租车的计价是又乘客所选择的乘车方式和出租车所行驶的里程所决定的,而出租车的行驶的里程可通过测量车轮旋转的圆周圈数间接计算出来,本课程设计用微型电电动机模拟出租车轮,通过安装在微型电动机上的霍尔传感器测量车轮旋转圈数。
输出的脉冲信号被接入到STC10F08XE单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程,并且可以计算实时的速度,在速度低于5公里每小时是进入等待计费。
同时根据乘客选择的乘车方式选择收费标准,计算出乘客应付的出租车费用,并显示在数码管上。
本设计可以实现单双程设置、系统暂停和清零、空车指示、信息显示、显示切换、掉电保护等功能。
它由5个单元组成:
按键电路单元,指示灯电路单元路,转速信号,接收单元程时间与金额显示单元。
软件系统可以大致分为五个大的模块为:
总初始化模块,按键扫描模块,中断与定时模块,数据计算模块,数码管显示模块。
关键字:
多功能计价器;STC10F08XE;霍尔传感器;直流电动机
1.3设计参数.......................................................................................................................................1
第一章概述
1.1初始条件
(1)运用所学的单片机原理与接口技术知识和数字电路知识;
(2)STC10F08XE单片机应用开发系统一套;
(3)PC机及相关应用软件。
1.2要求完成的主要任务
(1)能显示里程,单位为公里,最后一位为小数位。
(2)能显示金额数,单位为元,最后一位为小数位。
(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。
(4)车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里。
(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计算价格。
(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。
1.3设计参数
由于要求没有给出车轮的相关参数,所以这里进行一些基本参数的查询。
据调查统计,现行出租车轮胎直径大致有四种,直径分别为520mm、540mm、560mm和580mm.
本作品针对560mm的出租车进行设计。
它的周长为:
1.7584m,57圈行驶100m。
第二章出租车计价系统的设计方案
出租车计价器用于记录里程与价格的关系,它能有效地避免司机与乘客的矛盾,保证双方的利益。
计价是根据车所行驶的路程决定的,出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到,即可计算得到车轮旋转几周出租车能行驶一公里的路程。
使用霍尔传感器方便地计量车轮旋转的圈数。
输出的脉冲信号被接入到STC10F08XE单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程,并且可以计算实时的速度,在速度低于5公里每小时是进入等待计费。
于此同时,根据不同的收费标准,通过选择相应的起步价、单价等收费标准进行计算。
通过键盘能够实现往返设置,启动、暂停、停止计价器以及切换显示当前的行驶里程和需支付的车费。
本设计硬件电路分为五个单元:
单片机最小系统单元,指示灯电路单元,按键电路单元,路程时间与金额显示单元,转速信号接收单元。
软件系统分为五个大的模块为:
总初始化模块,按键扫描模块,中断与定时模块,数据计算模块,数码管显示模块。
其中,键盘扫描和数码管显示采用查询方式,转速信号接收与等待记时采用中断方式。
这些软硬件系统构成了最终的设计。
系统框图如图1所示:
图1
第三章出租车计价系统的硬件设计
3.1单片机最小系统单元
本课程设计主控系统采用STC公司生产的STC10F08XE单片机,其内部存储空间满足系统软件设计,各引脚功能如下。
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行
校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为STC10F08XE的一些特殊功能口,P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
单片机最小系统电路如图2。
图2
3.2显示单元电路设计
七段LED共阴极数码管显示有八个发光二级管组成,其管脚配置及常用的字符段码表如下图:
显示字符
共阴数码管段码
显示字符
共阴数码管段码
0
3FH
C
39H
1
06H
D
5EH
2
5BH
E
79H
3
4FH
F
71H
4
66H
.
80H
5
6DH
P
73H
6
7DH
U
3EH
7
07H
T
31H
9
7FH
Y
6EH
9
6FH
8.
FFH
A
77H
“灭”
00H
B
7CH
自定义
本课程设计采用1个四位8段共阴数码显示,通过按键将数码管显示切换为不同的状态,即应付金额显,行驶路程,等待时间一组显示金额,另一组显示路程与等待时间配合按键来切换。
四位八段共阴极数码管电路连接图3.
图3
3.3键盘及LED指示灯电路设计
由于只有一个四位八段共阴极数码管,因此不能将应付金额,行驶路程,等待时间同时显示出来,故需要通过键盘使数码管在三种之间进行切换,并以发光二级管作为数码管显示状态的标志,键盘的切换功能和LED灯所表示的状态如下
按键1:
系统清零按键,将数码管显示清零;
按键2:
单双程切换按键,用来显示是单程收费还是双程;
按键3:
路程与等时间切换按键:
按键4:
系统暂停按键暂;
按键5:
价格显示按键;
LED1:
清零显示标志;
LED2:
单双程收费显示标志;
LED3:
时间显示标志;
LED4:
暂停标志;
LED5:
单片机是否检测到车辆在行驶。
其键盘和LED指示灯的电路图如图4.
图4
3.4路程测量部分设计
里程计算是通过安装在车轮上的霍尔传感器A44E检测到的信号,送到单片机,经处理计算,送给显示单元的。
此处选择单片机P3.2作为单片机的接收信号,其原理图5所示:
图5
第四章出租车计价系统的软件设计
硬件电路搭建完成只是出租车计价器设计的基础,实现出租车计价器的核心是其软件的设计,本课程设计采用C语言编写,共分五部分:
扫描部分,中断部分,显示部分,计算部分。
4.1扫描程序
对于扫描式键盘判键,首先看有键按下不,如果有键按下则延时一会儿,在判断是否真的有键按下,如果确实有键按下,在判键释放,最后执行键功能程序。
判键子函数的流程框图如图6所示。
判键子程序流程(图6)
4.2中断程序
当车轮每转动依次时,霍尔传感器就输出一个低电平信号,并传给单片机系统,产生一次中断每当光电传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满50次时,进入里程计数中断服务程序中,里程变量加一。
主函数中总金额也相应地变化。
其流程图如下图
图7
4.3显示程序
对于一个四位八段位共阴极数码管,采用动态显示,通过按键在计费金额显示,等待时间显示,行驶路程三种显示状态间切换。
4.4计算程序
计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:
总金额=起步价+等待时间*等待单价。
图8
五proteus仿真
5.1Proteus介绍
Proteus软件是来自英国Labcenterelectronics公司的EDA工具软件,它组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。
此系统受益于15年来的持续开发,被《电子世界》在其对PCB设计系统的比较文章中评为最好产品—“TheRoutetoPCBCAD”。
Proteus产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。
用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。
其功能模块:
—个易用而又功能强大的ISIS原理布图工具;PROSPICE混合模型SPICE仿真;ARESPCB设计。
PROSPICE仿真器的一个扩展PROTEUSVSM:
便于包括所有相关的器件的基于微处理器设计的协同仿真。
此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LEDs甚至LCD显示CPU模型。
支持许多通用的微控制器,如PIC,AVR,HC11以及8051。
最新支持ARM。
交互的装置模型包括:
LED和LCD显示,RS232终端,通用键盘,I2C,SPI器件。
强大的调试工具,包括寄存器和存储器,断点和单步模式。
IARC-SPY和KeiluVision2等开发工具的源层调试。
应用特殊模型的DLL界面-提供有关元件库的全部文件。
5.2软件仿真
将整个系统原理图在Proteus连接好后,下载如编写好的程序下载进仿真单片机系统,仿真如图显示的状态,设置为:
单程,车速大于5km/h,当路程等于40.4km时的显示情况。
第六章设计体会与小结
本次单片机课程设计,我们选的题目是出租车计价器的设计。
通过仿真、焊接、调试等不断的努力,我们的出租车计价器实现了基本要求的全部功能和发挥部分的部分功能。
比如能显示里程、金额数、总等待时间,可设定单程价格和往返价格,按暂停键,计价器可暂停计价,按查询键,可显示总等待时间,空车指示、信息存储等。
最近以来,经过我和队友的努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些不足。
经过这一个月的学习,我觉得自己不论是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。
这次设计很好的把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。
通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。
经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。
通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。
这在以前的学习过程中是不曾学到的。
这次设计是我们认真认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。
另外通过本次设计,认识到自己理论知识的应用能力有很大的欠缺,需要在以后的学习中进一步提高。
参考文献
1.李广弟,朱月秀,冷祖祁.单片机基础[M].第3版.北京航空航天大学出版社,2007
2.李华.MCS-51系列单片机实用接口技术[M].北京航空航天大学出版社,1996
3.李群芳,肖看.单片机原理接口与应用.北京:
清华大学出版社,2005
4.朱承高.电工及电子技术手册[M].北京:
高等教育出版社,1990
5.高峰.单片微型应用系统设计及实用技术.北京:
机械工业出版社,2004
6.胡辉,单片机原理及应用设计—21世纪高等院校规划教材[M],水利水电出版社,2005.7
7.刘守义,单片机应用技术[M],西安:
西安电子科技大学出版社,1996
附录
源程序代码
LLED灯标志子程序
#include"stc10.h"
#include
#include"chuli.h"
#include"type.h"
externbitkey1_flag,key0_flag,key3_flag,flag;
externucharsecond,minute,key2_flag;
externuintdistance,price,cost,wait,round;
voidjisuan(void)
{
wait=minute*60+second;
distance=round+wait/30;//车轮转57圈为100m,等待时间30s为100m
if(key1_flag)
price=15;//往返价格1.5元/公里
else
price=20;//单程价格2元/公里
if(distance<=30)//小于3公里
cost=50;
else
cost=price*(distance-30)/10+50;//(distance-30)/10是公里数
}
voidinit_data(void)
{
distance=0;
cost=0;
round=0;
second=0;
minute=0;
key0_flag=0;//空车
key1_flag=0;//单程
key2_flag=1;//路程
key3_flag=0;//正常,非暂停
flag=1;
}
voidinit()
{
P1M1=0x00;
P1M0=0xff;
init_data();//初始化数据
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;//开定时器中断
IT0=0;//外部中断0边沿触发方式
EA=1;//开总中断
EX0=1;//开外部中断
TR0=1;//开定时器
}
键盘扫描子程序
#include"stc10.h"
#include
#include"yanshi.h"
#include"type.h"
#include"chuli.h"
#include"keyscan.h"
externbitkey0_flag,key1_flag,key3_flag,flagxian,flag;
externucharkey2_flag,second,minute;
externuintdistance,price,cost,wait,round,temp;
voidkeyscan(void)
{
P3&=0x3f;
P0|=0xe0;
if(P0!
=0xe0)
{
delay(10);
if(P0!
=0xe0)
{
P3|=0x80;
P3&=0xbf;
switch((P0&0xe0))
{
case0xc0:
key0_flag=!
key0_flag;if(!
key0_flag)init_data();break;//空车
case0xa0:
key1_flag=!
key1_flag;break;//单程还是双程
case0x60:
key2_flag++;break;//路程还是时间
}
P3|=0x40;
P3&=0x7f;
switch((P0&0xe0))
{
case0xc0:
key3_flag=!
key3_flag;if(key3_flag)//暂停还是正常
{
EX0=0;//关闭外部中断和定时器
TR0=0;
}
else
{
EX0=1;
TR0=1;
}break;
case0xa0:
flagxian=!
flagxian;break;//价格
}
P3&=0x3f;
P0|=0xe0;
while(((P0&0xe0)==0xc0)||((P0&0xe0)==0xa0)||((P0&0xe0)==0x60));
}
}
}
延时子程序
#include
#include"yanshi.h"
#include"type.h"
//#defineucharunsignedchar
//#defineuintunsignedint
voiddelay(uintz)
{
ucharj;
uinti;
for(i=z;z>0;z--)
for(j=0;j<115;j++);
}
处理子程序
#include
#include"yanshi.h"
#include"type.h"
//#defineucharunsignedchar
//#defineuintunsignedint
voiddelay(uintz)
{
ucharj;
uinti;
for(i=z;z>0;z--)
for(j=0;j<115;j++);
}
主函数程序
#include"stc10.h"
#include
#include"yanshi.h"
#include"keyscan.h"
#include"smg.h"
#include"chuli.h"
#include
#include"type.h"
//#defineucharunsignedchar
//#defineuintunsignedint
ucharcount,duche;
ucharquanshu;
ucharsecond,minute;//等待时间
uintround,temp;//路程,单位100m
uintdistance;//走过距离,单位100m
uintprice,cost;//单价,总价钱
uintwait;//等待时间/秒
bitkey0_flag;//(空车)/载客标志位
bitkey1_flag;//单程还是往返标志位
ucharkey2_flag;//路程与等待时间标志位
bitkey3_flag;//暂停标志位
bitflag;//堵车(等待)标志位
bitflagxian;
voidmain(void)
{
init();//总初始化
while
(1)
{
keyscan();
jisuan();
if(flagxian==0)
{display();}
if(flagxian==1)
{
disjia();
}
}
}
//中断记录脉冲数
voidzd(void)interrupt0//中断0
{
duche++;
if(flag)
{
quanshu++;
if(quanshu>=200)//车轮转57圈为100m
{
round++;
quanshu=0;
}
}
}
//定时器
voidtimer0(void)interrupt1//定时0
{
TH0=(65536-50000)/256;//50ms
TL0=(65536-50000)%256;
count++;
if(count>=20)//1s采样,计算速度
{
count=0;
if(duche<=5)flag=0;//堵车(等待)
elseflag=1;
duche=0;
if(!
flag)//等待时间计时
{
second++;
if(second==60)
{
minute++;
second