51单片机lcd1602显示时间日期

article/2025/9/30 15:09:51

实验内容:
      使用51单片机控制LCD1602液晶显示屏显示 时间/日期/星期/温度 信息,并可通过按键设置值。

仿真效果展示:
在这里插入图片描述
proteus仿真图:
在这里插入图片描述

硬件测试图:
在这里插入图片描述
说明:
硬件测试按键使用左侧的四个独立按键
key1-设置键(选设置位)
key2:加一
key3:减一
key4:切换到日期/时间


主要硬件:

  1. AT89C51主控芯片
  2. LM016L/LCD1602 液晶显示模块
  3. RESPACK-8 排阻
  4. DS18B20 温度传感器
  5. BUTTON 按键

注:LM016L和LCD1602 原理是一样的,用法也相同。只是protues中lm0161没有显示调节亮度的那两个端口


对比
在这里插入图片描述
此次代码采用模块化的方式,硬件初始化和相关代码单独封装在一个文件中,使用时将其包含就好。


项目结构如图:
在这里插入图片描述


列出几个比较重要的函数:
主函数:

#include <reg52.h>
#include "LM016L.h"
#include "Timer.h"
#include "Data.h"
#include "Button.h"
#include "temp.h"/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数 程序入口
* 参数			 :无
*******************************************************************************/
void main()
{LcdInitiate();	//液晶屏初始化TimerInit();   	//定时器初始化
//	Ds18b20Init();	//温度传感器不在这里初始化,在每次温度转化时和读取温度时都要初始化while(1){KeyScan();				//按键检测button_setting();		//按键 设置处理button_up_down();		//按键 加一/减一 处理ButtonSwitchDT();		//按键 切换时间/日期 处理//想显示哪个就显示哪个,不想要的可以注释掉TimerShow();			//时间显示	 星期显示在时间里DataShow();			//日期显示Lcd_Tem_Display(Ds18b20ReadTemp());	//温度显示}	
}

定时器中断函数:

/*******************************************************************************
* 函 数 名         : Timer0()
* 函数功能		   : 定时器0中断函数
* 参数			   :无
*******************************************************************************/		
void Timer0() interrupt 1
{TH0=0x4C;TL0=0x00;i++;//使得setting_flag 0.2秒转换一次if(i%10<5){blink_flag = 0;}if(i%10>=5){blink_flag = 1;}if(i==20)//20个50毫秒即一秒{i=0;if(button_num1==0){num1++;}if(num1==60){num1=0;num2++;if(num2==60)//定时一小时自动清零{num2=0;num3++;if(num3==24){num3=0;day++; 		//一天过去星期加一	weekday++;if(weekday==8){weekday=1;}//日期处理DataDeal1();	//一天过去年月日相应变化}}	}}		
}/*******************************************************************************
* 函 数 名       : DataDeal1
* 函数功能		 : 日期处理函数,计算日期的当前的日期值
* 参数			 :无
*******************************************************************************/
void DataDeal1()
{if(day>=30)		//默认一个月30天{month++;day=1;if(month>=13){month = 1;year2++;if(year2>=100){year2 = 0;	//由于年数太大后int型变量无法存储,使用两个变量存储高两位和低两位year1++;if(year1>=100){year1=0;}}}			}
}

按键处理函数:

/***********************************************************
*函数名		:KeyScan
*功能		: 按键扫描,返回按下的按键对应的位,并防止连按
*返回值		:返回按键按下的位置
*参数		:无
************************************************************/
char KeyScan() 
{static unsigned char klast = 0;	  //记录上一次的按键值unsigned char trg = 0,key = 0;		  //trg:得到的返回值,返回值中8位只有一位为1,为1的位代表按下的位,其余位为零key = P2 & 0xF0;				  //将按下的位转换为0 没按下的位依然为1key ^= 0xF0;					  //异或之后没按下的位转换为1,按下的位转换为0trg = key & (key ^ klast);		  //这句是最关键的一句,需要自己理解klast = key;button_flag = trg;return trg;	  						//最终返回值是按下哪个按键,返回值对应就是1,没按对应的就是0  eg:按下button3 则返回0x01 0000 0100
}

