动力设备网 加入收藏  -  设为首页
您的位置:动力设备网 > 科技 > 正文
基于单片机的出租车计价器的课程设计怎么写?
基于单片机的出租车计价器的课程设计怎么写?
提示:

基于单片机的出租车计价器的课程设计怎么写?

这点功能说实在的51单片机就可以胜任了
1、现在常见的计价器一般都是根据车走了多远和运行时间计价的,那么你就要弄清楚这个规则,有了这个就知道怎么算价钱了啊。
2、行程一般用计轮胎圈数的方法咯,或者从汽车直接获知行程信息,我想对于一个课程设计来说,最好还是用一个开关来模拟计圈吧。
3、时间方面51自己不行了,用个时钟芯片吧。
4、逻辑框架是:51单片机的计数器来计圈,到达一定圈数(可以设定)产生中断,单片机更新显示里程和价格,其余时间基本上单片机就是扫描时钟芯片、刷新LCD显示和计算数据了。
5、其它功能:考虑到可能不只有一次乘车,可能需要累加多次乘车的总里程,统计乘车次数和总收入等,这些都简单。当然也可以多管闲事显示一下车辆速度。
6、按键需要开始和结束或者用一个按键的两种状态表示(出租车计价器通常是这样的,掰下来或者掰上去),一般需要一个reset键,这个隐蔽一点就行了。
7、显示方面根据你的设计选个能够显示足够信息的LCD就行了,如果抠一点直接用数码管显示钱数那就简单了。

课程设计出租车计价器,用VERILOG语言编写
提示:

课程设计出租车计价器,用VERILOG语言编写

我去年做过这个,和你的要求差不多,暂停键相当于你的停止计费键,停止键详单与你的归零键,换挡键你就不用管它(按一档的速度运行),晶振的能改成50M就行了,能调的通。

1.设计要求
设计一个出租车计费器,能按路程计费,具体要求如下
(1)实现计费功能,计费标准为:按行驶里程计费,起步价为6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止和暂停时不计费。
(2)现场模拟汽车的启动、停止、暂停、和换档等状态。
(3)设计数码管动态扫描电路,将车费和路程显示出来,各有两位小数。
2.设计原理
设该出租车有启动键、停止键、暂停键、和挡位键。启动键为脉冲触发信号,当其为一个脉冲时,表示汽车以启动,并根据车速的选择和基本车速发出响应频率的脉冲(计费脉冲)来实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;挡位键用来改变车速,不同的挡位对应着不同的车速,同时路程计数的速度也不同。
出租车计费器可分为两大模块:控制模块和译码显示模块,系统框图如图9-9-1所示。控制模块实现了计费和路程的计数,并且通过不同的挡位来控制车速 。译码显示模块实现十进制到4为十进制的转换以及车费和路程的显示 。



module taxi(scan,seg7,dp,clk20mhz,clk,start,stop,pause,speedup);
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] speedup; //挡位(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&&!speedup&&!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&&speedup=='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&&speedup=='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&&speedup=='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

endmodule



具体的反考周润景老师的那本书。