51单片机lcd1602显示时间日期

2023-05-16

实验内容:
      使用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 没按下的位依然为1
	key ^= 0xF0;					  //异或之后没按下的位转换为1,按下的位转换为0
	trg = 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~960us
	i=70;	
	while(i--);//延时642us
	DSPORT=1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
	i=0;
	while(DSPORT)	//等待DS18B20拉低总线
	{
		i++;
		if(i>5000)//等待>5MS
			return 0;//初始化失败	
	}
	return 1;//初始化成功
}

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

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

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

proteus文件下载 密码:guqw

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机lcd1602显示时间日期 的相关文章

  • VSCODE中运行C语言(从安装到运行详细版)

    VSCODE中运行C语言 xff08 从插件安装到运行详细版 xff09 一 下载安装MinGW w64 官方下载网站 xff1a MinGW 64 往下来进入下一张页面图 xff0c 选择要下载的文件 二 环境变量配置 按照上面的步骤全部
  • 【ubuntu16.04 LTS】ping百度通,但浏览器打不开百度网页

    典型的DNS配置问题 1 xff0c 执行如下命令 span class token function sudo span span class token function vi span etc resolv conf 在文件最后添加
  • VLAN类型

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是VLAN类型 一 基于端口的VLAN xff1a 基于端口的VLAN是最简单 最有效的VLAN划分方法 xff0c 它按照设备端口来定
  • STM32开发(三) 使用printf 重定位到串口输出|CSDN创作打卡

    上一篇 主目录 下一篇 文章目录 背景 KEIL MDK环境下printf重定位串口输出 第一步 在KEIL MDK中使用MicroLIB如图中勾选 第二步 STM32Cube MX异步配置 第三步 KEIL代码演示 代码使用Cube 注意
  • 总线(二)CAN通讯协议介绍

    文章目录 CAN xff08 Controller Area Network xff09 是什么 xff1f 总线拓扑图CAN特征CAN协议数据帧遥控帧遥控帧和数据帧相关 xff1f 仲裁优先级决定数据帧和遥控帧的优先级标准格式和扩展格式的
  • CAN 简介

    1 目的 本文主要介绍一部分 CAN 协议层 2 CAN 简介 这里的内容参考的是 1991 9 的 2 0 版本的官方 CAN 规格书 2 1 概述 CAN 控制器局域网 是一种串行通讯协议 xff0c 传输速度可达 1Mbit s 总线
  • I2C 简介

    1 I2C 简介 这里的内容参考的是 2014 4 4 的 V 6 版本的官方 I2C Bus 规格书 xff0c 第六章有给出相应的链接 1 1 引脚 I2C 一般而言是一种同步半双工的通信方式 xff0c 所以除了电源引脚之外 xff0
  • MPC5744 烧录一直停留在 98% 的解决方法

    1 目的 本人在调试一块主控为 MPC5744 的板子时 xff0c 有时候在烧录时 xff0c 发现烧录总是停在 98 xff0c 卡在 CRC 这里 xff0c 在查找和看资料之后 xff0c 发现了几种解决方法 xff1a 使用 pe
  • MPC5744 Data Flash 仿真 EEPROM

    一 目的 本文主要是使用 MPC5744 中的 Data Flash 仿真 EEPROM 之前在 MPC5744 烧录一直停留在 98 的解决方法 中也简单介绍了 Flash xff0c 所以在这里直接介绍仿真过程 xff0c 注意这里可以
  • Keil添加文件和头文件

    Keil如何添加文件 在工程文件夹下面新建一个 c和一个 h文件 xff0c c文件就是要添加的文件 xff0c h文件就是要添加的头文件 右键点击Project下面的第一个文件夹 点击Manage Project Items 是新建文件夹
  • linux下简单的Socket+Http服务

    C语言体验Socket Http服务 代码部分实验结果实验总结 代码部分 socket监听80端口 xff0c 接收到访问数据 xff0c 返回简单的Http页面 span class token macro property span c
  • 不定态与高阻态,及modelsim默认波形颜色的含义

    数字电路只有高低电平 xff0c 没有实际电平对应不定态和高阻态 xff0c X和Z更多的是用来表示设计者的意图或者用于仿真目的 xff0c 旨在告诉仿真器和综合器如何解释这段代码 X态 xff1a 常用于判断条件 xff0c 只在告诉综合
  • 【ubuntu16.04 LTS】设置屏幕分辨率

    第一种方式 直接打开系统设置 xff0c 选择屏幕分辨率即可 xff0c 和Windows一样 xff0c 不多说 第二种方式 如果在第一种方式中 xff0c 没有找到自己想要设置的分辨率的话 xff0c 可以按如下操作 xff1a 1 x
  • verilog中taskd的用法

    本文转载自博客园作者 xff08 id xff09 xff1a 再也不喝冰了 任务就是一段封装在 task endtask 之间的程序 任务是通过调用来执行的 xff0c 而且只有 在调用时才执行 xff0c 如果定义了任务 xff0c 但
  • Github 安装和上手记录

    1 Git xff1a 分布式版本控制软件 xff08 本地含有版本库 xff09 2 安装 xff1a msysgit github io gt 3 Download gt 安装 4 安装时除了其中一步需要选择 use git from
  • Verilog02:结构化建模

    结构化描述是用Verilog HDL 进行电路设计中最基本描述方式 对于系统级电路设计 xff0c 为了把不同的功能模块有层次地组合在一起 xff0c 主要是采用模块调用的结构化建模方式实现 根据所调用子模块的不同抽象级别 xff0c 可将
  • 有无符号数及原码反码补码之间的关系

    前提知识 xff1a 加法器比减法器的电路实现方式更简单 无符号数表示的数值范围大于0 为了简化电路设计 xff0c 引入有符号数可以表示负数 xff0c 便可以用加法器实现减法运算 使用加法器和原码进行减法运算会产生错误结果 引入反码来修
  • MIPS指令格式定义

  • PTA 浙大版《C语言程序设计(第3版)》题目集--练习2-1 Programming in C is fun!

    题目 本题要求编写程序 xff0c 输出一个短句 Programming in C is fun 输入格式 本题目没有输入 输出格式 在一行中输出短句 Programming in C is fun 思路 一个简单的输出 代码 includ
  • 带参数的宏

    定义两个带参数的宏 xff0c 一个用来求s xff0c 另一个用来求area include lt iostream gt using namespace std define s a b c a 43 b 43 c 2 define A

