【Proteus仿真】【51单片机】公交车报站系统

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用LCD12864显示模块、DS18B20温度传感器、DS1302时钟模块、按键、LED蜂鸣器、ULN2003、28BYJ48步进电机模块等。

主要功能:
系统运行后,LCD12864液晶显示检测温度、日期时间、站台信息和运行方向;可按下K3键进入设置模式,默认调节年份,可再次按下K3键选择年月日时分秒星期,选择后可按下K1和K2键调节,按下K4键可保存时间并返回主界面。当到站后可按下K1键报站,显示屏显示当前站和下一站信息,并且蜂鸣器发出提示音,步进电机正反转控制门开关。可按下K2键切换运行方向,系统默认为下行。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//系统数据显示
void sys_data_show(void)
{
	u8 buf[11];
	while(1)
	{
		//正常模式显示
		if(sys_ctrl.mode==0)
		{
			//日期显示
			buf[0]='2';
			buf[1]='0';
			buf[2]=gDS1302_TIME[6]/16+0x30;
			buf[3]=gDS1302_TIME[6]%16+0x30;
			buf[4]='-';
			buf[5]=gDS1302_TIME[4]/16+0x30;
			buf[6]=gDS1302_TIME[4]%16+0x30;
			buf[7]='-';
			buf[8]=gDS1302_TIME[3]/16+0x30;
			buf[9]=gDS1302_TIME[3]%16+0x30;
			buf[10]='\0';
			lcd12864_show_string(0,1,buf,0);
			//时间显示
			buf[0]=gDS1302_TIME[2]/16+0x30;
			buf[1]=gDS1302_TIME[2]%16+0x30;
			buf[2]=':';
			buf[3]=gDS1302_TIME[1]/16+0x30;
			buf[4]=gDS1302_TIME[1]%16+0x30;
			buf[5]=':';
			buf[6]=gDS1302_TIME[0]/16+0x30;
			buf[7]=gDS1302_TIME[0]%16+0x30;
			buf[8]='\0';
			lcd12864_show_string(0,0,buf,0);
			//星期显示
			lcd12864_show_hz(14,0,gDS1302_TIME[5]+1);
			//温度显示
			buf[0]=sys_ctrl.temp/100+0x30;
			buf[1]=sys_ctrl.temp%100/10+0x30;
			buf[2]='.';
			buf[3]=sys_ctrl.temp%100%10+0x30;
			buf[4]='\0';
			lcd12864_show_string(11,1,buf,0);
			//运行方向
			if(sys_ctrl.dir==0)lcd12864_show_string(14,3,"->",0);
			else lcd12864_show_string(14,3,"<-",0);
			
			//站点显示
			//下行
			if(sys_ctrl.dir==0)
			{
				switch(sys_ctrl.num)
				{
					case 0:
						lcd12864_show_hz(8,3,17,0);//重新显示之前清屏的那块字
						lcd12864_show_hz(10,3,15,0);

						lcd12864_show_hz(6,2,3,0);//一号站
						lcd12864_show_hz(6,3,4,0);//二号站
						break;
					case 1:
						lcd12864_show_hz(6,2,4,0);//二号站
						lcd12864_show_hz(6,3,5,0);//三号站
						break;
					case 2:
						lcd12864_show_hz(6,2,5,0);//三号站
						lcd12864_show_hz(6,3,6,0);//四号站
						break;
					case 3:
						lcd12864_show_hz(6,2,6,0);//四号站
						lcd12864_show_hz(6,3,7,0);//五号站
						break;
					case 4:
						lcd12864_show_hz(6,2,7,0);//五号站
						lcd12864_show_string(6,3,"      ",0);
						break;
				}		
			}
			//上行
			else
			{
				switch(sys_ctrl.num)
				{
					case 0:
						lcd12864_show_hz(8,3,17,0);//重新显示之前清屏的那块字
						lcd12864_show_hz(10,3,15,0);

						lcd12864_show_hz(6,2,7,0);//五号站
						lcd12864_show_hz(6,3,6,0);//四号站
						break;
					case 1:
						lcd12864_show_hz(6,2,6,0);//四号站
						lcd12864_show_hz(6,3,5,0);//三号站
						break;
					case 2:
						lcd12864_show_hz(6,2,5,0);//三号站
						lcd12864_show_hz(6,3,4,0);//二号站
						break;
					case 3:
						lcd12864_show_hz(6,2,4,0);//二号站
						lcd12864_show_hz(6,3,3,0);//一号站
						break;
					case 4:
						lcd12864_show_hz(6,2,3,0);//一号站
						lcd12864_show_string(6,3,"      ",0);
						break;
				}	
			}
				
		}
		//设置模式显示
		else
		{
			switch(sys_ctrl.mode)
			{
				case 1://年
					lcd12864_show_hz(4,2,sys_ctrl.set_time[5]+1,0);

					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,1);
					break;
				case 2://月
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,1);
					break;
				case 3://日
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,1);
					break;
				case 4://时
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,0);

					buf[0]=sys_ctrl.set_time[2]/16+0x30;
					buf[1]=sys_ctrl.set_time[2]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(0,1,buf,1);
					break;
				case 5://分
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,0);

					buf[0]=sys_ctrl.set_time[2]/16+0x30;
					buf[1]=sys_ctrl.set_time[2]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(0,1,buf,0);

					buf[0]=sys_ctrl.set_time[1]/16+0x30;
					buf[1]=sys_ctrl.set_time[1]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(4,1,buf,1);
					break;
				case 6://秒
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,0);

					buf[0]=sys_ctrl.set_time[2]/16+0x30;
					buf[1]=sys_ctrl.set_time[2]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(0,1,buf,0);

					buf[0]=sys_ctrl.set_time[1]/16+0x30;
					buf[1]=sys_ctrl.set_time[1]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(4,1,buf,0);

					buf[0]=sys_ctrl.set_time[0]/16+0x30;
					buf[1]=sys_ctrl.set_time[0]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(8,1,buf,1);
					break;
				case 7://星期
					buf[0]='2';
					buf[1]='0';
					buf[2]=sys_ctrl.set_time[6]/16+0x30;
					buf[3]=sys_ctrl.set_time[6]%16+0x30;
					buf[4]='\0';
					lcd12864_show_string(0,0,buf,0);

					buf[0]=sys_ctrl.set_time[4]/16+0x30;
					buf[1]=sys_ctrl.set_time[4]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(6,0,buf,0);

					buf[0]=sys_ctrl.set_time[3]/16+0x30;
					buf[1]=sys_ctrl.set_time[3]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(10,0,buf,0);

					buf[0]=sys_ctrl.set_time[2]/16+0x30;
					buf[1]=sys_ctrl.set_time[2]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(0,1,buf,0);

					buf[0]=sys_ctrl.set_time[1]/16+0x30;
					buf[1]=sys_ctrl.set_time[1]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(4,1,buf,0);

					buf[0]=sys_ctrl.set_time[0]/16+0x30;
					buf[1]=sys_ctrl.set_time[0]%16+0x30;
					buf[2]='\0';
					lcd12864_show_string(8,1,buf,0);

					lcd12864_show_hz(4,2,sys_ctrl.set_time[5]+1,1);
					break;	
			}			
		}		

		break;
	}
}

