【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、分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构…...
OpenClaw+Qwen3-VL:30B:个人多模态AI助手全流程
OpenClawQwen3-VL:30B:个人多模态AI助手全流程 1. 为什么选择这个组合? 去年冬天,我发现自己陷入了一个典型的知识工作者困境:每天要处理大量图片资料(产品截图、会议白板照片、技术文档截图),…...
避坑指南:Python操作Word文档最常见的5个错误(python-docx实战心得)
Python-docx实战避坑指南:5个高频错误与解决方案 在自动化办公场景中,Python操作Word文档的需求日益增长,而python-docx库作为主流工具,其易用性背后隐藏着不少"暗礁"。许多开发者在基础教程阶段一帆风顺,却…...
别再手动校正了!用Landsat 9 L2SP地表反射率数据,在QGIS里5分钟搞定NDVI和水体提取
遥感分析效率革命:用Landsat 9 L2SP数据在QGIS中实现5分钟精准制图 当遥感数据处理流程从传统数小时缩短至五分钟,这意味着什么?去年在亚马逊雨林监测项目中,我们团队曾因大气校正步骤延误错过了最佳干预时机。如今Landsat 9 L2SP…...
PWM技术原理与电机调速应用详解
PWM技术原理与电机调速应用详解1. PWM基础概念解析1.1 脉冲宽度调制定义PWM(Pulse Width Modulation)即脉冲宽度调制,是一种通过调节脉冲信号的宽度(占空比)来实现能量控制的电子电力技术。该技术在直流电机调速、开关电源、逆变器等电力电子领域有广泛应用。1.2 脉…...
嵌入式串口协议中间件:轻量级SerHelp库设计与应用
1. 项目概述nahs-Bricks-Lib-SerHelp是 NAHS(North American Home System)生态中面向嵌入式砖块化(Brick-based)硬件平台的一套轻量级串行通信辅助库。该库不提供底层驱动实现,而是聚焦于串口协议层的工程化封装与通用…...
Linux文件系统架构与缓存机制解析
Linux文件系统架构与缓存机制深度解析1. 文件系统核心架构1.1 文件系统基本组织形式Linux文件系统采用分层结构设计,主要包含以下核心组件:块存储机制:硬盘被划分为固定大小的块(默认4KB),文件数据分散存储…...
AutoConnect:ESP32/ESP8266 运行时 Wi-Fi 配网与 OTA 一体化方案
1. AutoConnect 库深度技术解析:面向嵌入式工程师的 ESP32/ESP8266 运行时 Wi-Fi 配置系统AutoConnect 是一个专为 ESP32 和 ESP8266 平台设计的 Arduino 库,其核心目标是在设备运行时(runtime)通过 Web 界面完成 Wi-Fi 网络的动态…...
【大模型工程实践③】RAG 基础架构与完整实现
【大模型工程实践③】RAG 基础架构与完整实现:从0到1跑通 作者:AI学习者 | 来源:大模型工程实践学习系列 | 更新:2026年3月 【理论要点速览】 学习本篇前,建议先掌握以下核心理论(点击跳转): ① 为什么需要RAG? ② RAG vs Fine-tuning vs Long Context的决策框架 ③ …...
零基础快速入门前端DOM核心知识点详解与蓝桥杯Web赛道备考指南(可用于备赛蓝桥杯Web应用开发)
DOM(文档对象模型)是 HTML/XML 文档的编程接口,通过它可动态操作网页内容、结构与样式。本文将结合示例代码,系统讲解 DOM 核心知识点(重点补充事件系统全解),并针对蓝桥杯 Web 应用开发赛道给出…...
MacOS开发环境配置:OpenClaw+GLM-4.7-Flash联调指南
MacOS开发环境配置:OpenClawGLM-4.7-Flash联调指南 1. 为什么选择这个组合? 去年我在做一个自动化文档处理项目时,发现市面上的AI工具要么隐私性不足,要么灵活性太差。直到偶然接触到OpenClaw这个开源框架,才找到了理…...
