24 基于51单片机的公交车报站仿真(LCD12864、DS1302、串口)

news2024/11/17 12:19:54

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,采用DS1302时钟模块读取时间,通过LCD12864显示实时时间,然后两个按键,一个按下表示到站,一个按下表示没到站。
到达站点,蜂鸣器发出声音,屏幕显示到站,通过串口发送信息
如果没到站,屏幕显示未到站,通过串口发送信息

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

#include <reg51.h>#include "DS18B20.h"#include "DS1302.h"#include "LCD12864.h"#include <stdio.h>sbit beep=P2^7;char a;
sbit key1 = P3^6;
sbit key2 = P3^7;void ajpd();/***按键触发标志位***/bit  flag=1; //进入/退出设置标志void ckdy();// 定义一个结构体来存储时间信息typedef struct {    int year;    int month;    int day;    int hour;    int minute;    int second;	  int weekend;
} TimeInfo;TimeInfo convert\_to\_time_info(int time\[\]);/***按键触发实现函数***/void delay10(void) //延时10ms{    unsigned char i,j;    for(i=0; i<255; i++)        for(j=0; j<200; j++);
}void delay5ms(void)   //误差 0us{    unsigned char a,b;    for(b=19; b>0; b--)        for(a=130; a>0; a--);
}//设置时ds1302寄存器值循环 如秒寄存器59时加一变为00unsigned char conver(unsigned char a,unsigned char b,unsigned char c){    if((a&0x0f)==0x0a) a=a+6;    if(a==b)  a=c;    return a;
}void digplay() {    //时间
    ShowNumber16_32(2,0,TIME\[2\]>>4&0x03); //时 十位
    ShowNumber16_32(2,16, TIME\[2\]&0x0f);//时  个位
    ShowNumber16_32(2,48,TIME\[1\]>>4&0x07);//分  十位
    ShowNumber16_32(2,64, TIME\[1\]&0x0f);//分  个位
    ShowNumber16_32(2,96,TIME\[0\]>>4&0x07);//秒 十位
    ShowNumber16_32(2,112, TIME\[0\]&0x0f);//秒  个位


    //日期
    ShowNumber(0,0,2);    ShowNumber(0,8,0);    ShowNumber(0,16,TIME\[6\]>>4&0x0f);    ShowNumber(0,24, TIME\[6\]&0x0f);//年

   ShowNumber(0,40,TIME\[4\]>>4&0x01);    ShowNumber(0,48, TIME\[4\]&0x0f);//月

    ShowNumber(0,64,TIME\[3\]>>4&0x03);    ShowNumber(0,72, TIME\[3\]&0x0f);//日

    ShowChina(0,112,(TIME\[5\]&0x07)-1);//周}void digplaystart() {//开机显示
    uchar i=0;    ShowChina(2,64-16\*1.5,19);    ShowChina(2,64-16\*0.5,20);    ShowChina(2,64+16\*0.5,21);    ShowChina(2,64+16\*1.5,22);    for (i=0; i<10; i++) {        ShowNumber(4,32+8*i,16);        delay5ms();        delay5ms();
    }    ClearScreen(0);//清屏}void Com0_Init(void){
 	TMOD =0x20;		   //设T0为方式1,GATE=1;
	SCON=0x50;        //开启串口
	TH1=0xFD;          //波特率是9600bps
	TL1=0xFD;
	TR1=1;			   //开启定时器
	TI=1;
	EA=1;
}

TimeInfo time_info; // 在 main 函数外部声明 TimeInfo 结构体实例void main(void){    InitLCD();	  //初始化LCD12864
	  Com0_Init();//串口初始化 
    digplaystart();    delay5ms();    ShowNumber(0,32,11);//-
    ShowNumber(0,56,11);//-
    ShowChina(0,96,7);//汉字周
    ShowNumber16_32(2,32,10);//:
    ShowNumber16_32(2,80,10);//:
    beep = 0;    while(1)
    {    
        if(flag==1)            Ds1302ReadTime();        //读取DS1302的时间
        else
				{            Ds1302WriteTime();
				}				
				ajpd();//按键判断
        digplay();
				
  time\_info = convert\_to\_time\_info(TIME); // 将 TIME 数组中的时间信息转换为 TimeInfo 结构体

				
				
    }
}// 函数将 TIME 数组中的时间信息转换为 TimeInfo 结构体TimeInfo convert\_to\_time_info(int time\[\]) {
    TimeInfo info;
    info.year = 2000+(TIME\[6\] >> 4 & 0x0f) * 10 + (TIME\[6\] & 0x0f);
    info.month = (TIME\[4\]>>4&0x01)*10 + (TIME\[4\]&0x0f);
    info.day = (TIME\[3\]>>4&0x03)*10 + (TIME\[3\]&0x0f);
    info.hour = (TIME\[2\]>>4&0x03)*10 + (TIME\[2\]&0x0f);
    info.minute = (TIME\[1\]>>4&0x07)*10 + (TIME\[1\]&0x0f);
    info.second = (TIME\[0\]>>4&0x07)*10 + (TIME\[0\]&0x0f);    return info;
}void ajpd(){	if(!key1)
	{//		InitLCD();
		ShowChina(6,0,26);//已
		ShowChina(6,16,23);//到
		ShowChina(6,32,24);//站
		beep = 1;		   // 使用 PRINTF 函数打印时间信息
     printf("当前时间是:%04d-%02d-%02d %02d:%02d:%02d ",
           time\_info.year, time\_info.month, time_info.day,
           time\_info.hour, time\_info.minute, time_info.second);		printf("周四\\n");			printf("已到站\\n");		while(!key1);
	}	
	if(!key2)
	{//		InitLCD();
		ShowChina(6,0,25);//未
		ShowChina(6,16,23);//到
		ShowChina(6,32,24);//站
		beep = 0;		   // 使用 PRINTF 函数打印时间信息
     printf("当前时间是:%04d-%02d-%02d %02d:%02d:%02d ",
           time\_info.year, time\_info.month, time_info.day,
           time\_info.hour, time\_info.minute, time_info.second);		printf("周四\\n");			printf("未到站\\n");		while(!key2);
	}
}