//门的开关动作
void _door_open_close(void)
{
	u8 i=3;
	while(i--)
	{
		step_motor_28BYJ48_send_pulse(4,0,80,1,1);
	}
	delay_ms(1000);
	i=3;
	while(i--)
	{
		step_motor_28BYJ48_send_pulse(4,1,80,1,1);
	}	
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	lcd12864_init();
//	ds1302_init();
	ds18b20_init();
	//间隔一段时间,等待数据稳定
	while(i--)
	{
		//温度获取
		sys_ctrl.temp=ds18b20_read_temperture()*10;
		delay_ms(100);	
	}
	sys_open_show();//系统开机界面显示	
	
	while(1)
	{	
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制
	}
}


三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】依赖注入方式,DI的方式

这里写目录标题 1. setter注入在一个类中注入引用类型在一个类中注入简单类型 2. 构造器注入在一个类中注入引用类型在一个类中注入简单类型 3. 依赖注入方式选择4. 依赖自动装配按类型注入按名称注入 5. 集合注入 1. setter注入 在一个类中注入引用类型 回顾一下之前setter注…

【深度学习实验】网络优化与正则化(七):超参数优化方法——网格搜索、随机搜索、贝叶斯优化、动态资源分配、神经架构搜索

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、优化算法0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…

万宾科技智能井盖传感器,提升市政井盖健康

市政井盖就是城市里不可或缺的基础设施之一&#xff0c;关于它的监测工作可马虎不得。它承载着保护市民的交通安全以及城市正常运转的重要使命。虽然现在城市化的速度很快&#xff0c;但是传统的市政井盖管理方式变得有些力不从心了。井盖的覆盖范围很广&#xff0c;如果单单依…

Python爬虫动态ip代理防止被封的方法

目录 前言 一、什么是动态IP代理&#xff1f; 二、如何获取代理IP&#xff1f; 1. 付费代理IP 2. 免费代理IP 3. 自建代理IP池 三、如何使用代理IP爬取数据&#xff1f; 1. 使用requests库设置代理IP 2. 使用urllib库设置代理IP 3. 使用selenium库设置代理IP 四、常…

实现MQTT协议的服务器端和客户端的双向交互

公司和第三方合作开发一个传感器项目&#xff0c;想要通过电脑或者手机去控制项目现场的传感器控制情况。现在的最大问题在于&#xff0c;现场的边缘终端设备接入的公网方式是无线接入&#xff0c;无法获取固定IP&#xff0c;所以常规的HTTP协议通信就没法做&#xff0c;现在打…

