48-基于单片机的LCD12864时间调控和串口抱站

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机的公交报站系统,可以手动报站,站名十个。
在lcd12864上显示时间(年月日时分秒)和站名,时间可以设置,
仿真中可以语音播报。加一个用串口模拟语音播报。 

二、硬件资源

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

三、程序编程

#include <reg52.h>
#include <intrins.h>
#include<stdio.h>
#include "DS1302.h"
#include < character.h >
#include < lcd.h >
#define uchar unsigned char
#define uint unsigned intunsigned char KEY_NUM = 0;
unsigned char KEY2_Count = 0;
bit Flag_KEY_Set = 0;
sbit key1=P1^3;
sbit key2=P1^4;
sbit key3=P1^5;
sbit key4=P1^6;
sbit key5=P1^7;
sbit key6=P0^0;
sbit key7=P0^1;
sbit key8=P0^2;
sbit key9=P0^3;
sbit key10=P0^4;sbit KEY1 = P0^5;
sbit KEY2 = P0^6;
sbit KEY3 = P0^7;
sbit KEY4 = P3^5;void ajpd();void jiemian1(void)  //站台一
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[2]);  //printf("站台一\r\n");	
}void jiemian2(void)  //站台2
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[3]);  //printf("站台二\r\n");	
}void jiemian3(void)  //站台3
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[4]);  //printf("站台三\r\n");	
}void jiemian4(void)  //站台4
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[5]);  //printf("站台四\r\n");	
}void jiemian5(void)  //站台5
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[6]);  //printf("站台五\r\n");	
}void jiemian6(void)  //站台6
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[7]);  //printf("站台六\r\n");	
}void jiemian7(void)  //站台7
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[8]);  //printf("站台七\r\n");	
}void jiemian8(void)  //站台8
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[9]);  //printf("站台八\r\n");	
}void jiemian9(void)  //站台9
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[10]);  //printf("站台九\r\n");	
}void jiemian10(void)  //站台10
{Lcd_Character_16X16( 1, 4, 0 , function_logo[0]);  //Lcd_Character_16X16( 1, 4, 16 , function_logo[1]);  //Lcd_Character_16X16( 1, 4, 32 , function_logo[11]);  //printf("站台十\r\n");	
}
//按键扫描程序
//****************************************************
void Scan_Key()
{if( KEY1 == 0 )	 					//按键1扫描{Delay(10);					//延时去抖if( KEY1 == 0 ){while(KEY1 == 0);			//等待松手KEY_NUM = 1;}}if( KEY2 == 0 )						//按键2扫描{Delay(10);					//延时去抖if( KEY2 == 0 ){while(KEY2 == 0);			//等待松手KEY_NUM = 2;}}if( KEY3 == 0 )						//按键2扫描{Delay(10);					//延时去抖if( KEY3 == 0 ){while(KEY3 == 0);			//等待松手KEY_NUM = 3;}}if( KEY4 == 0 )						//按键2扫描{Delay(10);					//延时去抖if( KEY4 == 0 ){while(KEY4 == 0);			//等待松手KEY_NUM = 4;}}
}void Display_RTCC(void)
{Lcd_Character_16X8(1,0,0,letter_logo[DS1302Buffer.Year/10]);Lcd_Character_16X8(1,0,8,letter_logo[0]);Lcd_Character_16X8(1,0,16,letter_logo[2]);Lcd_Character_16X8(1,0,24,letter_logo[DS1302Buffer.Year%10]);Lcd_Character_16X8(1,0,32,letter_logo[11]);Lcd_Character_16X8(1,0,40,letter_logo[DS1302Buffer.Month/10]);Lcd_Character_16X8(1,0,48,letter_logo[DS1302Buffer.Month%10]);Lcd_Character_16X8(1,0,56,letter_logo[11]);Lcd_Character_16X8(1,0,64,letter_logo[DS1302Buffer.Day/10]);	Lcd_Character_16X8(1,0,72,letter_logo[DS1302Buffer.Day%10]);	Lcd_Character_16X8(1,2,0,letter_logo[DS1302Buffer.Hour/10]);Lcd_Character_16X8(1,2,8,letter_logo[DS1302Buffer.Hour%10]);Lcd_Character_16X8(1,2,16,letter_logo[10]);Lcd_Character_16X8(1,2,24,letter_logo[DS1302Buffer.Minute/10]);Lcd_Character_16X8(1,2,32,letter_logo[DS1302Buffer.Minute%10]);Lcd_Character_16X8(1,2,40,letter_logo[10]);Lcd_Character_16X8(1,2,48,letter_logo[DS1302Buffer.Second/10]);Lcd_Character_16X8(1,2,56,letter_logo[DS1302Buffer.Second%10]);
}//串口初始化
void init_com(void)
{TMOD =0x20;		   //设T0为方式1,GATE=1;SCON=0x50;        //开启串口TH1=0xFD;          //波特率是9600bpsTL1=0xFD;TR1=1;			   //开启定时器TI=1;EA=1;
}void main()
{init_com();Lcd_Initial();     //LCD初始化Lcd_Display_On();	//启动屏幕DS1302_Init();									//初始化DS1302while(1){DS1302_GetTime(&DS1302Buffer);							//获取当前RTCC值if(Flag_Time_Refresh==1&& Flag_KEY_Set == 0)			//数据更新时才刷新LCD{Flag_Time_Refresh = 0;Display_RTCC();				//显示实时时钟		}ajpd();		Scan_Key();						//按键扫描switch( KEY_NUM ){case 1:						//按键1执行程序KEY_NUM = 0;		//清空按键标志Flag_KEY_Set = ~Flag_KEY_Set;	//设置按键标志位翻转break;case 2:						//按键2执行程序KEY_NUM = 0;		//清空按键标志if(Flag_KEY_Set)			//在设置状态时运行{KEY2_Count++;if(KEY2_Count == 6)KEY2_Count = 0;switch(KEY2_Count){case 0:Lcd_Set_X_Y(0,0);	//指针指向年,闪烁break;case 1:Lcd_Set_X_Y(0,40);	//指针指向月,闪烁break;case 2:Lcd_Set_X_Y(0,64);	//指针指向日,闪烁break;case 3:Lcd_Set_X_Y(2,0);	//指针指向小时,闪烁break;case 4:Lcd_Set_X_Y(2,24);	//指针指向分钟,闪烁break;case 5:Lcd_Set_X_Y(2,48);	//指针指向秒钟,闪烁break;default : break;}	}					break;case 3:						//按键3执行程序KEY_NUM = 0;		//清空按键标志if(Flag_KEY_Set)			//在设置状态时运行{switch(KEY2_Count){case 0:DS1302Buffer.Year++;if(DS1302Buffer.Year >= 100){DS1302Buffer.Year = 0;}DS1302_SetTime( DS1302_YEAR , DS1302Buffer.Year );Display_RTCC();break;case 1:DS1302Buffer.Month++;if(DS1302Buffer.Month >= 13){DS1302Buffer.Month = 1;}DS1302_SetTime( DS1302_MONTH , DS1302Buffer.Month );Display_RTCC();break;case 2:DS1302Buffer.Day++;if(DS1302Buffer.Day >= 32){DS1302Buffer.Day = 1;}DS1302_SetTime( DS1302_DAY , DS1302Buffer.Day );Display_RTCC();break;case 3:DS1302Buffer.Hour++;if(DS1302Buffer.Hour >= 24){DS1302Buffer.Hour = 0;}DS1302_SetTime( DS1302_HOUR , DS1302Buffer.Hour );Display_RTCC();break;case 4:DS1302Buffer.Minute++;if(DS1302Buffer.Minute >= 60){DS1302Buffer.Minute = 0;}DS1302_SetTime( DS1302_MINUTE , DS1302Buffer.Minute );Display_RTCC();break;case 5:DS1302Buffer.Second++;if(DS1302Buffer.Second >= 60){DS1302Buffer.Second = 0;}DS1302_SetTime( DS1302_SECOND , DS1302Buffer.Second);Display_RTCC();break;default : break;}}break;case 4:						//按键4执行程序KEY_NUM = 0;		//清空按键标志if(Flag_KEY_Set)			//在设置状态时运行{switch(KEY2_Count){case 0:DS1302Buffer.Year--;if(DS1302Buffer.Year == 255){DS1302Buffer.Year = 99;}DS1302_SetTime( DS1302_YEAR , DS1302Buffer.Year );Display_RTCC();break;case 1:DS1302Buffer.Month--;if(DS1302Buffer.Month == 0){DS1302Buffer.Month = 12;}DS1302_SetTime( DS1302_MONTH , DS1302Buffer.Month );Display_RTCC();break;case 2:DS1302Buffer.Day--;if(DS1302Buffer.Day == 0){DS1302Buffer.Day = 31;}DS1302_SetTime( DS1302_DAY , DS1302Buffer.Day );Display_RTCC();break;case 3:DS1302Buffer.Hour--;if(DS1302Buffer.Hour == 255){DS1302Buffer.Hour = 23;}DS1302_SetTime( DS1302_HOUR , DS1302Buffer.Hour );Display_RTCC();break;case 4:DS1302Buffer.Minute--;if(DS1302Buffer.Minute == 255){DS1302Buffer.Minute = 59;}DS1302_SetTime( DS1302_MINUTE , DS1302Buffer.Minute );Display_RTCC();break;case 5:DS1302Buffer.Second--;if(DS1302Buffer.Second == 255){DS1302Buffer.Second = 59;}DS1302_SetTime( DS1302_SECOND , DS1302Buffer.Second);Display_RTCC();break;default : break;}}break;default : break;}				}
}void ajpd()
{if(!key1){jiemian1();while(!key1);}if(!key2){jiemian2();while(!key2);}if(!key3){jiemian3();while(!key3);}if(!key4){jiemian4();while(!key4);}if(!key5){jiemian5();while(!key5);}if(!key6){jiemian6();while(!key6);}if(!key7){jiemian7();while(!key7);}if(!key8){jiemian8();while(!key8);}if(!key9){jiemian9();while(!key9);}if(!key10){jiemian10();while(!key10);}
}