温度传感器初始化函数:

/*******************************************************************************
* 函数名         : Ds18b20Init
* 函数功能		   : 初始化
* 输入           : 无
* 输出         	 : 初始化成功返回1,失败返回0
*******************************************************************************/
unsigned char Ds18b20Init()
{unsigned int i;DSPORT=0;			 //将总线拉低480us~960usi=70;	while(i--);//延时642usDSPORT=1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低i=0;while(DSPORT)	//等待DS18B20拉低总线{i++;if(i>5000)//等待>5MSreturn 0;//初始化失败	}return 1;//初始化成功
}

这里需要注意的一点是,温度传感器并不需要一直转换温度,读取温度。而是在需要温度的时候再去初始化一下(转化和读取时),如果只在最开始初始化,转化时没有初始化则无法读取温度值。具体请看项目源码。

完整项目下载地址:
[仿真版源码] (https://github.com/Little-Water-Bottle/LCD1602ShowDataAndTime)
(补充链接:仿真版源码 密码:7jdc)

51普中开发板源码 密码:aeg3

proteus文件下载 密码:guqw

参考资料下载(!):
LCD和DS18B20参考资料 密码:64l7

排版真的是垃圾,算了记录一下就行了。。


http://chatgpt.dhexx.cn/article/qp6J6oET.shtml

相关文章

计算机怎么在桌面显示时间,怎么设置使电脑即显示时间有显示日期

怎么设置使电脑即显示时间有显示日期以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 怎么设置使电脑即显示时间有显示日期 单击“开始→控制面板区域和语言选项”,在“区域选项”选项卡中单击“自定义”按钮打开…

1.Vue显示实时时间

实时显示时间&#xff0c;代码如下&#xff1a; <div id"app">{{date}}</div><script>var appnew Vue({el:"#app",data:{date:new Date()},mounted:function(){var _thisthis;this.timersetInterval(function(){_this.datenew Date();}…

Linux、Oracle、MySQL命令提示符显示时间

前言&#xff1a;测试环境Oracle DG开启了FLASHBACK有遇到过to timestamp的恢复场景&#xff0c;因为这个问题有了在sqlplus命令提示符前显示时间的需求&#xff0c;顺着也了解了下怎么在Linux、MySQL命令提示符前显示时间。 1. Linux命令提示符显示时间 PS1是Linux终端用户的一…

Linux命令之显示日期时间date

概述 date 可以用来显示或设定系统的日期与时间。 语法 该命令的语法如下&#xff1a; date [选项] [日期时间格式]该命令支持的选项有&#xff1a; 选项说明-d <时间字符串>显示指定的“时间字符串”表示的时间&#xff0c;而非当前时间。注意用双引号把字符串引起…

Java之Redis分片机制

1. Redis分片机制 1.1 分片机制说明 前提说明: redis可以通过修改内存的大小 实现数据的保存.但是内存的资源不易设置的过大,因为很多的时间都浪费在内存的寻址中. 需求: 如果有海量的数据,需要redis存储 问:应该如何处理? 解决方案: 可以采用Redis分片机制 实现内存数据的扩…

Redis分片+Redis哨兵

Redis分片机制 Redis分片前提:Redis可以通过修改内存的大小实现数据的保存,但是不能设置的过大 解决方案:可以采用Redis分片机制来实现内存数据的扩容,使用Redis分片的主要目的就是为了内存扩容,解决海量数据的存储问题 Redis每个分片内的数据都是不相同的 Redis分片搭建步骤…

flea-cache使用之Redis分片模式接入

Redis分片模式接入 1. 参考2. 依赖3. 基础接入3.1 定义Flea缓存接口3.2 定义抽象Flea缓存类3.3 定义Redis客户端接口类3.4 定义Redis客户端命令行3.5 定义分片模式Redis客户端实现类3.6 定义Redis分片连接池3.7 Redis配置文件3.8 定义Redis Flea缓存类3.9 定义抽象Flea缓存管理…

java如何实现redis分片存储_Redis的分片机制

前言:大家都知道redis单台的默认内存大小一般是10M.如果现在需要我们将1G的数据保存到内存中。这该如何做到呢?比如我们就用单台redis,但是一味的扩大单台redis内存则直接影响执行的效率,会有一种得不偿失的感觉。于是呢,我们就得采用分片策略实现数据保存,通过多台redis…

Redis分片的实现

1.为什么使用分片 1.1 说明: 虽然redis可以扩展内存空间的大小,但是如果需要存储海量的数据,一味地去扩大内存,其实效率不高. 1.2 分片的介绍 准备多台redis,共同为用户提供缓存服务,在保证效率的前提下,实现了内存的扩容. 用户在使用分片机制时,将多台redis当做一个整体来…

使用DockerCompose部署Redis分片集群——整合SpringBoot

今天来记录一下使用DockerCompose部署Redis分片集群的过程&#xff0c;前面写了几篇关于redis的博客了&#xff0c;这里就不再过多介绍了&#xff0c;直接上配置就好了 version: "3.0"services:redisServer1:image: redis:6.2.4container_name: redis_server1volume…

redis之分片集群

写在前面 当redis单实例存储的数据过多时&#xff0c;比如说20G&#xff0c;就会出现因为生成RDB快照较长时间比如500ms阻塞主线程的问题&#xff0c;在这一段时间里&#xff0c;因为主线程被阻塞&#xff0c;所以Redis实例无法正常的对外提供服务&#xff0c;出现这个问题的原…

Redis分片集群(详解+图)

目录 分片集群特征&#xff1a; 散列插槽 集群伸缩 创建新的redis实例 添加新节点到redis 转移插槽 故障转移 自动故障转移 手动故障转移 RedisTemplate访问分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决&#xff1a; 海量数据存储问…

redis分片_Redis分片

redis分片 本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0…

(分布式缓存)Redis分片集群

对应的教程视频: 高级篇Day3-04-Redis分片集群_哔哩哔哩_bilibili 一.搭建分片集群 1.集群结构 分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff…

Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)

