51单片机STC89C52RC——6.3 定时器/计数器 实现计时功能(定时器+中断系统+LCD1602液晶显示器)

news2024/11/27 4:24:48

目录

目的/效果

一,STC单片机模块

二,定时器+ 中断系统+LCD1602显示

三,创建Keil项目

四,代码 

五,代码编译、下载到51单片机


目的/效果

 用定时器实现系统中断,计时信息显示在LCD1602上。效果如下

一,STC单片机模块

二,定时器+ 中断系统+LCD1602显示

《51单片机STC89C52RC——5.1 LCD1602液晶显示屏》

《51单片机STC89C52RC——6.1 中断系统-CSDN博客》

《51单片机STC89C52RC——6.2 定时器-CSDN博客》

时分秒代码逻辑

        Secound++;
		if(Secound==60)
		{
			Secound=0;//秒清零
			Minute++;
			if(Minute==60)
			{
				Minute=0;//分钟清零
				Hour++;
				if(Hour==24)
				{
					Hour=0;//小时清零
				}
			}
		}	

三,创建Keil项目

详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客

四,代码 

main.c 

#include <REGX52.H> 
#include "LCD1602.h"
/*宏定义定时器的初始值  这里控制1毫秒1次中断*/
#define TIMS (65536-12000000/12/1000) 

/*定义时分秒变量*/
unsigned Hour=23,Minute=59,Secound=55,count=1000;
void Timer0_Init()
{
	TMOD=0x01;	//设置模式1	
	TL0=TIMS;	//设置定时器的低8位
	TH0=TIMS>>8;//设置定时器的高8位
	TR0=1;		//让定时器开始运行
	ET0=1;		//允许定时器发生中断溢出
	EA=1;		//打开全局中断
}
void main()
{ 
	Timer0_Init();	//定时器初始化
	LCD_Init();		//LCD1602初始化
	LCD_ShowString(1,1,"Timer");
	LCD_ShowString(2,1,"  :  :  ");
	while(1)
	{
		LCD_ShowNum(2,1,Hour,2);
		LCD_ShowNum(2,4,Minute,2);
		LCD_ShowNum(2,7,Secound,2);
	}
} 

/**
 * 函    数:中断函数
 * 参    数:无
 * 返 回 值:无
 */
void interrupt_1() interrupt 1 
{
	TL0=TIMS;	//设置定时器的低8位
	TH0=TIMS>>8;//设置定时器的高8位	
	if(count--==0)
	{
		count=1000;
		Secound++;
		if(Secound==60)
		{
			Secound=0;//秒清零
			Minute++;
			if(Minute==60)
			{
				Minute=0;//分钟清零
				Hour++;
				if(Hour==24)
				{
					Hour=0;//小时清零
				}
			}
		}		
	}	
}

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__

//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

#endif

LCD1602.c

#include <REGX52.H>

//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0

/**
 * 函    数:LCD1602延时函数,12MHz调用可延时1ms
 * 参    数:无
 * 返 回 值:无
 */
void LCD_Delay()
{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}
/**
 * 函    数:LCD1602写命令
 * 参    数:Command 要写入的命令
 * 返 回 值:无
 */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}
/**
 * 函    数:LCD1602写数据
 * 参    数:Data 要写入的数据
 * 返 回 值:无
 */
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;
	LCD_RW=0;
	LCD_DataPort=Data;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}
/**
 * 函    数:LCD1602设置光标位置
 * 参    数:Line 行位置,范围:1~2
 * 返 回 值:Column 列位置,范围:1~16
 */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));
	}
}
/**
 * 函    数:LCD1602初始化函数
 * 参    数:无
 * 返 回 值:无
 */
void LCD_Init()
{
	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
	LCD_WriteCommand(0x01);//光标复位,清屏
}
/**
 * 函    数:在LCD1602指定位置上显示一个字符
 * 参    数:	Line 行位置,范围:1~2,
 *				Column 列位置,范围:1~16,
 *				Char 要显示的字符
 * 返 回 值:无
 */
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}
/**
 * 函    数:在LCD1602指定位置开始显示所给字符串
 * 参    数:	Line 起始行位置,范围:1~2,
 * 				Column 起始列位置,范围:1~16,
 *				String 要显示的字符串
 * 返 回 值:无
 */
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++)
	{
		LCD_WriteData(String[i]);
	}
}
/**
 * 函    数:返回值=X的Y次方
 * 参    数:X底数,Y指数
 * 返 回 值:X的Y次方
 */