四、实现现象

具体动态效果看B站演示视频:

2d851c1bc120f74fa21ced3be39fb029.jpeg

基于51单片机的公交车报站

全部资料(源程序、仿真文件、安装包、演示视频、串口演示视频和串口资料):
链接:https://pan.baidu.com/s/11AnOZLdbq16o84nyJ52ZRQ?pwd=1i0i 
提取码:1i0i

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

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

相关文章

亚信安全天穹5分钟勒索体检 免费试用今起上线

对于勒索攻击的认知 你是否还停留在“2.0时代”&#xff1f; 勒索攻击无疑是企业面临的最大威胁&#xff0c;2024年上半年&#xff0c;勒索组织数量同步增长超过50%&#xff0c;勒索攻击数量也持续攀升&#xff0c;平均勒索赎金突破520万美元。 当前&#xff0c;勒索攻击治理…

Spring Boot 进阶- 如何从配置文件中获取值?

&emps;在上一篇文章中,我们介绍了两种配置文件的方式,那么在添加完配置文件之后,我们如何从配置文件中获取到对应配置的值呢?这篇文章中我们就来看看这个问题。 一般的说SpringBoot中读取配置文件的方式有两种 @Value注解:基于@Value注解进行配置,一般适用于单个属性…

工业狗转行AI的心路历程,重新来过为时不晚!

言归正传&#xff0c;原本想写一篇人工智能大模型的科普文&#xff0c;为以后整理学习笔记开个头&#xff0c;但是细细琢磨了一下我这半吊子水平&#xff0c;怕是说不齐全。而且&#xff0c;我一直以来都很想跟把自己跨专业/行业转行AI的心路历程跟别人分享一下&#xff0c;希望…

10.1 Linux_并发_进程基本知识

进程和程序的区别&#xff1a; 程序是存放在磁盘上的文件&#xff0c;是静态的。进程就是跑起来的程序&#xff0c;是动态的。它包括创建、调度、执行、消亡。是一个程序所分配资源的总称。 具体提关系如下&#xff1a; 各部分具体含义参考博文"16.C基础_内存管理"…

双token无感刷新(vue3+node.js)

无感刷新的基本原理 使用刷新令牌&#xff08;refresh token&#xff09;&#xff1a; ○ 应用程序在首次登录成功后会获得一个访问令牌&#xff08;access token&#xff09;和一个刷新令牌&#xff08;refresh token&#xff09;。 ○ 访问令牌通常有较短的有效期&#xff0…

2024史上最全网络安全面试题+答案,看完offe拿到手软!

1.1 网络安全行业现状 安全行业起步晚。安全行业整体起来才没几年&#xff0c;多数企业因为资源投入和建设时间原因导致覆盖面和深入度都不够&#xff0c;这其中甚至包括一些国内大厂&#xff0c;并没有想象的那么安全。其安全水位仅能应付一些白帽子级别&#xff0c;针对专业…

产品经理有必要学习大模型技术吗???

产品经理要讨论的&#xff0c;不是有没有必要学习大模型&#xff0c;而是以怎样的姿势拥抱大模型。 我之前公司是外企&#xff0c;还记得当年Iphone刚推出的时候&#xff0c;我的一个同事从东北老家拿着一个U盘跑到北京&#xff0c;跟我们公司部门主管描绘了他设想中PC端产品迁…

终于不用为GPU算力发愁了,FLUX LoRA训练一键启动!(附模型)

FLUX 是一个开源的全新的图像生成器&#xff0c;可以生成逼真的超现实图像&#xff0c;人们称它为 Midjourney 的终结者&#xff0c;下一代 Stable Diffusion 的替代品。 FLUX究竟强大到什么程度&#xff1f;外网到现在为止&#xff0c;都还有抵制它的声音。 Google DeepMind 团…