四、实现现象

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

48-基于单片机的LCD12864时间调控和串口抱站_哔哩哔哩_bilibili

全部资料(源程序、仿真文件、安装包、演示视频):

点击下载百度网盘资料

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【汽车制动】汽车制动相关控制系统

目录 1.ABS (Anti-lock Brake System&#xff0c;防抱死制动系统) 2.EBD&#xff08;Electronic Brake-force Distribution&#xff0c;电子制动力分配系统&#xff09; 3.TCS&#xff08;Traction Control System&#xff0c;牵引力控制系统&#xff09; 4.VDC&#xff08…

DDR3与MIG IP核详解(一)

一、ddr3(全称第三代双倍速率同步动态随机存储器)&#xff1a; 1、特点&#xff1a;1&#xff1a;掉电无法保存数据&#xff0c;需要周期性的刷新。2:时钟上升沿和下降沿都会传输数据。 3&#xff1a;突发传输&#xff0c;突发长度 Burst Length一般为…

【算法 python A*算法的实现】

- 算法实现&#xff1a; import heapqclass Node:def __init__(self, position, g0, h0):self.position position # 节点的位置self.g g # 从起点到当前节点的成本self.h h # 从当前节点到终点的启发式估计成本self.f g h # 总成本self.parent None # 父节点def __…

苹果系统中利用活动监视器来终止进程

前言 苹果系统使用的时候总是感觉不太顺手。特别是转圈的彩虹球出现的时候&#xff0c;就非常令人恼火。如何找到一个像Windows那样任务管理器来终止掉进程呢&#xff1f; 解决办法 Commandspace 弹出搜索框吗&#xff0c;如下图&#xff1a; 输入“活动”进行搜索&#xff…

深度学习—损失函数及BP算法初步学习Day36

损失函数 1.MAE MAE&#xff08;Mean Absolute Error&#xff0c;平均绝对误差&#xff09;通常也被称为 L1-Loss&#xff0c;通过对预测值和真实值之间的绝对差取平均值来衡量他们之间的差异。。 MAE的公式如下&#xff1a; MAE 1 n ∑ i 1 n ∣ y i − y ^ i ∣ \text{…

[UUCTF 2022 新生赛]ez_rce

[UUCTF 2022 新生赛]ez_rce 我们来分析一下这个代码&#xff1a; 首先是isset看我们有没有传一个为空的值&#xff0c;如果为空就输出居然都不输入参数&#xff0c;可恶!!!!!!!!!不为空就GET传参赋值给$code &#xff0c;接着 如果 $code 中不包含这些模式中的任何一个&#x…

Flutter:启动屏逻辑处理02:启动页

启动屏启动之后&#xff0c;制作一个启动页面 新建splash&#xff1a;view 视图中只有一张图片sliding.png就是我们的启动图 import package:flutter/material.dart; import package:get/get.dart; import index.dart; class SplashPage extends GetView<SplashController…

系统思考—共同看见

在一家零售企业的项目中&#xff0c;团队频繁讨论客户流失的严重性&#xff0c;但每次讨论的结果都无法明确找出问题的根源。大家都知道客户流失了&#xff0c;但究竟是什么原因导致的&#xff0c;始终没有一致的答案。市场部认为是客户体验差&#xff0c;客服部门觉得是响应慢…

数据结构(Java版)第四期:ArrayLIst和顺序表(上)

目录 一、顺序表 1.1. 接口的实现 二、ArrayList简介 2.1. ArrayList的构造 2.2. ArrayList的常见操作 2.3. ArrayList的扩容机制 三、ArrayList的具体使用 3.1. 洗牌算法 3.2. 杨辉三角 一、顺序表 上一期我们讲到过&#xff0c;顺序表本质上和数组是差不多的&#…

Python编程语言中的优雅艺术:数值分隔符的巧妙运用

在Python编程的世界里&#xff0c;有许多精巧的设计让代码更优雅、更易读。今天要分享的是一个看似简单却能大幅提升代码可读性的特性 —— 数值分隔符。这个特性从Python 3.6版本开始引入&#xff0c;它用一种极其优雅的方式解决了大数值表示的难题。 数值分隔符的本质与应用…

心情追忆:构建支付模块的五个基本接口设计

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署。经过一个月的努力&#xff0c;通过群聊分享等方式&#xff0c;用…

实验三 z变换及离散时间LTI系统的z域分析

实验原理 有理函数z 变换的部分分式展开 【实例2-1】试用Matlab 命令对函数 X ( z ) 18 18 3 − 1 − 4 z − 2 − z − 3 X\left(z\right)\frac{18}{183^{-1} -4z^{-2} -z^{-3} } X(z)183−1−4z−2−z−318​ 进行部分分式展开&#xff0c;并求出其z 反变换。 B[18]; A…

Web登录页面设计

记录第一个前端界面&#xff0c;暑假期间写的&#xff0c;用了Lottie动画和canvas标签做动画&#xff0c;登录和注册也连接了数据库。 图片是从网上找的&#xff0c;如有侵权私信我删除&#xff0c;谢谢啦~

【es6】原生js在页面上画矩形及删除的实现方法

画一个矩形&#xff0c;可以选中高亮&#xff0c;删除自己效果的实现&#xff0c;后期会丰富下细节&#xff0c;拖动及拖动调整矩形大小 实现效果 代码实现 class Draw {constructor() {this.x 0this.y 0this.disX 0this.disY 0this.startX 0this.startY 0this.mouseDo…

高级 K8s 面试题(Advanced K8S Interview Questions)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

HiISP(一)

系列文章目录 文章目录 系列文章目录前言一、Hi3518EV200 芯片架构1.1. ARM子系统1.2. 图像子系统&#xff08;Image Subsystem&#xff09;1.3. 视频子系统&#xff08;Video Subsystem&#xff09;1.4. 存储与接口模块1.5. 通用功能模块1.6. DDR与总线1.7. 数据流1.7.1. 数据…

京东物流与亿纬锂能达成战略合作,双方跨界意义何在?

首先&#xff0c;这一合作有助于双方实现资源共享和优势互补。京东物流作为国内领先的物流服务商&#xff0c;拥有先进的物流技术和丰富的运营经验&#xff0c;能够为亿纬锂能提供高效、安全、可靠的物流服务。而亿纬锂能作为新能源领域的佼佼者&#xff0c;拥有先进的电池技术…

103.【C语言】数据结构之二叉树的三种递归遍历方式

目录 1.知识回顾 2.分析二叉树的三种遍历方式 1.总览 2.前序遍历 3.中序遍历 4.后序遍历 5.层序遍历 3.代码实现 1.准备工作 2.前序遍历函数PreOrder 测试结果 3.中序遍历函数InOrder 测试结果 4.后序遍历函数PostOrder 测试结果 4.底层分析 1.知识回顾 在99.…

【kafka03】消息队列与微服务之Kafka 读写数据

Kafka 读写数据 参考文档 Apache Kafka 常见命令 kafka-topics.sh #消息的管理命令 kafka-console-producer.sh #生产者的模拟命令 kafka-console-consumer.sh #消费者的模拟命令 创建 Topic 创建topic名为 chen&#xff0c;partitions(分区)为3&#xff0…

SAP开发语言ABAP开发入门

1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP&#xff08;Advanced Business Application Programming&#xff09;是SAP系统中的编程语言&#xff0c;主要用于开发企业级的业务应用程序&#xff0c;如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…