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 int
	
unsigned 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;          //波特率是9600bps
	TL1=0xFD;
	TR1=1;			   //开启定时器
	TI=1;
	EA=1;
}


void main()
{
	init_com();
	 Lcd_Initial();     //LCD初始化
	 Lcd_Display_On();	//启动屏幕
	 DS1302_Init();									//初始化DS1302
    while(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

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

点击下载百度网盘资料

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算的计算包括哪些内容

‌云计算的计算主要包括以下几种类型‌&#xff1a; ‌分布式计算‌&#xff1a;分布式计算是一种计算方法&#xff0c;它将大型问题分解成多个小任务&#xff0c;然后分配给多个计算机进行处理。这种方法可以提高计算效率和可靠性‌1。‌并行计算‌&#xff1a;并行计算是同时…

PICO 获取设备号 SN码

Unity版本 2020.3.42f1c1PICO SDK版本PICO Unity Integration SDK-3.0.5-20241105Pico设备pico 4ultra 注意 此api暂时只测试企业版本 pico 4ultra 代码 using Unity.XR.PICO.TOBSupport;private void Awake() {bool result PXR_Enterprise.InitEnterpriseService();Debug.L…

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/&#xff0c;这个就是将论文中的内容或者补充视频放到一个网页上&#xff0c;以更好的展示他们的工作。因此&#xff0c;这里介绍下如何使用前人提供的模板制作我…

圆域函数的傅里叶变换和傅里叶逆变换

空域圆域函数的傅里叶变换 空域圆域函数&#xff08;也称为空间中的圆形区域函数&#xff09;通常指的是在二维空间中&#xff0c;以原点为中心、半径为 a a a的圆内取值为1&#xff0c;圆外取值为0的函数。这种函数可以表示为&#xff1a; f ( x , y ) { 1 if x 2 y 2 ≤ …

云技术-docker

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

win10中使用ffmpeg的filter滤镜

1 给视频加文字水印 1.1 添加播放时间 ffmpeg -i input.mp4 -vf "drawtextfontfileC\\:/Windows/fonts/consola.ttf:fontsize30:fontcolorwhite:timecode00\:00\:00\:00:rate25:textTCR\::boxcolor0x000000AA:box1:x20:y20" -y output.mp4 在视频的x20:y20位置添加t…

MyBatis事务管理-附案例代码

一、MyBatis事务管理 SqlSession对象 getMapper(DAO.class)&#xff1a;获取Mapper&#xff08;DAO接口的实体类&#xff09;事务管理 1.1 手动提交事务 手动事务管理 当我们获取sqlSession对象时&#xff0c;就默认开启了事务; 当一系列业务操作完成之后&#xff0c;我们需要…

QChart数据可视化

目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …

互联网视频推拉流EasyDSS视频直播点播平台视频转码有哪些技术特点和应用?

视频转码本质上是一个先解码再编码的过程。在转码过程中&#xff0c;原始视频码流首先被解码成原始图像数据&#xff0c;然后再根据目标编码标准、分辨率、帧率、码率等参数重新进行编码。这样&#xff0c;转换前后的码流可能遵循相同的视频编码标准&#xff0c;也可能不遵循。…

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一…

使用phpStudy小皮面板模拟后端服务器,搭建H5网站运行生产环境

一.下载安装小皮 小皮面板官网下载网址&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; 安装说明&#xff08;特别注意&#xff09; 1. 安装路径不能包含“中文”或者“空格”&#xff0c;否则会报错&#xff08;例如错误提示&#xff1a;Cant cha…

No.1 杀戮尖塔Godot复刻|项目概述|场景设置

项目概述 含有47个脚本文件&#xff0c;包括1185行代码&#xff0c;最长的脚本有111行 Battle Node——战斗节点 start_battle()——开始战斗turn management——管理回合win/lose conditions——识别输赢条件 EnemyHandler——敌人处理程序 enemy turn management——管理…

化工专业如何转软工

在当今数字化时代&#xff0c;跨考软件工程已经成为许多理工科学子的一个重要选择。化工专业的同学有着扎实的理工科基础&#xff0c;尤其是数学功底&#xff0c;这对于转向计算机领域是一个天然的优势。让我们详细探讨如何规划这段跨考之路。 编程语言的选择是入门的第一步。…

《Opencv》基础操作<1>

目录 一、Opencv简介 主要特点&#xff1a; 应用领域&#xff1a; 二、基础操作 1、模块导入 2、图片的读取和显示 &#xff08;1&#xff09;、读取 &#xff08;2&#xff09;、显示 3、 图片的保存 4、获取图像的基本属性 5、图像转灰度图 6、图像的截取 7、图…

论文阅读:A Software Platform for Manipulating theCamera Imaging Pipeline

论文代码开源链接&#xff1a; A Software Platform for Manipulating the Camera Imaging Pipelinehttps://karaimer.github.io/camera-pipeline/摘要&#xff1a;论文提出了一个Pipline软件平台&#xff0c;可以方便地访问相机成像Pipline的每个阶段。该软件允许修改单个模块…

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表…

音视频-什么是帧,视频为什么要编码

帧就是动画中的一张图片&#xff0c;这相当于电影胶片上的一个镜头&#xff0c;一帧就是一幅静止的画面&#xff0c;连续的帧就形成了我们看到的动画和视频。 但是直接采集后没经过处理的视频&#xff0c;其实是没有办法真正在互联网上进行传输的。以一张1920乘1080的图片为例&…

“蜀道山”高校联合公益赛 Web (部分)

文章目录 奶龙牌WAF海关警察训练平台恶意代码检测器 奶龙牌WAF <?php if ($_SERVER[REQUEST_METHOD] POST && isset($_FILES[upload_file])) {$file $_FILES[upload_file];if ($file[error] UPLOAD_ERR_OK) {$name isset($_GET[name]) ? $_GET[name] : basen…

【JavaEE初阶 — 网络原理】初识网络原理

目录 1. 网络发展史 1.1 独立模式 1.2 网络互连 1.2.1 网络互联的背景 1.2.2 网络互联的定义 1.3 局域网LAN 1.4 广域网WAN 2. 网络通信基础 2.1 IP地址 2.2 端口号 2.3 认识协议 2.4 五元组 2.5 协议分层 2.5.1 分…

Linux的介绍及虚拟机centOS系统的下载与应用

1、什么是Linux Linux 是一种类 Unix 操作系统&#xff0c;它的内核&#xff08;Kernel&#xff09;由 Linus Torvalds 于 1991 年首次发布。作为一个开源、免费的操作系统&#xff0c;Linux 被广泛用于服务器、桌面计算机、嵌入式设备、移动设备等各种场景。 1、操作系统 操…