excel快速入门(二)

Excel的概念说明 文章目录 Excel的概念说明常见术语说明单元格/单元格区域活动单元格/单元格区域行或列单元格引用相对引用绝对引用混合引用 Excel的常见格式说明单元格格式数字格式 Excel 工作表编辑鼠标指针介绍1.白色十字状2.单向黑色箭头状3.双向单竖线箭头状4.双向双竖线箭…

Dubbo框架面试题

1.什么是Dubbo? Dubbo是基于Java的高性能轻量级的RPC分布式服务框架&#xff0c;现已成为 Apache 基金会孵化项目。 2.为什么要使用Dubbo? 随着互联网的快速发展&#xff0c;Web应用程序的规模不断扩大&#xff0c;分布式服务体系结构和流计算体系结构势在必行。 dubbo的…

对博客系统进行自动化测试

博客系统代码&#xff1a;spring-blog taotao/Studying JavaEE Advanced - 码云 - 开源中国 (gitee.com) 自动化脚本代码&#xff1a;BlogAutoTest taotao/Studying JavaEE Advanced - 码云 - 开源中国 (gitee.com) 上线项目地址&#xff1a;博客登陆页 目录 一、博客系统项…

【Spring】lombok、dbUtil插件应用

一、lombok插件 1. 功能&#xff1a;对实体类自动&#xff0c;动态生成get、set方法&#xff0c;无参、有参构造..... 2. 步骤&#xff1a; &#xff08;1&#xff09;idea安装插件(只做一次) &#xff08;2&#xff09;添加坐标 &#xff08;3&#xff09;编写注解 NoArgsCo…

Python面向对象编程:类和对象①

文章目录 一、什么是面向对象编程1.1 面向对象编程的基本概念1.2 Python中的类和对象 二、定义类和创建对象2.1 定义类2.2 创建对象2.3 __init__方法2.4 self参数 三、类的属性和方法3.1 类的属性3.1.1 实例属性3.1.2 类属性 3.2 类的方法3.2.1 实例方法3.2.2 类方法3.2.3 静态…

Redis缓存技术 基础第二篇(Redis的Java客户端)

文章目录 一、Redis的Java客户端二、Jedis快速入门三、Jedis连接池四、SpringDataRedis快速入门五、SpringDataRedis优化 一、Redis的Java客户端 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/clients 而关于java的功能模块分为以下几种…

数据的表示和存储 第4讲 C语言中的浮点数的编码表示

作者简介:互联网行业 算法研发工程师 本文适合阅读者:对C语言浮点数有一些疑惑的同学~ C语言的基本数据类型中,除了整数之外,还包含浮点数。 浮点数在机器中是如何表示的呢? 科学计数法,我们比较熟悉,任何十进制的数,都可以表示为:一个小数✖10的多少次方。 尾数的…

FIOT/浙江信达可恩消防股份有限公司25周年庆典隆重召开

一年一度&#xff0c;有着智慧消防物联网发展“行业风向标”的FIOT2024中国消防物联网大会&#xff0c;9月10日在杭州拉开帷幕&#xff01;大会以丰富的流程设置&#xff0c;全新的会议视角为您呈现一场新思想、有干货、有价值的行业盛会。 9月10号下午&#xff0c;浙江信达可…

Spring MVC中实现一个文件上传和下载功能

说到文件上传和下载&#xff0c;相信每个开发者都有或多或少的接触过文件上传的功能吧&#xff0c;文件上传和下载是我们在学习计算机网络应用常见的一个功能&#xff0c;主要涉及到用户和服务器之间的数据传输。 我们来对文件上传和下载功能的进行相关概述吧&#xff01; 文…

MySQL事务、索引、数据恢复和备份

MySQL事务、索引、数据恢复和备份 1.MySQL的事务处理 事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错&#xff0c;则该批次内的所有SQL都将被取消执行 MySQL的事务实现方法 : SET AUTOCOMMIT 使用SET语句来改变自动提交模式 SET AUTOCOMMIT 0; # 关…

测试干货 | 一文读懂工业CT检测技术—无损检测手段

撰文排版&#xff1a;刘佳 审核指导&#xff1a;肖俊灵 “研路漫漫&#xff0c;伴你同行” 本文较长&#xff0c;建议先收藏后随时查看&#xff01;以后我们将更新更多此类硬核科普&#xff0c;欢迎关注&#xff01; 工业CT&#xff0c;即工业计算机断层成像技术&#xff0c;作…

舞台灯细绿激光模组安装方式

在追求视觉盛宴的现代舞台艺术中&#xff0c;细绿激光模组以其独特的色彩、高亮度和精准性&#xff0c;成为了不可或缺的创意元素。舞台灯细绿激光模组不仅能营造出梦幻般的氛围&#xff0c;还能通过精准的光束定位&#xff0c;引领观众视线&#xff0c;增强表演的层次感和沉浸…