文章目录 一、要求&#xff1a;二、知识总结缓存雪崩解决方案 docker中redis分片集群搭建配置好配置文件redis-6380.confredis-6381.confredis-6382.confredis-6383.confredis-6384.confredis-6385.conf 将conf_cluster文件夹移动到对应位置docker中运行对应的redis容器docker中…

Redis分片入门案例

说明 由多台redis共同处理用户的业务数据&#xff0c;实现了redis内存数据的动态扩容&#xff0c;称之为分片机制。 特点 多态redis当作一台使用 分片搭建 1、在redis工作目录下创建工作目录 [rootlocalhost redis]# mkdir shards2、把redis配置文件复制到指定目录下 3、…

分布式缓存-Redis分片集群

一、分片集群结构 主从和哨兵可以解决高可用、高并发读的问题&#xff0c;但是依然有两个问题没有解决&#xff1a; 海量数据存储问题高并发写的问题 使用分片集群可以解决上述问题&#xff0c;分片集群特征&#xff1a; 集群中有多个 master&#xff0c;每个 master 保存不…

SpringBoot整合Redis分片

1 编辑分片配置文件 #redis.host192.168.126.129 #redis.port6379 redis.nodes192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:63812 编辑配置类实现redis整合 Configuration //我是一个配置类 一般都会与Bean联用 PropertySource("classpath:/properti…

Redis搭建分片集群

一、什么是Redis分片集群 1、概念 Redis分片集群是用于将Redis的数据分布在多个Redis节点上的分布式系统。通过分片集群&#xff0c;可以将数据分成多个部分&#xff0c;并将每个部分存储在不同的节点上&#xff0c;以便实现Redis的高可用性和高性能。 2、Redis分片集群原理…

Docker下搭建Redis分片集群

分片集群结构 同一台虚拟机中开启6个redis实例&#xff0c;模拟分片集群 IP PORT角色192.168.19.1287001master192.168.19.1287002master192.168.19.1287003master192.168.19.1288001slave192.168.19.1288002slave192.168.19.1288003slave 搭建Redis分片集群 创建实例目录 …