随机推荐

  • RTK和网络RTK

    浅谈传统RTK工作模式与网络RTK工作模式 谈谈传统RTK工作模式与网络RTK工作模式 传统RTK工作模式就是电台工作模式 xff0c 网络RTK工作模式就是CORS系统测量 本文主旨 有网络信号和CORS覆盖范围的地方就选择网络RTK工作
  • KITTI数据集国内下载地址

    文件列表 xff1a http www functionweb tk kitti 如果遭遇下载失败的情况请访问 https blog csdn net weixin 43599336 article details 87801040 原始图
  • HTTP ERROR 405 Method Not Allowed

    一般访问web UI的时候出现以上错误 xff0c 都是浏览器的防火墙问题 可以进行在安全设置里取消一些防护功能即可
  • 【ubuntu16.04 LTS】更换国内清华源

    目录 1 xff0c 备份原始源文件sources list2 xff0c 修改源文件sources list3 xff0c 更新源 1 xff0c 备份原始源文件sources list 在终端输入如下命令 xff1a span clas
  • 串行通信——异步串行通信

    目录 I 串口通信简介 一 定义 二 意义 三 分类 II 异步串行通信详解 一 数据格式 1 起始位 2 数据位 3 奇偶校验位 4 停止位 二 通信制式 1 单工 2 半双工 3 全双工 三 通信速率 I 串口通信简介 一 定义 在一条
  • shell发送请求解析结果

    需求shell发送请求到服务获取返回结果 xff0c 解析结果后提取需要的数据 再次请求服务 1 发送get请求到服务器 xff0c 格式化返回结果输出到result json文件 2 解析json文件并循环处理解析结果 curl命令 X
  • VScode编辑器快捷键整理

    记录 xff1a VScode编辑器快捷键记录 1 代码块折叠 展开 操作光标所在文件中的所有代码块 xff1a 折叠所有 Ctrl 43 K 43 0 展开所有 Ctrl 43 K 43 J 仅仅操作光标所处代码块内的代码 xff1a 折
  • ROS不同版本消息传递问题

    ROS不同版本消息传递问题 问题 不同版本ros间可通信 xff0c 但消息发送接收有问题 主机 xff1a x86 BECKHOFF Ubuntu16 04 ROS Kinetic 从机 xff1a ARM AGX Xavier Ubun
  • 复位电路

    单片机复位电路 系统开始运行和重新启动都是依靠复位电路实现的 以MCS 51为例 xff0c 复位是需要在RST引脚加上2个机器周期 xff08 24个时钟周期 xff09 以上的高电平 简单的计算 xff1a 如果单片机的时钟频率是12M
  • WIFI原理

    1 路由器向下提供给接入的用户一个id xff0c 也就是类似于192 168 1 231 xff0c 这样的ip地址 xff0c 所有在这个路由器下的用户的ip地址的前面的网络号是相同的 xff0c 都是192 168 1 xff08 x
  • :: 在 C++ 中的作用

    一 作用域符号 xff1a 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 另外 xff0c 在类外定义类中已申明的函数成员时 x
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • 基于stm32的mpu6050传感器实验

    64 TOCMPU6050 43 STM32学习笔记 学习了差不多两天的mpu6050 xff0c 参考了很多篇博客还有看一些资料 xff0c 今晚终于把这个东西在我的串口显示出来了 xff0c 下面就废话不多说 xff0c 开始我的笔记啦
  • Ubuntu 20.04 ROS Noetic及Realsense-ROS的安装和多机通信

    Ubuntu 20 04 ROS Noetic及Realsense ROS的安装和多机通信 1 Ubuntu20 04 ROS Noetic安装 参考官方安装教程 ROS Installation 请以以上安装步骤为准 xff0c 因为随着
  • 机械硬盘基本知识

    硬盘内部的物理结构很复杂 xff0c 只能从大的颗粒度去看内部的结构 xff0c 总体来说 xff0c 硬盘结构包括 xff1a 盘片 磁头 盘片主轴 控制电机 磁头控制器 数据转换器 接口 缓存 等几个部份 所有的盘片 xff08 一般硬
  • RTK八大基础知识

    RTK作为现代化测量中的测绘仪器 xff0c 已经非常普及 RTK在测量中的优越性也是不言而喻 为了能让RTK的优越性能在使用中充分的发挥出来 xff0c 为了能让RTK使用人员能灵活的应用RTK xff0c 我认为RTK使用人员必须了解以
  • 游戏思考04:网络游戏同步算法产生原因和相关介绍:跟随(插值)、预测、延迟补偿,三种算法(未完待续02/07)

    文章目录 一 网络同步的典型场景二 简单粗暴的数据同步为何行不通 xff1f xff08 帧同步的难题 xff09 1 xff09 网络同步的流程2 xff09 网络延迟和抖动的直观解释3 xff09 产生卡顿 瞬移的原因分析4 xff09
  • 51单片机定时器实现流水灯实验

    实验内容 xff1a 利用AT89C51的定时器0 方式1实现流水灯效果 xff0c 并用仿真验证 定时器0方式1的工作方式 xff1a 定时器的工作方式选择由寄存器TMOD控制 方式选择通过M0和M1控制 xff0c 方式1为16位定时器
  • 51单片机七段数码管显示时钟无按键控制—①—74HC595版

    参考链接 xff1a 51单片机七段数码管显示时钟加按键控制 74HC595版 51单片机七段数码管显示时钟加按键控制 74HC595版 文章目录 一 实验内容 xff1a 二 实验分析 xff1a 三 仿真图 xff1a 四 源代码 xf
  • 51单片机lcd1602显示时间日期

    实验内容 xff1a 使用51单片机控制LCD1602液晶显示屏显示 时间 日期 星期 温度 信息 xff0c 并可通过按键设置值 仿真效果展示 xff1a proteus仿真图 xff1a 硬件测试图 xff1a 说明 xff1a 硬件测