基于51单片机的出租车计价器proteus仿真原理图PCB

news2025/7/12 11:22:51

功能:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶显示有四个状态
a) 时间显示
b) 时间设置
c) 计价器显示
d) 计价器设置
2.按键切换四个不同显示状态
3.默认为时间显示状态,长按’切换‘键切换至计价器模式
4.在时间显示状态下按‘设置’键可设置时间
5.在计价器显示状态下按’设置‘键可进入收费标准设置
6.设定值支持掉电保护
7.上电过程中按下“设置”键可重置参数
8.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

//头函数声明
#include <reg52.h>
#include "lcd.h"
#include "date.h"
#include "ds1302.h"
#include "at24c02.h"

#define DISP_TIME 0
#define DISP_PRICE 1
#define DISP_AJUST_PRICE 2

//键盘定义
sbit KEY_MODE = P3^5; //模式切换
sbit KEY_SUB  = P3^6;	//减按键
sbit KEY_ADD  = P3^4;	//加按键
sbit KEY_SET  = P3^3;	//万年历模式时:设置时间信息。计价器模式时:设置单价

unsigned char mode = DISP_TIME;
//时钟屏幕调整
unsigned char setTimeLocation = 0;  //设定时间位置
unsigned char setFlag = 0; //设置标志
//价格调整
unsigned char setPriceLocation = 0; //设定价格位置

//计价器参数
unsigned int dayFlagfallPrice = 2; //白天起步价
unsigned int nightFlagfallPrice = 10; //夜晚起步价
unsigned int distUnitPrice = 3; //公里价格
unsigned int timeUnitPrice = 1; //时间价格
unsigned int totalPrice = 0; //总价
unsigned long dist = 0; //单位:0.01公里
unsigned long distkm = 0; //单位:公里
long timeOneSecond = 0;	//单位:秒
long timeOneMinute = 0;	//单位:分
unsigned int exintCnt = 0; //计数
unsigned char time50ms = 0; //50ms计数
unsigned int g_cnt = 0; //计数
bit isNightFlag = 0; //是否为夜晚
bit isTimeFlag = 1; //时间显示标志
bit isStartFlag = 0; //启动标志

//初始化定时器0
void InitTimer0();
//初始化定时器1
void InitTimer1();
//写初值到EEPROM
void Sets();
//从EEPROM读初值
void Reads();
//按键扫描
void KeyScan();
//价钱计算
void PriceCalc();
//初始化参数
void InitParam();

//主函数
void main()
{
	//初始化
	DS1302_Init();
	InitEEPROM();
	//Sets();
	//定时器初始化
	InitTimer0();
	InitTimer1();

	if (KEY_SET == 0) //初始化参数
	{
		DelayMs(20);
		if (KEY_SET == 0)
		{
			Sets();
			DS1302_Write_Time();
		}
		while(KEY_SET == 0);
	}
	else
	{
		Reads(); //读取初始参数
	}

	Init_LCD();

	IT0 = 1; //INT0负跳变触发
	EX0 = 0; //关闭外部中断
	EA = 1; //打开总中断
	//循环
	while(1)
	{
		//时钟模式
		if (mode == DISP_TIME)
		{
			TR1 = 0;
			//读时间
			if (setTimeLocation == 0)
			{
				//显示时间
				DS1302_Read_Time();
				Display_NYR(timeBufDec, setTimeLocation, 0);
			}
		}
		else if (mode == DISP_PRICE)
		{
			TR1 = 1;
			if (isStartFlag == 1)
			{
				TR0 = 1;
				EX0 = 1;
			}
			else
			{
				TR0 = 0;
				EX0 = 0;
			}

			if (timeBufDec[4] >= 23 || timeBufDec[4] < 7) //夜晚时间:23:00~7:00
			{
				isNightFlag = 1; //夜晚
			}
			else
			{
				isNightFlag = 0;	
			}

			if (g_cnt % 10 == 0) //500ms更新一次数据
			{
				PriceCalc();
				Display_S(distUnitPrice, timeUnitPrice, totalPrice, dist / 10, timeOneSecond, isTimeFlag); //显示计价器信息
			}
			
		}
		KeyScan();
	}
}

