文章末尾-感谢打赏 |
基本功能要求
1、设计并制作出租车计价器。开机后,屏幕第一行显示“HFUT”,第二行显示“学号后六位”(如 123456),并自下而上滚动,3 秒后停止滚动。(15分)
2、使用 LCD1602 显示行驶里程(mile)和费用(cost)。上一行显示出租车行驶 里程数,里程范围为 0~999 千米(例:mile: 5km)。下一行显示应收取费用,费用金额范围为 0~9999 元(例:cost: 9yuan)。 (10分)
3、按键 S1 按下后,出租车起步,开始计费。按键 S1 再次按下时,本次服务结束,出租车计费结束。费用收取标准为:
计价包括起步价、行车里程计费两部分。
当里程 ≤ 3 km(公里)时,按起步价6元计费;
里程 > 3 km(公里)时,按 1.2元/km 计费。
里程计算方法:车轮周长为 1 米,车轮转一圈产生一个脉冲,即脉冲数达到 1000 时,行驶里程为 1km。采用单片机的定时器 2 产生 4kHz(周期 250μs)的方波脉冲信号,来代替实际的脉冲产生。(35分)
4、道路会出现堵车等情况,为了减轻出租车运营成本,出租车费用增加等待时间收费。按键 S2 按下后,代表出租车开始处于静止等待状态。按键 S2 再次按下时,出租车结束静止状态。显示出租车等待时间(例 delay:13min)。
费用收取标准为:
计价包括起步价、等待时间计费、行车里程计费三部分。
当里程 ≤ 3 km(公里)时,按起步价 6 元计算费用;
里程 > 3 km(公里)时,按 1.2 元 / km 计费。
等待累计时间 > 5 min(分钟)时,按 1.0 元 /5 min 计费。(实际设计时,用 1 秒 代替 5 分钟,以节省演示时间。) (25分)
5、按下按键 S3,采用分时计费模式。
费用收取标准位:计价包括起步价、等待时间计费、行车里程计费三部分。
时段 1(指 6 点之后到晚上 22 点之前)起步价为 6.0 元,
时段 2(晚上 22 点之后到第二天 6 点之前)起步价为 7.0 元。
按下按键 S4,用于切换时段 1 和 2,(7:00 和 23:00) (25分)
代码
主函数
#include <reg52.h>
#include "i2c.h"
#include "delay.h"
double jsq=0,jsq2;//怠速计时器
double jl;//距离
double jg;//价格
unsigned char pp;
#define AddWr 0x90
#define AddRd 0x91
#define uchar unsigned char
#define uint unsigned int
extern bit ack;
/*------------------------------------------------
LCD有三根线要改位置,避免和矩阵键盘冲突
------------------------------------------------*/
sbit rs1=P1^0;
sbit wr1=P1^1;
sbit lcden1=P1^2;
unsigned int js,qbjg;
unsigned int u = 128;
unsigned char disnum,disnum_p, temp, key, num;
unsigned char keyscan();
bit s1,s2,s3;//记录当前个开关(模式)的状态
unsigned int count = 0;
extern bit ack;
bit ReadADFlag;
unsigned char num;
unsigned int i, j;
/*------------------------------------------------
把数码管关了,不然闪烁,很烦
------------------------------------------------*/
sbit dula=P2^6;
sbit wela=P2^7;
unsigned int i,t,j;
void Init_Timer0(void)
{
TMOD |= 0x01;
//TH0=0x00;
//TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256; // 2ms
TL0=(65536-2000)%256;
}
/*------------------------------------------------
LCD模块
--------------------------------------*/
void delay(uint x)
{
uchar i,j;
for(i=x;i>0;i--)
{
for(j=120;j>0;j--);
}
}
void write_com(uchar com)//LCD显示位置
{
rs1=0;
wr1