int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}
/**
 * 函    数:在LCD1602指定位置开始显示所给数字
 * 参    数:	Line 起始行位置,范围:1~2
 *				Column 起始列位置,范围:1~16
 *				Number 要显示的数字,范围:0~65535
 *				Length 要显示数字的长度,范围:1~5
 * 返 回 值:无
 */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
	}
}
/**
 * 函    数:在LCD1602指定位置开始以有符号十进制显示所给数字
 * 参    数:	Line 起始行位置,范围:1~2
 *				Column 起始列位置,范围:1~16
 *				Number 要显示的数字,范围:-32768~32767
 *				Length 要显示数字的长度,范围:1~5
 * 返 回 值:无
 */
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
	unsigned char i;
	unsigned int Number1;
	LCD_SetCursor(Line,Column);
	if(Number>=0)
	{
		LCD_WriteData('+');
		Number1=Number;
	}
	else
	{
		LCD_WriteData('-');
		Number1=-Number;
	}
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
	}
}
/**
 * 函    数:在LCD1602指定位置开始以十六进制显示所给数字
 * 参    数:	Line 起始行位置,范围:1~2
 *				Column 起始列位置,范围:1~16
 *				Number 要显示的数字,范围:0~0xFFFF
 *				Length 要显示数字的长度,范围:1~4
 * 返 回 值:无
 */
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i,SingleNumber;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		SingleNumber=Number/LCD_Pow(16,i-1)%16;
		if(SingleNumber<10)
		{
			LCD_WriteData(SingleNumber+'0');
		}
		else
		{
			LCD_WriteData(SingleNumber-10+'A');
		}
	}
}
/**
 * 函    数:在LCD1602指定位置开始以二进制显示所给数字
 * 参    数:	Line 起始行位置,范围:1~2
 *				Column 起始列位置,范围:1~16
 *				Number 要显示的数字,范围:0~1111 1111 1111 1111
 *				Length 要显示数字的长度,范围:1~16
 * 返 回 值:无
 */
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
	}
}

五,代码编译、下载到51单片机

代码编译请参考

《51单片机STC89C52RC——代码编译-CSDN博客》

代码下载请参考

《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》

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

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

相关文章

计算机组成原理----指令系统课后习题

对应的知识点&#xff1a; 指令系统 扩展操作码的计算&#xff1a; 公式&#xff1a; 对扩展操作码而言&#xff0c;若地址长度为n&#xff0c;上一层留出m种状态&#xff0c;下一层可扩展出 mx2^n 种状态 1.设计某指令系统时&#xff0c;假设采用 16 位定长指令字格式&#…

文件上传漏洞-下篇

一、白名单绕过 目录路径检测绕过 00截断 简介&#xff1a; 0x00是字符串的结束标识符&#xff0c;攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断&#xff0c;而后面的内容又可以帮助我们绕过检测。 饶过条件 利用操作&#xff1a;Pass-12 要求&#xff…

“论微服务架构及其应用”写作框架,软考高级,系统架构设计师

论文真题 论微服务架构及其应用近年来&#xff0c;随着互联网行业的迅猛发展&#xff0c;公司或组织业务的不断扩张&#xff0c;需求的快速变化以及用户量的不断增加&#xff0c;传统的单块&#xff08;Monolithic&#xff09;软件架构面临着越来越多的挑战&#xff0c;已逐渐…

前端 CSS 经典:backface-visibility 属性

前言&#xff1a;backface-visibility 属性可以使反转 180deg 的元素隐藏&#xff0c;使用这个属性实现卡片翻转效果 效果 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-…

以太坊==MetaMask获取测试币最新网址

估算分数https://community.infura.io/t/unable-to-receive-sepolia-eth-from-faucet/7715 Gitcoin Passport 水龙头地址&#xff0c;填入自己的测试地址 水龙头项目地址 GitHub - pk910/PoWFaucet: Modularized faucet for EVM chains with different protection methods (…

51单片机STC89C52RC——6.1 中断系统

一&#xff0c;文字层面理解 反正我看下面的几段文字时脑壳没有正常运转。一个头几个大 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求&#xff0c;要求CPU暂停当前的工作&#xff0c;转而去处理这…

接口自动化拓展:Flask框架安装、介绍及工作中的应用!

Flask是一个轻量级的Python Web框架&#xff0c;用于构建Web应用程序和API。它简洁而灵活&#xff0c;容易上手&#xff0c;并且非常适合用于开发小型到中型规模的应用程序。在接口自动化测试中&#xff0c;Flask可以作为服务器框架&#xff0c;用于搭建测试接口。 本文将从零…

Android:知道类加载过程面试还是卡壳?干货总结,一网打净“类”的基础知识!

多线程进行类的初始化会出问题吗&#xff1f; 类的实例化触发时机。 <clinit>()方法和<init>()方法区别。 在类都没有初始化完毕之前&#xff0c;能直接进行实例化相应的对象吗? 类的初始化过程与类的实例化过程的异同&#xff1f; 一个实例变量在对象初始化…

