数电出租车计价器课程设计
① 数字逻辑课程设计出租车计价器
74161+74248+7404+7400+LED数码管+光电计数器
流程就是光电计数器---74161
② 出租车计价器设计
电子技术课程设计
出租车自动计费器
学院:华科学院
专业:电气工程及其自动化
班级:
姓名:
学号:
指导老师:
2008年1月2日
目 录
一、设计任务与要求-------------- 1
二、总体框图----------------- 1
三、器材选择---------------- 1
四、模块功能----------------- 5
五、总体设计电路图-------------- 9
六、心得体会-----------------------10
出租车计费器
一. 设计任务与要求
出租车自动计费器根据客户用车的实际情况而自动显示用车费的数字仪表,根据用车起价,行车里程计费及等候时间计费三项求出客户用车的总费用,通过数码自动显示。
1. 里程测量精确到1km。
2. 起步价按7元/3km,起步价外按1元/进行机费。
3. 等候按1元/60 min计费。
4. 具有里程显示,收费显示,里程单价显示。
二.总体框图
三.器件选择
A.十进制计数器74LS160
1.74LS160是中规模集成同步十进制加法计数器,具有异步清零和同步预置数的功能。使用74LS160通过置零法或置数法可以实现任意进制的计数器。其引脚图见图 。
先对74LS160的基本功能进行测试,逻辑功能表如下图。
①异步清零:当 CLR=0时,Q 0=Q1=Q2=Q3=0。
②同步预置:当 LOAD=0时,在时钟脉冲CP上升沿作用下,Q 0=D0,Q1=D1,Q2=D2,Q3=D3。
③锁存:当使能端 时,计数器禁止计数,为锁存状态。
④计数:当使能端EP=ET=1时,为计数状态。
功能管脚图
2. 74LS160的逻辑功能表
时钟CP 异步清除 同步置数 EP ET 工 作 状 态
× 0 × × ×
↑ 1 0 × ×
× 1 1 0 1
× 1 1 × 0
↑ 1 1 1 1
3.74LS160的逻辑图
B.555定时器
它含有两个电压比较器,一个基本RS触发器,一个放电开关T,比较器的参考电压由三只5KΩ的电阻器构成分压,它们分别使高电平比较器A1同相比较端和低电平比较器A2的反相输入端的参考电平为和。A1和A2的输出端控制RS触发器状态和放电管开关状态。当输入信号输入并超过时,触发器复位,555的输出端3脚输出低电平,同时放电,开关管导通;当输入信号自2脚输入并低于时,触发器置位,555的3脚输出高电平,同时放电,开关管截止。
功能管脚图
功能管脚图
逻辑图
功能表
74LS192
74LS192是十进制同步加法、减法器,采用8421BCD码编码,具有直接清零,异步置数的功能。
CPU CPD LD CR 操作
随意 随意 0 0 置数
脉冲 1 1 0 加数
1 脉冲 1 0 箭术
随意 随意
四.功能模块
1.里程计算与显示电路
里程计算模块对测距传感器发出的0.1km的脉冲信号进行计数,计满10个脉冲表示1km。里程计算与显示电路如下图。
如上图当所示,用三片74ls160接成三个十进制计数器,由信号发生器触发脉冲,每触发一个脉冲为出租车行进中的0.1km,第一块加法计数器累计十次脉冲,向第二快加法计数器输去一次脉冲,当第二块加法计数器累计到十次时,灯泡亮一次,表示出租车向前行进了1km.断开开关J1实现同步清零。
2.里程比较电路
基本里程设定为3km。当实际行驶距离超过基本里程时,则在原有计费的基础上加上每公里单价,里程比较电路如下图所示。
里程比较电路如上图所示,用两片74LS160接成30进制计数器,由信号发生器触发脉冲,每触发一个脉冲为出租车行进中的0.1km,当计满后触发触发器D使其输出(Q)为1,作为超基本里程计费的闸门信号,Q=1后启动超基本里程计费电路,由每公里的触发脉冲触发计费电路实现费用累加。一旦实际行驶里程超过了基本里程,Q非封锁30计数器,使里程比较电路停止计数,一直到总清零信号(总清信号清除模3计数和D触发器)后才开始新一轮的里程比较。
3.侯时电路
用555够成多谐振荡电路,然后用计数器按秒,分计时,1min给里程计数器一个0.1km的脉冲,侯时电路如下图所示
侯时电路如上图所示,当一分钟后触发一次脉冲,灯泡亮一次。
用555定时器构成秒脉冲发生器
电路如下图
五.总体设计电路图
侯时电路,里程比较电路,里程计算与显示电路,相互叠加,设置起步价7元
同过缓存器,锁存器的连接,信号的积累,显示总价。
六.心得体会
两周的课程设计时间很快就过去了,虽然它的时间很短,我们很匆忙,很辛苦,课
程设计真的很不容易,在这三周里,我一次次告诉自己要坚持,再坚持通过两周以来同学
和老师的共同努力,我们终于完成了电子课程。作完之后,我组的全体成员都大吸了一口
气,然后感叹道:终于做完了,可把我们可累苦了。但大家脸上的表情都是欣慰和欢喜的,
到底工夫不负有心人。俗话说的好:苦不苦想想红军长征二万五。当年红军爬雪山,越草
地,与自然做斗争,冰天雪地的。我们饿了还有香喷喷的饭菜吃,他们呢?吃草皮,啃树
皮,甚至连自己身上的皮带都煮着吃了,比起他们来我们幸福多了,看着自己的劳动成果:
面包板上大大小小的芯片,密密麻麻的连接线,大家都笑了,我们四目相接,面面相觑,
都在感慨实习终于结束了。不知道是因为心情好还是太累, 回去特舒服,特别的塌实 。
这次的课程设计使我认识到我在学习理论方面有很多的不足,通过向其他同学询问和学
习,才算基本上搞了出来。用555定时器产生秒脉冲,74LS160做10进制计数器,用不同
的器件组建不同的模块,从而达到最终的设计要求。
课程设计让我体会到知识上的收获重要,精神上的丰收更加可喜。让我知道了学无
止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山
峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程
设计必将成为我人生旅途上一个非常美好的回忆!
③ 出租车计价器的设计(用Multisim画的设计图)
本方案围绕项目招投标全过程的造价管理工作,为工程项目各个参与方在招标、投标、评标阶段提供专业、易用、高效的软件产品、专业咨询及服务,实现“计量、询价、计价、招/投标文件编制、自动评标和招投标信息发布、数据积累”等招标投标核心业务的一体化智能解决,建立起共享、协同、整合、高效的动态招投标业务系统,推动业务管理进步。
http://www.grandsoft.com.cn/channels/17.aspx
④ QUARTUS可编程逻辑器件课程设计:出租车计价器设计
纯数字设计指的大多是74系列那样的通用芯片,有点是组建方便,简单系统成本低,是可编程逻辑器件的基础,早期单板机就用这个,现在led光屏也有很多,缺点是复杂应用成本高,设计复杂,功耗大,部分效率较低。PLD成本高,但是功耗较低,另外较稳定易维护,方便量产。设计开发过程随着技术的进步也越来越简便快捷。单片机功耗低应用灵活,但是执行并行任务效率低。不过一般的应用对实时性要求不高,所以应用特别特别特别广泛…收发器,收音机,充电器,显示屏,无所不在,而且沾了单片机也能显得高端不少(其实不止是显得,因为软件部分很能显示出设计者的水平)个人见解,有不全面的楼下补充
⑤ 出租车计费器课程设计
................................
⑥ 出租车计价器的设计
http://www.bbww.net/SoftView/SoftView_11755.html
http://www.happycampus.com.cn/pages/2005/07/06/D174249.html
http://bbs.mcustudy.com/printpage.asp?BoardID=5&ID=2662
⑦ 课程设计出租车计价器,用VERILOG语言编写
我去年做过这个,和你的要求差不多,暂停键相当于你的停止计费键,停止键详单与你的归零键,换挡键你就不用管它(按一档的速度运行),晶振的能改成50M就行了,能调的通。
1.设计要求
设计一个出租车计费器,能按路程计费,具体要求如下
(1)实现计费功能,计费标准为:按行驶里程计费,起步价为6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止和暂停时不计费。
(2)现场模拟汽车的启动、停止、暂停、和换档等状态。
(3)设计数码管动态扫描电路,将车费和路程显示出来,各有两位小数。
2.设计原理
设该出租车有启动键、停止键、暂停键、和挡位键。启动键为脉冲触发信号,当其为一个脉冲时,表示汽车以启动,并根据车速的选择和基本车速发出响应频率的脉冲(计费脉冲)来实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;挡位键用来改变车速,不同的挡位对应着不同的车速,同时路程计数的速度也不同。
出租车计费器可分为两大模块:控制模块和译码显示模块,系统框图如图9-9-1所示。控制模块实现了计费和路程的计数,并且通过不同的挡位来控制车速 。译码显示模块实现十进制到4为十进制的转换以及车费和路程的显示 。
mole taxi(scan,seg7,dp,clk20mhz,clk,start,stop,pause,speep);
output[7:0] scan; //数码管地址选择信号
output[6:0] seg7; //7段显示控制信号(abcdefg)
output dp; //小数点
input clk20mhz; //系统时钟为20MHz
input clk; //计费时钟
input start; //汽车起动
input stop; //汽车停止
input pause; //汽车暂停
input[1:0] speep; //挡位(4个挡位)
reg[7:0] scan;
reg[6:0] seg7;
reg dp;
reg[15:0] money_reg; //车费寄存器
reg[15:0] distance_reg; //路程寄存器
reg[3:0] num; //控制车速的计数器
reg[15:0] dis; //千米计数器
reg d; //千米标志位
reg clk1khz; //1kHz的分频时钟,用于扫描数码管地址
reg[3:0] data;
reg[3:0] m_one,m_ten,m_hun,m_tho; //钱数的4位十进制表示
reg[3:0] d_one,d_ten,d_hun,d_tho; //路程的4位十进制表示
reg[15:0] count;
reg[15:0] comb1;
reg[3:0] comb1_a,comb1_b,comb1_c,comb1_d;
reg[15:0] comb2;
reg[3:0] comb2_a,comb2_b,comb2_c,comb2_d;
reg[2:0] cnt;
always @(posedge clk)
begin
if(stop) //汽车停止,计费和路程清零
begin money_reg<='d0;
distance_reg<='d0;
dis<='d0;
num<='d0;
end
else if(start) //汽车起动后,起步价为6元
begin money_reg<='d600;
distance_reg<='d0;
dis<='d0;
num<='d0;
end
else
begin
if(!start&&!speep&&!pause&&!stop) //1挡
begin
if(num=='d9)
begin num<='d0;
distance_reg<=distance_reg+1;
dis<=dis+1;
end
else
begin num<=num+1; end
end
else if(!start&&speep=='b01&&!pause&&!stop) //2挡
begin
if(num=='d9)
begin num<='d0;
distance_reg<=distance_reg+2;
dis<=dis+2;
end
else
begin num<=num+1; end
end
else if(!start&&speep=='b10&&!pause&&!stop) //3挡
begin
if(num=='d9)
begin num<='d0;
distance_reg<=distance_reg+5;
dis<=dis+5;
end
else
begin num<=num+1; end
end
else if(!start&&speep=='b11&&!pause&&!stop) //4挡
begin
distance_reg<=distance_reg+1;
dis<=dis+1;
end
end
if(dis>='d100)
begin d<='d1;dis<='d0; end
else
begin d<='d0; end
if(distance_reg>='d300) //如果超过3km则按1.2元/km计算
begin
if(money_reg<'d2000&&d=='d1)
begin money_reg<=money_reg+'d120; end
else if(money_reg>='d2000&&d=='d1)
begin money_reg<=money_reg+'d180; end
end
//-------------------当计费器达到20元时,每千米加收50%的车费-------------
end
//---------------------------1kHz的分频时钟,用于扫描数码管地址----------------------
always @(posedge clk20mhz)
begin
if(count=='d10000)
begin clk1khz<=~clk1khz;count<='d0; end
else
begin count<=count+1; end
//----------------------------将车费的十进制数转化为4位十进制数-----------------------
if(comb1<money_reg)
begin
if(comb1_a=='d9&&comb1_b=='d9&&comb1_c=='d9)
begin
comb1_a<='b0000;
comb1_b<='b0000;
comb1_c<='b0000;
comb1_d<=comb1_d+1;
comb1<=comb1+1;
end
else if(comb1_a=='d9&&comb1_b=='d9)
begin
comb1_a<='b0000;
comb1_b<='b0000;
comb1_c<=comb1_c+1;
comb1<=comb1+1;
end
else if(comb1_a=='d9)
begin
comb1_a<='b0000;
comb1_b<=comb1_b+1;
comb1<=comb1+1;
end
else
begin
comb1_a<=comb1_a+1;
comb1<=comb1+1;
end
end
else if(comb1==money_reg)
begin
m_one<=comb1_a;
m_ten<=comb1_b;
m_hun<=comb1_c;
m_tho<=comb1_d;
end
else if(comb1>money_reg)
begin
comb1_a<='b0000;
comb1_b<='b0000;
comb1_c<='b0000;
comb1_d<='b0000;
comb1<='d0;
end
//---------------------------将路程的十进制转化为4位十进制数-----------------------
if(comb2<distance_reg)
begin
if(comb2_a=='d9&&comb2_b=='d9&&comb2_c=='d9)
begin
comb2_a<='b0000;
comb2_b<='b0000;
comb2_c<='b0000;
comb2_d<=comb2_d+1;
comb2<=comb2+1;
end
else if(comb2_a=='d9&&comb2_b=='d9)
begin
comb2_a<='b0000;
comb2_b<='b0000;
comb2_c<=comb2_c+1;
comb2<=comb2+1;
end
else if(comb2_a=='d9)
begin
comb2_a<='b0000;
comb2_b<=comb2_b+1;
comb2<=comb2+1;
end
else
begin
comb2_a<=comb2_a+1;
comb2<=comb2+1;
end
end
else if(comb2==distance_reg)
begin
d_one<=comb2_a;
d_ten<=comb2_b;
d_hun<=comb2_c;
d_tho<=comb2_d;
end
else if(comb2>distance_reg)
begin
comb2_a<='b0000;
comb2_b<='b0000;
comb2_c<='b0000;
comb2_d<='b0000;
comb2<='d0;
end
end
//-----------------------------数码管动态扫描----------------------------------
always @(posedge clk1khz)
begin
cnt<=cnt+1;
end
always @(cnt)
begin
case(cnt)
'b000:begin data<=m_one;dp<='d0;scan<='b00000001; end
'b001:begin data<=m_ten;dp<='d0;scan<='b00000010; end
'b010:begin data<=m_hun;dp<='d1;scan<='b00000100; end
'b011:begin data<=m_tho;dp<='d0;scan<='b00001000; end
'b100:begin data<=d_one;dp<='d0;scan<='b00010000; end
'b101:begin data<=d_ten;dp<='d0;scan<='b00100000; end
'b110:begin data<=d_hun;dp<='d1;scan<='b01000000; end
'b111:begin data<=d_tho;dp<='d0;scan<='b10000000; end
default:begin data<='bx;dp<='bx;scan<='bx; end
endcase
end
//---------------------------------7段译码----------------------------------
always @(data)
begin
case(data[3:0])
4'b0000:seg7[6:0]=7'b1111110;
4'b0001:seg7[6:0]=7'b0110000;
4'b0010:seg7[6:0]=7'b1101101;
4'b0011:seg7[6:0]=7'b1111001;
4'b0100:seg7[6:0]=7'b0110011;
4'b0101:seg7[6:0]=7'b1011011;
4'b0110:seg7[6:0]=7'b1011111;
4'b0111:seg7[6:0]=7'b1110000;
4'b1000:seg7[6:0]=7'b1111111;
4'b1001:seg7[6:0]=7'b1111011;
default:seg7[6:0]=7'b0000000;
endcase
end
endmole
具体的反考周润景老师的那本书。
⑧ 求出租车计价器数字电路课程设计原理图!!(纯数字电路)
设计原理与实现方案论证1.里程计数及显示
在出租车转轴上加装传感器,以便获得“行驶里程信号”。
设汽车每走1Km发一个脉冲,里程的计数显示,可用十进制、译码显示。该模块涉及时序电路相关知识,如计数器(74ls60,74ls90等)、译码驱动器、显示器等中规模芯片相关知识。
侯时模块设计类似于里程计数模块,不同的是脉冲信号可由石英晶振经分频后获得。简易的也可用555定时器近似获得,涉及脉冲信号产生相关知识。但在这个实验中使用直接的脉冲信号。
2.加法器模块电路
该模块功能为计价,由两部分组成:
⑨ 出租车计价器程序设计与原理图
目录
前言
1、 系统工作原理
1.1 功能说明
1.2 基本原理
2、 硬件设计
2.1 单片机最小系统单元
2.2 A44E霍尔传感器检测单元
2.3 AT24C01存储单元
2.4 键盘调整单元
2.5 显示单元
3、 软件设计
3.1 系统主程序
3.2 中断程序
3.2.1 里程计数中断程序
3.2.2 中途等待中断程序
3.3 计算程序
3.4 显示程序
3.5 键盘程序
4、 总结
参考文献
附录A 系统原理图
附录B 系统源程序
前言
随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。
第一章 系统工作原理
1.1 功能说明
出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。同时,白天和夜晚价格不同,可以进行切换。白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)
1.2 基本原理
计数器系统主要由五部分组成:A44E霍尔传感器、AT89S52单片机、独立键盘、EEPROM AT24C01和显示数码管。
霍尔传感器安装在车轮上,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据从EEPROM中读取的价格等相关数据进行金额的计算,计算好的金额、里程和单价都实时地显示在数码管上。独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来,调节好的数据存储到EEPROM中,掉电后可以使调好的数据不丢失,下次得电后直接从EEPROM读到单片机,系统结构图如图1。
图1 系统结构图
第二章 硬件设计
2.1 单片机最小系统单元
主控机系统采用了Atmel 公司生产的 AT89S52单片机,它含有256 字节数据存储器,内置8K 的电可擦除FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是AT89S52 工作所需的最简外围电路。单片机最小系统电路图如图2所示。
图2 单片机最小系统图
AT89S52 的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。
2.2 A44E霍尔传感器检测单元
A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。
A44E 集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。
在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。A44E霍尔传感器原理如图3所示。
图3 A44E霍尔传感器原理
里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。其原理如图4所示。
图4 传感器测距示意图
本系统选择了将A44E的脉冲输出口接到P3.3口外部中断1作为信号的输入端(这样可以减少程序设计的麻烦),车轮每转一圈(设车轮的周长是1米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到1000次时,即1公里,单片机就控制将金额自动增加,如图5。
图5 A44E霍尔元件接线图
2.3 AT24C01存储单元
存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C01 是Ateml公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。
AT24C02芯片引脚配置如图6所示。
存储单元电路连接如图7所示。
图 7 存储单元电路原理图
图中R4、R5 是上拉电阻,其作用是减少AT24C01 的静态功耗。由于AT24C01的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(时钟脉冲)和SDA(数据/地址)与单片机P2.2和P2.3口连接,进行传送数据。
每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。
2.4 键盘调整单元
当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。电路原理如图8所示。
图8 键盘调整单元接线图
S1:接P1.0口,对上一次的计费进行清零,为下次载客准备
S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。
S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。
S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。
2.5 显示单元
显示单元由7个8段共阳数码管组成,采用动态扫描进行显示。前三个数码管分别接P3.0、P3.1和P3.2,用于显示总金额;中间两个分别接P3.4和P3.5,用于显示里程;后边两个分别接P3.6和P3.7,用于显示单价。电路如图9所示。
图9 数码管显示图
第三章 软件设计
3.1 系统主程序
在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。程序流程如图10所示。
图10 主程序流程图 图11 计算程序流程图
3.2 中断程序
3.2.1 里程计数中断程序
每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。
3.2.2 中途等待中断程序
在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。
3.3 计算程序
计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。程序流程图如图11所示。
3.4 显示程序
显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
3.5 键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。流程图如图12。
图12 键盘程序流程图
第四章 总结
经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。
通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
参考文献
[1] 马淑华,王凤文,张美金编著. 单片机原理与接口技术(第二版). 北京:北京邮电大学出版社,2007.
[2] 谭浩强著. C程序设计(第三版). 北京:清华大学出版社,2005.
附录A 系统原理图
附录B 系统源程序
算了图贴不上去 给你个网址吧http://blog.sina.com.cn/s/blog_609003ef0100dt1o.html
挺全的去看看