【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设计,视频分享,技术交流。
相关文章:
【Proteus仿真】【51单片机】公交车报站系统
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用LCD12864显示模块、DS18B20温度传感器、DS1302时钟模块、按键、LED蜂鸣器、ULN2003、28BYJ48步进电机模块等。 主要功能: 系统运行后&…...
C++--STL总结
参考教程:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili 软件界一直希望建立一种可重复利用的东西,C的面向对象和泛型编程思想,目的就是复用性的提升。 大多情况下,数据结构和算法都未能有一套标准,…...
Python----图像的手绘效果
图像的数组表示 图像是有规则的二维数据,可以用numpy 库将图像转换成数组对象 : from PIL import Image import numpy as np imnp.array(Image.open("D://np.jpg")) print(im.shape,im.dtype)结果: 图像转换对应的ndarray 类型是3 维数据&am…...
Android13集成paho.mqtt.android启动异常
项目中原依赖是: implementation(org.eclipse.paho:org.eclipse.paho.android.service:1.1.1) {exclude module: support-v4transitive true } implementation org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5在Android10系统运行正常,能够连接…...
STM框架之按键扫描新思路
STM框架之按键扫描新思路 引入代码展示思路分析 我们学习了定时器实现毫秒级/秒级任务框架,这期我们基于任务框架学习按键扫描新思路。 引入 在按键扫描的过程中,最重要的一步就是按键消抖,解决的方法最简单粗暴的就是先扫描一次按键状态&am…...
Linux服务器挂载另一台服务器的文件夹(mount)
我们实际应用中,会常遇到多个Linux服务器之间需要频繁共享文件,或者是一台服务器需要使用另一台服务器的闲置磁盘空间。最方便的方法就是挂载另一台linux文件夹(文件服务器),通俗理解为:当前服务器远程连接…...
剑指offer --- 用两个栈实现队列的先进先出特性
目录 前言 一、读懂题目 二、思路分析 三、代码呈现 总结 前言 当我们需要实现队列的先进先出特性时,可以使用栈来模拟队列的行为。本文将介绍如何使用两个栈来实现队列,并给出具体的思路和代码实现。 一、读懂题目 题目:用两个栈实现一…...
流媒体协议
◆ RTP(Real-time Transport Protocol),实时传输协议。 ◆ RTCP(Real-time Transport Control Protocol),实时传输控制协议。 ◆ RTSP(Real Time Streaming Protocol),实时流协议。 ◆ RTMP(Real Time Messaging Protocol),实时…...
ClickHouse的分片和副本
1.副本 副本的目的主要是保障数据的高可用性,即使一台ClickHouse节点宕机,那么也可以从其他服务器获得相同的数据。 Data Replication | ClickHouse Docs 1.1 副本写入流程 1.2 配置步骤 (1)启动zookeeper集群 (2&…...
C语言编程陷阱(五)
陷阱21:不要使用逗号运算符代替分号 C语言中,我们可以使用分号来结束一个语句,比如a = b;,这样可以让编译器知道语句的边界,以及执行的顺序。但是,如果我们想要在一个语句中执行多个表达式,就可以使用逗号运算符,比如a = (b = c, c + 1);,这样可以让编译器按照从左到右…...
chardet检测文件编码,使用生成器逐行读取文件
detect_encoding 函数使用 chardet 来检测文件的编码。然后,在 process_large_file 函数中,根据检测到的编码方式打开文件。这样,你就能够更准确地处理不同编码的文件。 import chardetdef detect_encoding(file_path):with open(file_path,…...
html所有标签和DOCTYPE的总结
一、DOCTYPE 1. 意义 DOCTYPE是一种标准通用标记语言的文档类型声明,告诉标准通用标记语言解析器它应该使用什么样的文档类型定义来解析文档。 2. 应用 现在,我们需要告诉标准通用标记语言解析器,我们接下去要用html来编写代码了。 <…...
2023年11月15号期中测验判断题(Java)
1-1 局部变量可以与成员变量重名。 正确答案:T 解释: 局部变量可以和成员变量重名,通常,为了区分局部变量和成员变量,会使用this关键字(C称this指针,python是self关键字)来特别声…...
基于 selenium 实现网站图片采集
写在前面 有小伙伴选题,简单整理理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对…...
vue3相关内容
ref声明/赋值 操作基本类型数据 string number // 引入方法 import {ref} from vue // 声明变量 const name ref(A) // 修改值 name.value Breactive声明/赋值 操作引用类型数据 array object proxy不能直接赋值,会破坏响应式对象 // 引入方法 import {reacti…...
AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(七):FreeRTOS移植
前言: 一般的GUI工程都需要一个操作系统,可能是linux,重量级的,也可能是FreeRTOS,轻量级的。 一句话理解那就是工程就是FreeRTOS task任务的集合。 一个main函数可以看到大框架: 很显然,除了第一个是硬件配置的初始化,中间最重要的部分就是要创建任务,把AWTK的应用…...
《洛谷深入浅出进阶篇》P1995 程序自动分析——并查集,离散化
上链接:P1955 [NOI2015] 程序自动分析 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1955 上题干: 首先给你一个整数t,代表t次操作。 每一次操作包含以下内容: 1.给你一个整数n,让…...
基于单片机的自动循迹小车(论文+源码)
1.系统设计 此次基于单片机的自动循迹小车的设计系统,结合循迹模块来共同完成本次设计,实现小车的循迹功能,其其整体框架如图2.1所示。其中,采用STC89C52单片机来作为核心控制器,负责将各个传感器等模块链接起来&…...
linux系统中安装python到指定目录
Linux系统中安装python 下载Python源码包 根据服务器系统和需要的Python版本,在Python官网下载对应的Python源码包。 安装依赖(需要权限) yum install gcc gcc-c patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel…...
分布式事务 - seata安装
分布式事务 - seata 一、本地事务与分布式事务 1.1、本地事务 本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则(ACID)。 1.2、分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