Docker(数据卷、自定义镜像、网络)

数据卷 数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 命令 说明 docker volume create 创建数据卷 docker volume ls 查看所有数据卷 docker volume rm 删除指定数据卷 docker volume inspect 查看某个…

视觉新纪元:解码LED显示屏的视角、可视角、最佳视角的最终奥秘

在璀璨夺目的LED显示屏世界里&#xff0c;每一个绚烂画面的背后&#xff0c;都离不开三个关键概念&#xff1a;视角、可视角与最佳视角。这些术语不仅是衡量显示效果的重要标尺&#xff0c;也是连接观众与精彩内容的桥梁。让我们一起走进这场视觉盛宴&#xff0c;探索那些让LED…

keepalived高可用,nginx+keepalived+apache架构的实现

目 录 一、概述&#xff1a; 二、实验架构图如图所示&#xff1a; 三、实验环境&#xff1a; 四、实现效果&#xff1a; 五、实验解析及步骤&#xff1a; 六、具体实现&#xff1a; 6.1 先关闭防火墙和核心防护&#xff1a;两条命令&#xff1a; 6.2 后端apache服务…

SSL/TLS握手

文章目录 SSL/TLSTLS历史发展层次结构SSL/TLS握手协议TLS1.2 Vs TLS1.3 安全通信协议是一类用于保护计算机网络上数据传输安全的协议。这些协议通过加密、身份验证和数据完整性机制来防止数据被窃听、篡改或伪造。以下是一些主要的安全通信协议&#xff1a;SSL/TLS, IPsec, SSH…

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

初始化数据 */ private void initData(Bundle savedInstanceState) { if (savedInstanceState ! null) mDatas savedInstanceState.getStringArrayList(“mDatas”); if (mDatas null) { mLoadingDialog new LoadingDialog(); mLoadingDialog.show(getFragmentMana…

CSS的 text-decoration

text-decoration text-decoration CSS 简写属性设置文本上的装饰性线条的外观。它是 text-decoration-line、text-decoration-color、text-decoration-style 和较新的 text-decoration-thickness 属性的缩写。 MDN text-decoration text-decoration 可以设置1到4个参数, 允许…

Type-C连接器厂商对检测实验室的要求及重要性解析

Type-C连接器厂商对检测实验室的要求与重要性 Type-C连接器作为一种高速、全功能的接口标准&#xff0c;被广泛应用于各类电子产品中。作为Type-C连接器的制造商&#xff0c;对于产品的质量和性能要求是至关重要的。为了确保产品符合规范并满足市场需求&#xff0c;Type-C连接…

Redis—Set数据类型及其常用命令详解

文章目录 一、Redis概述Set类型1 SADD:向集合&#xff08;Set&#xff09;中添加一个或多个成员2 SCARD:获取集合&#xff08;Set&#xff09;中成员数量3 SDIFF:获取多个集合之间的差集4 SDIFFSTORE:计算多个集合之间的差集&#xff0c;并将结果存储在指定的目标集合中5 SMEMB…

深度学习之数据集 Dataset总结

数据集 Dataset MindSpore提供了基于Pipeline的数据引擎&#xff0c;通过Dataset和Transforms实现高效的数据预处理。它提供了内置的文本、图像、音频等数据集加载接口&#xff0c;并提供了自定义数据集加载接口。此外&#xff0c;MindSpore的领域开发库也提供了大量的预加载数…

Android Studio无法连接夜神模拟器的解决方案

一、AS检测不到夜神模拟器 1、问题描述 在按照教程【如何安装和使用Android夜神模拟器】进入夜神的bin目录&#xff0c;输入连接命令回车后&#xff0c;终端显示的already connected to 127.0.0.1:62001&#xff0c;但是AS的Running Devices并没有显示夜神模拟器。 2、解决方…

自动驾驶仿真测试用例(完善版本)

进一步完善上述的测试用例&#xff0c;并根据不同的测试准备、车辆准备、车辆状态、车辆场景、车辆执行、可变因素、具体信号状态、通过标准和预期标准来详细描述每个测试用例。 用例编号测试类型测试项目测试描述车辆准备车辆状态车辆场景车辆执行可变因素具体信号状态通过标准…

从零实现GPT【1】——BPE

文章目录 Embedding 的原理训练特殊 token 处理和保存编码解码完整代码 BPE&#xff0c;字节对编码 Embedding 的原理 简单来说就是查表 # 解释embedding from torch.nn import Embedding import torch# 标准的正态分布初始化 也可以用均匀分布初始化 emb Embedding(10, 32) …