出租车计价器课程设计报告.docx
- 文档编号:10303169
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:31
- 大小:397.44KB
出租车计价器课程设计报告.docx
《出租车计价器课程设计报告.docx》由会员分享,可在线阅读,更多相关《出租车计价器课程设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
出租车计价器课程设计报告
河南工程学院
单片机课程设计
题目:
出租车计价器
院系:
电气信息工程学院
专业:
电气工程及其自动化
成员:
张靖瑜、邱绪艳、高倩楠
指导老师:
瓮嘉民
2012年11月29日
课程设计报告评语
该组在实训期间,认真完成规定的课程设计内容,认真听讲,积极学习,实训报告条理清晰、内容详实、字迹整洁、能独立完成实训作品,动手能力得到很大提高。
该组圆满完成实训任务,效果
等级:
评阅人:
职称:
年月日
总方案设计
本次设计是使用单片机技术来实现一个模拟出租车的计价器,利用单片机丰富的IO端口及其控制的灵活性,实现基本的里程计价功能和等待功能等。
具有性能可靠、电路简单、成本低、扩展空间大等特点。
一.设计任务
本次课程设计的任务是设计一款基于STC89C52单片机的出租车计价器,通过对传感器的检测,对数值进行处理和显示。
设计总框图如图1-1:
图1-1计价器系统框图
1.1基本要求
设计一个模拟出租车计价器,计费包括起步价、行车里程计费两部分,用两个四位一体的数码管分别显示总金额和里程,一个数码管显示价格,起步价为5.0元,最大值为9999元,3Km之内起步价计费,超过3km,增加1元(即1km增加1元);一个显示里程,精确到0.1km,最大值为999.9km.
①、计费功能
费用的计算是按行驶里程收费,设起步价为5元。
1、当里程<3km时,按起价计算费用
2、当里程>3km时,每公里多加1元,总费用=5+1*(X-3)
②、显示功能
1、显示里程:
用四位数字显示,显示方式为“XXX.X”,单位为km,计程范围0-999.9km,精确到0.1km。
2、显示费用:
用四位数字显示,显示方式为“XXXX”,单位为元,计价范围0-9999元,精确到1元。
1.2发挥部分
增加扩展按键,可以根据需求定义新功能。
二.软件算法
2.1系统主程序流程图
图2-1系统主程序流程图
2.2数据处理子程序流程图
每当霍尔传感器输出一个脉冲,里程和金额都相应变化,当然等待时间也换算成里程,计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
金额=(里程-3)*单价+5;否则,执行公式:
总金额=起步价。
程序流程图如图2-2所示。
图2-2数据处理子程序流程图
2.3等待时间计时子程序
当出租车停止时,等待时间被换算成里程,进行计算,显示换算过的里程数和金额。
当结算时停止计时和计费并显示金额,当有清零键按下时存储本次金额。
如图2-3:
图2-3等待时间计时子程序
2.4键盘扫描子程序
键盘处理状态表如下表2-1.
操作
状态
Key1按下(开始键)
开始打表,打开INT0中断,开始采集轮子脉冲,记录距离
Key2按下(结算键)
关闭各个中断,停止采集轮子脉冲
Key3按下(堵车键)
进入堵车状态并计费
Key4按下(查询键)
显示总路程、总金额
Key5按下(清零键)
清零当前值
表2-1
当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。
流程图如图2-4。
图4-4键盘扫描子程序
三.硬件设计
3.1单片机最小系统
复位电路和晶振电路是STC89C52工作所需的最简外围电路。
单片机最小系统电路图如图3-1所示。
图3-1单片机最小系统
STC89C52的复位端是一个史密特触发输入,高电平有效。
RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。
在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接12M晶振和两个30pF电容组成系统的内部时钟电路。
3.2测距单元
本次设计我们选取了霍尔传感器来进行里程测量。
霍尔器件是一种磁传感器,用它可以检测磁场及其变化,可在各种与磁场有关的场合中使用。
霍尔器件以霍尔效应为其工作基础,它具有许多优点,它的结构牢固,体积小,重量轻,寿命长,安装方便,功耗小,频率高,耐震动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。
里程测量是通过将霍尔传感器安装在车轮旁边的铁板上,将磁铁安装在车轮上,旋转的车轮将磁铁对传感器时,霍尔传感器会输出一个脉冲信号,经过处理送到单片机,经过单片机的计算处理,将行驶的里程送到显示单元并显示出来。
其原理示意图如3-2:
图3-2传感器测距示意图
霍尔传感器有3个外接口,2个是电源的正负极接口,最后一个是脉冲信号输出口,只要将霍尔传感器的信号输出端接到单片机的端口上便可以实现距离检测。
工作原理如图3-3.
其中,单片机的P3.2(INT0)引脚作为信号的输入端,采用外部中断0进行计数。
车轮每转一圈,霍尔传感器就产生一个脉冲信号,根据霍尔效应原理,当霍尔片处在磁场中时,霍尔传感器的输出端输出低电平。
当车轮转动一圈时小磁铁提供一个磁场,则霍尔传感器输出一次低电平完成一次数据采集,从而产生信号。
霍尔传感器检测并输出信号到单片机的INT0口,引起单片机的中断,对脉冲计数,当计数达到特定的次数时,里程就会增加,单片机对里程进行计算后,通过接口电路将计算好的结果传送到数码管并显示出来。
图3-3霍尔元件工作原理
3.3按键单元
本设计的按键单元电路有6个按键,功能分别是:
S1是开始键,按下时开始计时和计费;S2是结算键;S3是查询键,按下时可以查询历史记录;S4是清零键,用于清楚上次记录;S5是扩展键,用于在需要时实现新功能;S6是复位键。
如图3-4所示。
图3-4按键单元电路
3.4显示单元
本设计显示单元包括两部分:
数码管显示(图3-5)和二极管指示显示(图3-6)。
数码管显示部分使用两个四位一体的LED数码管,LED是发光二极管的简称,是一种将电能转换成光能的设备。
LED显示器是由发光二极管排列组成的显示器件。
它采用低电压扫描驱动,具有:
耗电少、使用寿命长、成本低、故障少、视角大、可视距离远等特点。
此外,它的响应时间短(一般不超过0.1us),亮度也比较高。
它的缺点是工作电流比较大,每一段的工作电流在10mA左右。
其中每位数码管是由8个发光二极管演变而来,其中7个发光二极管构成7笔字形,另一个构成小数点,称为8段LED。
8段LED数码管是利用7个LED(发光二极管)外加一个小数点的LED组合而成的显示设备,可以显示0~9等10个数字和小数点,使用非常广泛,它的外观如图3-7所示:
图3-78段数码管
这类数码管可以分为共阳极(8个发光二极管的阳极接在—起)与共阴极(8个发光二极管阴极连在一起)两种,共阳极就是把所有LED的阳极连接到共同接点,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如图3-8所示。
图3-8共阳和共阴数码管结构
通过控制这个公共端,可使该位亮或暗。
如共阴极端接地或共阳极接高电平,则该位显示器有效,反之无效。
本设计采用共阳LED数码管。
数码管有静态显示和动态显示两种,这里采用动态显示。
它具有低功耗、接口少等特点。
如图3-5两个四位一体数码管接P0口作为段选,接P2口作为位选。
开始计价时前四位显示路程,后四位显示价钱。
图3-5数码管显示部分
二极管指示部分包括开始打表指示灯、显示统计数据指示灯、堵车等待指示灯等如图3-6。
这些指示灯能对出租车的每一种状态进行指示,开始打表时D1亮,结算当前费用时D2亮,堵车等待时D3亮,清零当前值时D4亮。
图3-6二极管指示部分
实物图如3.7.
图3-7实物图
四.Proteus软件仿真
本设计需要用KeiluVision4对C52程序进行编译,生成“.hex”文件,如图4-1.
图4-1KeiluVision4编译
在Proteus软件中画出仿真电路(如图4-2),把KeiluVision4编译后生成的“.hex”导入到单片机中,按“运行仿真”键进行仿真。
图4-2Proteus仿真
五.程序
源程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
/****description:
*********************************/
/***********本区定义了程序各部分涉及的单价**********/
#defineQBJ5/*起步价;修改“5”,即可改变程序中打表起步价.*/
#defineDJ10/*每公里价钱;修改十位上“1”,即可改变每公里单价.例“10代表1公里1元,20代表1公里2元”***/
#defineDC_SD2;/*堵车时默认速度;修改“2”,即可改变默认速度**/
/*表示每10秒增加“2”百米
/*(默认速度公式:
DC_SD=V/3600V单位为km/h)*/
/*注:
暂不支持小数,仅支持整数。
*/
volatileunsignedintqianwei,baiwei,shiwei,gewei;//显示数据各个位置数字的临时变量
unsignedintcodeled_seg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表示0-9
volatileunsignedintdis,distance,A_distance,time,A_time,cost,A_cost;//定义路程、价钱、总路程,总时间,全局变量;
volatileunsignedinttemp_cost,temp_distance,temp_cost_1,temp_distance_1;//需要用来传递的临时全局变量
sbitkey1=P1^4;//开始打表
sbitkey2=P1^5;//停车,停止打表
sbitkey3=P3^3;//以按键模拟堵车
sbitkey4=P1^6;//查看合计打表里程及费用
sbitkey5=P1^7;//清除当前显示
sbitled1=P1^0;//指示key1
sbitled2=P1^1;//指示key2
sbitled3=P1^2;//指示key3
sbitled4=P1^3;//指示key4
bitSTAR_flag;//标志位对应key1
bitSTOP_FLAG;//标志位对应key2
bitDC_flag;//标志位对应key3
bitDATA_flag;//标志位对应key4
bitCLR_FLAG;//标志位对应key5
voidinitial_data(void)
{
STAR_flag=0;
DATA_flag=0;
DC_flag=0;
STOP_FLAG=0;
CLR_FLAG=0;
led1=0;
led2=0;
led3=0;
led4=0;
}
voidjuli()
{
dis=dis+1;//每转一周1M(暂定)
if(dis==5)//100M在数码管上显示(暂定)
{
distance=distance+1;
dis=0;
}
}
voidjisuan()
{
if(distance>=20)
cost=(distance-20)/DJ+QBJ;/*起步价;修改此处“5”,即可改变程序中打表起步价.每公里价钱;修改“10”,即可改变每公里单价.***/
else/*注:
“1”为每公里1¥*/
cost=QBJ;/*这里5,同上。
*/
}
voidfenli(uinttemp)
{
if(temp>9999)
temp=9999;
qianwei=temp/1000;
baiwei=(temp/100)%10;
shiwei=(temp%100)/10;
gewei=temp%10;
}
voiddiplay_delay()
{
uchari;
for(i=0;i<200;i++);
}
voidled_show_1()
{
if(qianwei==0)//判断高位是为0,若为0,则不显示。
{
if(baiwei==0)//判断高位是为0,若为0,则不显示。
{
if(shiwei==0)//判断高位是为0,若为0,则不显示。
{
P2=0xfe;//位选通
P0=led_seg_code[gewei];//段选通
diplay_delay();
}
else
{
P2=0xfe;
P0=led_seg_code[gewei];
diplay_delay();
P2=0xfd;
P0=led_seg_code[shiwei];
diplay_delay();
}
}
else
{
P2=0xfe;
P0=led_seg_code[gewei];
diplay_delay();
P2=0xfd;
P0=led_seg_code[shiwei];
diplay_delay();
P2=0xfb;
P0=led_seg_code[baiwei];
diplay_delay();
}
}
else
{
P2=0xfe;
P0=led_seg_code[gewei];
diplay_delay();
P2=0xfd;
P0=led_seg_code[shiwei];
diplay_delay();
P2=0xfb;
P0=led_seg_code[baiwei];
diplay_delay();
P2=0xf7;
P0=led_seg_code[qianwei];
diplay_delay();
}
}
voidled_show_2()
{
if(qianwei==0)//判断高位是为0,若为0,则不显示。
{
if(baiwei==0)//判断高位是为0,若为0,则不显示。
{
P2=0xef;//位选通
P0=led_seg_code[gewei];//段选通
diplay_delay();
P2=0xdf;
P0=led_seg_code[shiwei]&0x7f;//|0x08显示小数点。
diplay_delay();
}
else
{
P2=0xef;
P0=led_seg_code[gewei];
diplay_delay();
P2=0xdf;
P0=led_seg_code[shiwei]&0x7f;
diplay_delay();
P2=0xbf;
P0=led_seg_code[baiwei];
diplay_delay();
}
}
else
{
P2=0xef;
P0=led_seg_code[gewei];
diplay_delay();
P2=0xdf;
P0=led_seg_code[shiwei]&0x7f;
diplay_delay();
P2=0xbf;
P0=led_seg_code[baiwei];
diplay_delay();
P2=0x7f;
P0=led_seg_code[qianwei];
diplay_delay();
}
}
voiddelay(uintx)
{
inti,j;
for(i=x;i>0;i--)
for(j=340;j>0;j--);
}
voidkeyscan()
{
if(key1==0)
{
delay(5);//按键消抖
if(key1==0)//按键消抖
{EA=1;//KEY1按下,打开总中断根据main()可知,打开INT0中断,即开始采集轮子脉冲,记录距离
STAR_flag=1;//翻转KEY1标志位
STOP_FLAG=0;DATA_flag=0;CLR_FLAG=0;//翻转其他按键标志位,达到互锁功能
while(key1==0);//松键等待
}
}
if(key2==0)
{
delay(5);//按键消抖
if(key2==0)//按键消抖
{
EA=0;//KEY2按下,打开总中断根据main()可知,关闭各个中断,即停止采集轮子脉冲,记录距离(包括堵车检测)
STOP_FLAG=1;//翻转KEY2标志位
STAR_flag=0;DATA_flag=0;CLR_FLAG=0;//翻转其他按键标志位,达到互锁功能
while(key2==0);//松键等待
}
}
if(key5==0)
{
delay(5);//按键消抖
if(key5==0)//按键消抖
{
CLR_FLAG=1;//翻转KEY5标志位
STOP_FLAG=0;STAR_flag=0;DATA_flag=0;//翻转其他按键标志位,达到互锁功能
while(key5==0);//松键等待
}
}
if(key4==0)
{
delay(5);//按键消抖
if(key4==0)//按键消抖
{
DATA_flag=1;//翻转KEY4标志位
STOP_FLAG=0;STAR_flag=0;CLR_FLAG=0;//翻转其他按键标志位,达到互锁功能
while(key4==0);//松键等待
}
}
//指示等扫描
led1=STAR_flag;//指示,是否有乘客乘车;
led2=DATA_flag;//切换指示,显示总《路程.时间》
led3=DC_flag;//指示是否堵车;
diplay_delay();
}
voidinitial_time()
{
TMOD=0X01;
TH0=(65536-7800)/256;//10ms
TL0=(65536-7800)%256;
IT0=1;
EX0=1;
ET0=1;
EA=0;
}
voidzd()interrupt0//外部中断0
{
juli();
if(distance==9999)
distance=9999;
}
voidtime0()interrupt1//定时0
{
uinttemp_t;
TH0=(65536-7800)/256;//10ms此处延迟10MS,由于代码长度和全局不稳定变量未优化导致,一定误差。
TL0=(65536-7800)%256;//故,经计算,10MS的初值未7800左右。
temp_t++;
if(temp_t==1000)//1秒改变一次distance(0.Xkm)
{
temp_t=0;
distance=distance+DC_SD;
if(distance==9999)
distance=9999;
}
}
voidmain(void)
{
ucharkkk=1;//局部标志位变量,判断key1和key2的开关关系,使显示稳定状态。
bitmmm=0;//局部标志位变量,标志堵车按键状态,改变定时器与外部中断开关顺序。
initial_data();//初始化数据
initial_time();//初始化定时器
while
(1)
{
keyscan();
if(STAR_flag==1)//判断key1标志位
{
if(key3==0)//模拟堵车
{
delay(5);
if(key3==0)//消除抖动
{
TR0=1;EX0=0;
DC_flag=1;
/*mmm=!
mmm;
if(mmm==1)//第一次按下key3(进入堵车状态)
{
TR0=1;EX0=0;//开TO关INT0
DC_flag=!
DC_flag;//翻转堵车标志位
}
if(mmm==0)//第二次按下key3(退出堵车状态,进入打表计时状态)
{
TR0=0;EX0=1;//开INT0关T0
DC_flag=!
DC_flag;//翻转堵车标志位
}*/
}
}
else
{
TR0=0;EX0=1;
DC_flag=0;
}
kkk=1;//将打表开始局部标志位置1,
EA=1;//开总中断(打开int0)
jisuan();//计算费用
fenli(cost);//分离费用各个位,(分为“个”“十”“百”“千”)
led_show_1();//将费用显示在四位数码管组1上
fenli(distance);//分离里程各个位,(分为“个”“十”“百”“千”)
led_show_2();//将里程显示在四位数码管组2上
temp_cost=cost;//将本次费用暂存于传递变量temp_cost中。
temp_distance=distance;//将本次里程暂存于传递变量temp_distance中。
}
if(STOP_FLAG==1)//判断key2标志位
{
EA=0;//关闭中断(关int0,ET0)
TR0=0;
cost=0;distance=0;//清除上次费用,里程
fenli(temp_cost);//分离传递变量temp_cost,即上次费用。
led_show_1();//将上次费用显示在四位数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 出租车 计价器 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)