设计出租车计费器系统由计费电路、时钟电路、按键电路以及LCD显示电路组成。本设计的主要任务:
1. 实现计费功能,计费标准为:按行驶里程计费,起步价为10.00元,并在车行3km后按2/km计费,如果在路上遭遇堵车,那么每5分钟加收2元,当行驶路程超过15公里后,那么超出部分按每公里3元收取费用时,每车次的燃油附加费为2元;
2. 现场模拟功能:能模拟汽车起动、停止、以及不同速度等状态;
3. 设计显示电路,将总车费和行驶路程显示出来;
使用时钟芯片,将当前的时间在LCD屏上显示出来,并能通过按键调节时间。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1VVu1rdD9EVAD2sNsLa1W1g?pwd=8888
部分代码展示
/*-----------------------------------------------
出租车计价系统设计
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <stdio.h>
#include "ds1302.h"
#include "delay.h"
#include "1602.h"
#define KeyPort P3 //定义按键
bit ReadTimeFlag;//定义读时间标志
bit flag;
sbit KEY1=P3^7; //定义按键输入端口
sbit KEY2=P3^6;
sbit KEY3=P3^5;
sbit stop=P2^1;
sbit begin=P2^0;
unsigned char con1=0x00,con2=0x00; //定义时间上限值和下限值
unsigned char num,q,con,biao; //定义按键,时间选择位
unsigned char idata time[16]; //定义显示区域时间临时存储数组
unsigned char idata time1[17]; //定义显示区域时间临时存储数组
unsigned char price,waitmin,waittime,kilo;
unsigned int Hall_counter;
unsigned char time_buf1[8]; //空年月日时分秒周
unsigned char time_buf[8]; //空年月日时分秒周
void Init_Timer0(void);//定时器初始化
unsigned char KeyScan(void);//键盘扫描
void time_change(void);//调节时间
void texi(void); //计费及显示
void check(void); //启动与停止操作
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
EA=1; //全局中断开
IT0=1; //边沿触发
LCD_Init(); //初始化液晶
DelayMs(5); //延时有助于稳定
LCD_Clear(); //清屏
Init_Timer0(); //定时器0初始化
Ds1302_Init(); //ds1302初始化
while(1) //主循环
{
num=KeyScan(); //判定按键值
time_change(); //时间调整与显示
texi(); //计费及显示
check(); //启动与停止操作
}
}
/*------------------------------------------------
定时器0初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0x00; //给定初值
TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器0中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num1,num2;
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
num1++;
if(num1==200) //大致400ms
{
num1=0;
ReadTimeFlag=1; //读标志位置1
}
if(biao==1)
{
num2++;
if(num2==500) //大致1s
{
num2=0;
if(flag==1) waittime=0; //如果标志位为1,则证明汽车在行驶中
if(flag==0) //如果标志位为0,则证明汽车在等待中
waittime++;
if(waittime==5) //每五秒等待时间加1,此处用5秒代替现实的5分钟
{
waittime=0;
waitmin++;
}
flag=0; //读标志位置1
}
}
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/