//按键扫描处理
void KeyScan()
{
	unsigned int keyCnt = 0;

	if (KEY_SET == 0) //设置键按下
	{
		DelayMs(100);
		//调时
		if (KEY_SET == 0)
		{
			if (mode == DISP_TIME)
			{
				setTimeLocation++;
				if (setTimeLocation == 1)
				{
					setFlag = 1;
				}
				// 闪烁
				Display_NYR(timeBufDec, setTimeLocation, setFlag);
				if (setTimeLocation == 7)
				{
					setTimeLocation = 0;
					// 保存时间
					DS1302_Write_Time();
					Init_LCD();
				}
			}

			else if (mode == DISP_PRICE)
			{
				setPriceLocation++;
				if (setPriceLocation == 1)
				{
					mode = DISP_AJUST_PRICE;
					// 显示计价器价格
					Init_LCD_JGTZ();
					Display_D(dayFlagfallPrice, nightFlagfallPrice, distUnitPrice, setPriceLocation, timeUnitPrice);
				}
			}
			// 调价格
			else if (mode == DISP_AJUST_PRICE)
			{
				setPriceLocation++;
				Display_D(dayFlagfallPrice, nightFlagfallPrice, distUnitPrice, setPriceLocation, timeUnitPrice);
				if (setPriceLocation == 5)
				{
					mode = DISP_PRICE;
					isStartFlag = 0;
					InitParam();
					setPriceLocation = 0;
					// 参数初始化
					Sets();			// 保存
					Reads();		// 读初值
					TH0 = 0x4C;		//(65536 - 46080) / 256; //50ms
					TL0 = 0x00;		//(65536 - 46080) % 256; //50ms
					Init_LCD_JJQ(); // 显示计价器
				}
			}
		}
		while (KEY_SET == 0);
	}

	if (KEY_ADD == 0) //加键按下
	{
		DelayMs(180);
		//调时
		if (mode == DISP_TIME)
		{
			//年
			if (setTimeLocation == 1)
			{
				timeBufDec[1]++;
				if (timeBufDec[1] >= 100)
					timeBufDec[1] = 0;
			}
			//月
			else if (setTimeLocation == 2)
			{
				timeBufDec[2]++;
				if (timeBufDec[2] >= 13)
					timeBufDec[2] = 1;
			}
			//日
			else if (setTimeLocation == 3)
			{
				timeBufDec[3]++;
				if (timeBufDec[3] >= YDay(timeBufDec[1], timeBufDec[2]) + 1)
					timeBufDec[3] = 1;
			}
			//时
			else if (setTimeLocation == 4)
			{
				timeBufDec[4]++;
				if (timeBufDec[4] >= 24)
					timeBufDec[4] = 0;
			}
			//分
			else if (setTimeLocation == 5)
			{
				timeBufDec[5]++;
				if (timeBufDec[5] >= 60)
					timeBufDec[5] = 0;
			}
			//秒
			else if (setTimeLocation == 6)
			{
				timeBufDec[6]++;
				if (timeBufDec[6] >= 60)
					timeBufDec[6] = 0;
			}
			//显示
			if (setTimeLocation != 0)
				Display_NYR(timeBufDec, setTimeLocation, setFlag);
		}
		//调价
		else if (mode == DISP_AJUST_PRICE)
		{
			//单价
			if (setPriceLocation == 1)
			{
				distUnitPrice++;
				if (distUnitPrice > 999)
				{
					distUnitPrice = 1;
				}
			}
			//等待时间单价
			else if (setPriceLocation == 2)
			{
				timeUnitPrice++;
				if (timeUnitPrice > 999)
				{
					timeUnitPrice = 1;
				}
			}
			//夜间
			else if (setPriceLocation == 3)
			{
				nightFlagfallPrice++;
				if (nightFlagfallPrice > 999)
				{
					nightFlagfallPrice = 1;
				}
			}
			//白天
			else if (setPriceLocation == 4)
			{
				dayFlagfallPrice++;
				if (dayFlagfallPrice > 999)
				{
					dayFlagfallPrice = 1;
				}
			}
			Display_D(dayFlagfallPrice, nightFlagfallPrice, distUnitPrice, setPriceLocation, timeUnitPrice);
		}
		else if (mode == DISP_PRICE)
		{
			if (isStartFlag == 0)
			{
				InitParam();
			}
		}
		// while (KEY_ADD == 0);
	}


	if (KEY_SUB == 0) //减键按下
	{
		DelayMs(180);
		//调时
		if (mode == DISP_TIME)
		{
			//年
			if (setTimeLocation == 1)
			{
				if (timeBufDec[1] == 0)
					timeBufDec[1] = 100;
				timeBufDec[1]--;
			}
			//月
			else if (setTimeLocation == 2)
			{
				timeBufDec[2]--;
				if (timeBufDec[2] <= 0)
					timeBufDec[2] = 12;
			}
			//日
			else if (setTimeLocation == 3)
			{
				timeBufDec[3]--;
				if (timeBufDec[3] <= 0)
					timeBufDec[3] = YDay(timeBufDec[1], timeBufDec[2]);
			}
			//时
			else if (setTimeLocation == 4)
			{
				if (timeBufDec[4] == 0)
					timeBufDec[4] = 24;
				timeBufDec[4]--;
			}
			//分
			else if (setTimeLocation == 5)
			{
				if (timeBufDec[5] == 0)
					timeBufDec[5] = 60;
				timeBufDec[5]--;
			}
			//秒
			else if (setTimeLocation == 6)
			{
				if (timeBufDec[6] == 0)
					timeBufDec[6] = 60;
				timeBufDec[6]--;
			}
			//显示
			if (setTimeLocation != 0)
				Display_NYR(timeBufDec, setTimeLocation, setFlag);
		}
		//调价
		else if (mode == DISP_AJUST_PRICE)
		{
			//单价
			if (setPriceLocation == 1)
			{
				distUnitPrice--;
				if (distUnitPrice == 0)
				{
					distUnitPrice = 999;
				}
			}
			//等待时间单价
			else if (setPriceLocation == 2)
			{
				timeUnitPrice--;
				if (timeUnitPrice == 0)
				{
					timeUnitPrice = 999;
				}
			}
			//夜间
			else if (setPriceLocation == 3)
			{
				nightFlagfallPrice--;
				if (nightFlagfallPrice == 0)
				{
					nightFlagfallPrice = 999;
				}
			}
			//白天
			else if (setPriceLocation == 4)
			{
				dayFlagfallPrice--;
				if (dayFlagfallPrice == 0)
				{
					dayFlagfallPrice = 999;
				}
			}
			Display_D(dayFlagfallPrice, nightFlagfallPrice, distUnitPrice, setPriceLocation, timeUnitPrice);
		}
		else if (mode == DISP_PRICE)
		{
			if (isStartFlag == 0)
			{
				InitParam();
			}
		}
		// while (KEY_SUB == 0);
	}

仿真演示视频:
https://www.bilibili.com/video/BV1FP411c7oA/

实物演示视频:
https://www.bilibili.com/video/BV13G411w7LK/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++类的运算符重载.md

11.8 类的运算符重载 运算符重载是一种形式的C多态 运算符重载将充值该的概念扩展到运算符上&#xff0c;允许赋予C运算符多种含义。 C允许将运算符重载扩展到用户定义类型&#xff0c;例如&#xff0c;允许使用将两个对象相加。 11.8.1 操作符重载定义 要重载运算符&#xff0…

FutureTask-详解(二)-ThreadPollExecutor-并发编程(Java)

文章目录1 FutureTask1.1 简介1.2 成员变量1.3 构造方法1.4 主要执行流程分析1.4.1 run任务执行1.4.1.1 run方法1.4.1.2 set(result)方法1.4.1.3 setException(ex)方法1.4.1.4 finishCompletion()方法1.4.2 get() 执行流程1.4.2.1 get()方法1.4.2.2 awaitDone()方法1.4.2.3 rem…

C++获取计算机硬件信息(Linux)

C获取计算机硬件信息&#xff08;Windows&#xff09; https://blog.csdn.net/hhy321/article/details/121258036 C获取计算机硬件信息&#xff08;Linux&#xff09; https://blog.csdn.net/hhy321/article/details/127930470 “春赏百花秋望月&#xff0c;夏有凉风冬观雪。若…

InnoDB之Undo log写入和恢复

1. 前言 为了实现事务的回滚和MVCC&#xff0c;InnoDB设计了Undo log模块&#xff0c;简单来说就是在修改记录前先记下日志&#xff0c;以便之后能将记录恢复成修改前的样子。针对insert、delete、update这三种不同的操作&#xff0c;InnoDB设计了不同类型的undo log&#xff…

Redis 常见问题

一、 什么是Redis&#xff1f; Redis 是一个使用 C 语言写成的&#xff0c;开源的高性能key-value非关系缓存数据库&#xff1b;Redis的数据都基于缓存的&#xff0c;所以很快&#xff0c;每秒可以处理超过 10万次读写操作&#xff1b;Redis也可以实现数据写入磁盘中&#xff…

Spring源码里开天辟地的五个Bean,再介绍一个学习方法

准备工作 首先咱们还是来写一个最简单的例子&#xff1a; 用的还是 https://github.com/xiexiaojing/yuna 里的代码&#xff0c;只是标签和引用都换成了Spring原生的。 配置类就是配置了扫描路径&#xff1a; 在可以被扫描的包路径下定义了一个Bean对象。用了Component注解这…

Java#16(包装类和集合练习)

目录 基本数据类型对应的包装类: 一.添加学生对象并遍历 二.添加用户对象并判断是否存在 三.添加手机对象并返回要求的数据 基本数据类型对应的包装类: byte------>Byte short------->Short char------->Character int------->Integer long------->Long flo…

MRT(MODIS Reprojection Tool) 下载及安装教程

大家下载MODIS数据的时候&#xff0c;大多是hdf的格式数据。HDF数据包括11个波段的数据&#xff08;如下图&#xff09;&#xff0c;假如想要其中一个波段数据&#xff0c;我们需要批量提取&#xff0c;这时就要用到NASA提供的MODIS Reprojection Tool&#xff0c;此工具虽不能…

c++ 指针,new运算符

1、指针相关基础知识&#xff1a; 1.1、指针一般指向变量的地址&#xff0c;等同于变量名前加&&#xff0c;如下&#xff1a; int a 3; int* p; p &a; 1.2、 * 符号被称为间接值运算符或解除引用运算符&#xff0c;将其运用于指针&#xff0c;可以获取指针指向的值…

【Java八股文总结】之IO流

文章目录Java IO流一、IO基础知识1、字节流2、字符流3、字节缓冲流4、打印流5、随机访问流6、字节流和字符流的区别&#xff1f;二、IO设计模式1、装饰器模式2、适配器模式Q&#xff1a;适配器模式和装饰器模式的区别&#xff1f;3、工厂模式4、观察者模式三、IO模型详解&#…

柯桥留学日语培训机构有吗日本人平时都喝什么酒?

日本葡萄酒侍酒大师高野丰先生&#xff0c;带来一瓶在北海道发现的陈年白兰地。 那是2014年的事&#xff0c;高野先生去北海道十胜地区的一家葡萄酒厂考察&#xff0c;在一个多年未开启的葡萄酒储存库的角落里&#xff0c;发现了一只陈旧的酒桶&#xff0c;他很好奇地问酒厂的…

Javaweb filter过滤器 跟 listener监听器

Filter 权限控制&#xff1a;登录才能进数据库等 统一编码&#xff1a;统一各种编码 Filter快速入门 放行前&#xff0c;我们对request里的数据进行处理 处理完&#xff0c;然后放行&#xff0c;携带到对应的资源里去 放行后&#xff0c;对response的数据进行处理 //将re…

C/C++问题:一个指针的大小是多少?怎么理解指针变量的存在

目录 举例 一、 int a; int (*(*v)[])(); 二、 int func(); int (*func)(); 三、 const; int const a; const int a; int const*r; int *const r; 四、一个指针的大小是多少&#xff1f;&#xff08;补充&#xff09; 举例 一、 int a; 可以看到上面声明了一个变…

【MySQL基础】SQL语言的概述、组成及特点

目录 一、SQL的概述 二、SQL语言的组成 三、SQL语言的特点 语法特点&#xff1a; &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、SQL的概述 SQL全称&#xff1a; Structured Query Language&#xff0c;是结构化查询语言&am…

数据结构先序序列创建二叉树

2022.11.19连发两回。 先序序列创建二叉树任务描述相关知识编程要求测试说明C/C代码任务描述 本关任务&#xff1a;利用先序遍历创建二叉树&#xff0c;并给出相应二叉树的中序遍历结果。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.二叉树的前序遍历&a…

win11系统下,迅雷启动后闪退的问题

win11系统&#xff0c;迅雷最新版本。 之前用迅雷一直好好的&#xff0c;某天要下东西突然发现点击就闪退&#xff0c;进程管理器里一点痕迹都没有。 启动就闪退&#xff0c;没有一点点痕迹。 因为之前是win10系统&#xff0c;一直用的好好的&#xff0c;考虑是不是win11系统…

创建自己数据集全套流程

目录 1、准备自己具有的数据集 2、标注数据----json格式 3、标注数据转为分割图----voc格式 4、增广数据集 5、分训练集以及验证集 1、准备自己具有的数据集 注意&#xff1a;数据集必须是统一的后缀格式&#xff0c;jpg或者png 2、标注数据----json格式 采用labelme标注…

前后端分离项目(vue+springboot)集成pageoffice实现在线编辑office文件

前后端分离项目下使用PageOffice原理图 集成步骤 前端 vue 项目 在您Vue项目的根目录下index.html中引用后端项目根目录下pageoffice.js文件。例如&#xff1a; <script type"text/javascript" src"http://localhost:8081/samples-springboot-back/pageof…

gom传奇引擎无限蜂功能插件安装图文教程

无限蜂功能插件安装教程 1. 百度搜索无限蜂官网,下载功能插件程序&#xff0c;请下载最新版&#xff01;2. 下载无限蜂功能插件&#xff0c;到桌面&#xff0c;并进行解压&#xff0c;如下图所示。 3. 打开无限蜂功能插件控制台(?.?.?)&#xff0c;进行账号注册。 4. 注册成…

InnoDB之Undo log格式

1. 前言 InnoDB有两大日志模块&#xff0c;分别是redo log和undo log。为了避免磁盘随机写&#xff0c;InnoDB设计了redo log&#xff0c;数据写入时只写缓冲页和redo log&#xff0c;脏页由后台线程异步刷盘&#xff0c;哪怕系统崩溃也能根据redo log恢复数据。但是我们漏了一…