【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、分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
