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.mzph.cn/news/888060.shtml

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

相关文章

如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间

如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间 一、前言二、准备工作三、扩展逻辑卷1. 检查现有 LVM 配置2. 扩展物理卷3. 扩展卷组4. 扩展逻辑卷四、调整文件系统大小1. 检查文件系统状态2. 扩展文件系统五、处理可能出现的问题1. 文件系统无法扩展2. 磁盘空间不足3…

Redis 分布式锁实现方案

一、概述 分布式锁&#xff0c;即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题&#xff0c;而分布式锁&#xff0c;就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&#xff0c;分布式系统中竞争共享资源的最小粒度从线程升级…

前端node.js

一.什么是node.js 官网解释:Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 二.初步使用node.js 需要区分开的是node.js和javascript互通的只有console和定时器两个API. 三.Buffer Buffer 是一个类似于数组的 对象&#xff0c;用于表示固定长度的字节序列。Buffer…

构造函数与析构函数错题汇总

构造函数不能定义返回类型&#xff0c;也没有返回类型。 堆、栈、静态存储区。栈上的对象main函数结束就释放&#xff0c;堆上的需要手动释放&#xff0c;静态存储区的在所在作用域的程序结束时释放。这里static在main函数内&#xff0c;是局部变量&#xff0c;所以作用域为…

SQL基础入门——SQL基础语法

1. 数据库、表、列的创建与管理 在SQL中&#xff0c;数据库是一个数据的集合&#xff0c;包含了多个表、视图、索引、存储过程等对象。每个表由若干列&#xff08;字段&#xff09;组成&#xff0c;表中的数据行代表记录。管理数据库和表的结构是SQL的基础操作。 1.1 创建数据…

亚马逊自研大语言模型 Olympus 即将亮相,或将在 LLM 竞赛中掀起新波澜

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

自然语言处理期末试题汇总

建议自己做&#xff0c;写完再来对答案。答案可能存在极小部分错误&#xff0c;不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …

深度学习——激活函数

一、人工神经元 1.1 构建人工神经元 人工神经元接受多个输入信息&#xff0c;对它们进行加权求和&#xff0c;再经过激活函数处理&#xff0c;最后将这个结果输出。 1.2 组成部分 输入&#xff08;Inputs&#xff09;: 代表输入数据&#xff0c;通常用向量表示&#xff0c;每…

新型大语言模型的预训练与后训练范式,Meta的Llama 3.1语言模型

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…

[js] 函数柯里化

面试题&#xff1a;实现一个add方法&#xff0c;使计算结果能够满足如下预期&#xff1a; add(1)(2)(3) 6; add(1, 2, 3)(4) 10; add(1)(2)(3)(4)(5) 15; // 保存不定长参数 let nums []; function add(...args) { // 往数组中插入不定长参数nums.push(...args)// 判断参数…

git rebase-优雅合并与修改提交

文章目录 简介rebase用于合并使用rebase修改提交cherry-pick 简介 在Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)中我们已经介绍了git的最常用实用的命令。 在上面说的那篇文章中&#xff0c;我们只是简单提了一下rebase。 是因为r…

音视频流媒体直播/点播系统EasyDSS互联网视频云平台介绍

随着互联网技术的飞速发展&#xff0c;音视频流媒体直播已成为现代社会信息传递与娱乐消费的重要组成部分。在这样的背景下&#xff0c;EasyDSS互联网视频云平台应运而生&#xff0c;它以高效、稳定、便捷的特性&#xff0c;为音视频流媒体直播领域带来了全新的解决方案。 1、产…

HarmonyOS4+NEXT星河版入门与项目实战(22)------动画(属性动画与显示动画)

文章目录 1、属性动画图解2、案例实现-小鱼移动游戏1、代码实现2、代码解释3、资源图片4、实现效果3、显示动画4、案例修改-显示动画5、总结1、属性动画图解 这里我们用一张完整的图来汇整属性动画的用法格式和使用的主要属性范围,如下所示: 2、案例实现-小鱼移动游戏 1、代…

基于大数据python 豆果美食推荐数据可视化系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 很对人不知道选题怎么选 不清楚自己适合做哪块内容 都可以免费来问我 避免后期給自己答辩找麻烦 增加难度&#xff08;部分学校只有一次答辩机会 没弄好就延迟…

坐标系变换

1 Clark变换 三相对称电压表达式为&#xff1a; 将三相电压用相量的形式表达出来&#xff0c;并用欧拉公式&#xff08;eix(cosxisinx)&#xff09;写成三角函数的形式&#xff1a; 同时&#xff0c;三相电压矢量空间合成向量可表示为&#xff1a; 三相电压合成矢量幅值为相电…

008静态路由-特定主机路由

按照如上配置&#xff0c;用192.168.0.1 电脑ping 192.168.1.1 发现能够ping通 用192.168.0.1 电脑ping 192.168.2.1 发现不能ping通 这是因为192.168.0.1 和 192.168.1.1 使用的是同一个路由器R1。 192.168.0.1 和 192.168.2.1 通信需要先经过R1&#xff0c;再经过R2 &#xf…

用c语言完成俄罗斯方块小游戏

用c语言完成俄罗斯方块小游戏 这估计是你在编程学习过程中的第一个小游戏开发&#xff0c;怎么说呢&#xff0c;在这里只针对刚学程序设计的学生&#xff0c;就是说刚接触C语言没多久&#xff0c;有一点功底的学生看看&#xff0c;简陋的代码&#xff0c;简陋的实现&#xff0…

数据迁移调研

需求背景&#xff1a;在项目迭代过程中&#xff0c;需要将一个数据库的数据迁移到另外一个数据库&#xff0c;包括分库分表的mysql数据库的数据异构到ES&#xff0c;来支持大数据量的查询&#xff0c;以及从一个Mysql数据库迁移到另外一个Mysql数据库的操作。多个业务的数据在一…

深度学习:梯度下降法

损失函数 L&#xff1a;衡量单一训练样例的效果。 成本函数 J&#xff1a;用于衡量 w 和 b 的效果。 如何使用梯度下降法来训练或学习训练集上的参数w和b &#xff1f; 成本函数J是参数w和b的函数&#xff0c;它被定义为平均值&#xff1b; 损失函数L可以衡量你的算法效果&a…

python基础(二)

函数 函数定义 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一或相关联功能的代码段。 python函数定义规则&#xff1a; def my_max(a,b): #定义函数用def关键字开头&#xff0c;函数名-》my_max ()定义参数 if a>b: #函数体以&#xff1a…