群晖7.2安装Jellyfin+alist+CloudDriver搭建无盘影院中心

群晖7.2安装JellyfinalistCloudDriver搭建无盘影音中心。 实现思路如下&#xff1a; Jellyfin&#xff1a;提供个人影院功能。 alist&#xff08;xiaoya&#xff09;&#xff1a;给影院提供海量影音资源。 CloudDriver2&#xff1a;alist的资源为网络资源&#xff0c;通过C…

lvgl 画圆弧时进入 HardFault

目录 一、现象描述 lvgl 版本 二、问题分析 lvgl 需要的资源新建mcu 工程时默认分配的资源问题解决 一、现象描述 移植完lvgl 之后&#xff0c;能正常显示label&#xff0c;但是button arc 等复杂的控件都不能正常显示。调用官方的画圆弧demo 时&#xff0c;在多次调用 _lv…

业务流程图用什么软件画?这10款流程图软件,好用到飞起!

业务流程图是什么&#xff1f; 业务流程图是一种用于表示业务过程中活动流向的图形表示方法&#xff0c;它使用标准化的图形元素&#xff08;如箭头、椭圆、方框等&#xff09;来表达一个过程中各个环节之间的关系。在这个图形表示中&#xff0c;每个元素都有特定的含义和功能…

C#WPF用户控件及自定义控件实例

本文演示C#WPF自定义控件实例 用户控件(UserControl)和自定义控件(CustomControl)都是对UI控件的一种封装方式,目的都是实现封装后控件的重用。 只不过各自封装的实现方式和使用的场景上存在差异。 1 基于UserControl 创建 创建控件最简单一个方法就是基于UserControl …

Docker在Centos7下的安装

1、卸载旧版本 执行如下指令对旧版本进行卸载&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 执行完毕后&#xff0c;如果输入docker version发现do…

【MySQL学习笔记-001】- 创建表、插入数据、查看数据库结构

创建employees表 当创建一个表时&#xff0c;需要指定表的名称和每个列的名称和数据类型。以下是一个示例SQL语句&#xff0c;用于创建一个名为"employees"的表&#xff0c;其中包含员工ID、姓名、职位和工资等列&#xff1a; CREATE TABLE employees (employee_id…

单稳态中间继电器\UEG/A-2H/220V 8A导轨安装 JOSEF约瑟

UEG系列中间继电器 UEG/A-2H2D中间继电器UEG/A-4H4D中间继电器UEG/A-2D中间继电器 UEG/A-2H中间继电器UEG/A-4H中间继电器UEG/A-4D中间继电器 UEG/A-6H中间继电器UEG/A-6D中间继电器UEG/A-8H中间继电器 UEG/A-10D中间继电器UEG/A-10H中间继电器UEG/A-2DPDT中间继电器 UEG/A-4DP…

23111710[含文档+PPT+源码等]计算机毕业设计基于SpringBoot的体育馆场地预约赛事管理系统的设计

文章目录 **软件开发环境及开发工具&#xff1a;****功能介绍&#xff1a;****论文截图&#xff1a;****数据库&#xff1a;****实现&#xff1a;****代码片段&#xff1a;** 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 软件开发环境及…

国民技术Cortex-M0系列单片机IAP升级

考虑到设备部署到现场后有可能需要进行软件升级&#xff0c;之前做过PIC系列单片机的升级&#xff0c;现在想做个国民技术N32G031系列Cortex-M0内核的单片机IAP方案。 因为国民技术系列单片机在很多大程度上都模仿了STM32&#xff0c;所以我想其升级方案极有可能差不多。于是在…

C#开发的OpenRA游戏之属性BodyOrientation(6)

C#开发的OpenRA游戏之属性BodyOrientation(6) 在顶层定义里会发现这个属性: ^SpriteActor: BodyOrientation: QuantizeFacingsFromSequence: RenderSprites: SpriteActor是用来定义角色的基本属性,它的第一个属性就是BodyOrientation,这个属性主要用来描述角色的身体的…

DOA估计算法——Capon算法

1.波速形成基本思想 在理解Capon算法之前&#xff0c;我们有必要先了解波束形成的基本思想以及原理到底是什么。这有助于我们更好的理解Capon算法的思想。 图 1 如图1展示了均匀阵列波束导向的示意图。图中wm表示加权值&#xff0c;波速形成(DBF)的基本思想就是将各阵元输出进…

AVL树的底层实现

文章目录 什么是AVL树&#xff1f;平衡因子Node节点插入新节点插入较高左子树的左侧新节点插入较高左子树的右侧新节点插入较高右子树的左侧新节点插入较高右子树的右侧 验证是否为平衡树二叉树的高度AVL的性能 什么是AVL树&#xff1f; AVL树又称平衡二叉搜索树&#xff0c;相…

基于ssm+vue的程序设计课程可视化教学系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Jmeter进行压力测试不为人知的秘密

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…