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

目录

目的/效果

一,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博客》

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

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

相关文章

最优化第六讲练习题

使用牛顿法 def f(vec):x1,x2vec[0],vec[1]return x1*x1/22*x2*x2def first_order(vec):x1,x2vec[0],vec[1]return np.array((x1,4*x2))x0np.array((2,1)) #初始点 secnp.array([[1,0],[0,4]]) #二阶导 try:invnp.linalg.inv(sec) except:print("矩阵不存在逆矩阵")…

如何让表格标题栏具有粘性?

让表格标题栏具有粘性 什么意思呢&#xff1f; 就是当表格的内容&#xff08;行数&#xff09;比较多的时候&#xff0c; 滚动屏幕&#xff0c;看下面的内容的时候&#xff0c; 表格标题栏可以一直显示在屏幕最上方&#xff0c; 以前呢&#xff0c; 我会通过JSCSS 的 pos…

ffmpeg音视频开发从入门到精通——ffmpeg实现音频抽取

文章目录 FFmpeg 实现音频流抽取1. 包含FFmpeg头文件与命名空间声明2. 主函数与参数处理3. 打开输入文件4. 获取文件信息5. 查找音频流6. 分配输出文件上下文7. 猜测输出文件格式8. 创建新的音频流9. 打开输出文件10. 写入文件头信息11. 读取并写入音频数据12. 写入文件尾部信息…

STM32读取芯片内部温度

基于stm32f103cbt6这款芯片&#xff0c;原理部分请参考其他文章&#xff0c;此文章为快速上手得到结果&#xff0c;以结果为导向。 1.基础配置 打开stm32cubemx只需要勾选中 ADC1 Temperature Sensor Channel 2.代码分析 /** 函数名&#xff1a;float GetAdcAnlogValue(voi…

05 - matlab m_map地学绘图工具基础函数 - 设置比例尺指北针

05 - matlab m_map地学绘图工具基础函数 - 设置比例尺指北针 0. 引言1. 关于m_scale2. 关于m_ruler3. 关于m_northarrow4. 结语 0. 引言 本篇介绍下m_map中添加指北针(m_northarrow)、比例尺(m_ruler)和进行比例缩放(m_scale)的函数及其用法 。 1. 关于m_scale m_scale用于图件…

python库离线安装方法(pyqt5离线安装方法)

在某些情况下&#xff0c;我们的计算机是无法联网的。 网上大部分方法&#xff1a; 这些方法都有个问题&#xff0c;就是库是需要依赖其它库的&#xff0c;你不知道它需要依赖什么库&#xff0c;就是提供了依赖库的列表也麻烦&#xff0c;依赖库也是有对应版本要求的&#xf…

C++程序设计基础实践:学生信息管理系统

目录 1 系统介绍 2 系统设计 3 设计结果 4 源代码 近来有空闲&#xff0c;把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正&#xff0c;有更好的方法也期待您的分享~ 实验要求 本课程要完成一个学生信息管理系统的设计与实现&#xff0c;可实现对于学生信息…

kafka(五)spring-kafka(2)详解与demo

一、简单的收发消息demo 父工程pom&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

Android面试题:App性能优化之Java和Kotlin常见的数据结构

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 Java常见数据结构特点 ArrayList ArrayList底层是基于数组实现add、删除元素需要进行元素位移耗性能&#xff0c;但查找和修改块适合不需要频…

全面国产化信创适配改造方案说明

一、概叙 系统的全面国产化适配改造需要从多个方面进行考虑&#xff0c;改造前需要进行充分的论证&#xff0c;在满足具体业务场景的前提下&#xff0c;以确保系统的稳定性和安全性&#xff0c;同时还要考虑技术的发展&#xff0c;不断优化和更新。因此全面国产化适配改造也面临…

沙奇里再造世界波,容声注定与经典结缘

足球的世界&#xff0c;就像人生一样&#xff0c;包罗万象&#xff0c;千人千面。有人天生就是王者&#xff0c;有人怎么努力也碌碌无为&#xff0c;而有的人&#xff0c;平时看似没有那么闪耀&#xff0c;却注定为大场面而生。 比如瑞士国脚沙奇里。在对阵苏格兰的欧洲杯小组…

【CT】LeetCode手撕—415. 字符串相加

目录 题目1- 思路2- 实现⭐415. 字符串相加——题解思路 3- ACM 实现 题目 原题连接&#xff1a;415. 字符串相加 1- 思路 模式识别&#xff1a;字符串相加 逆向遍历过程模拟 数据结构 ① String res &#xff1a;记录res 、② carry 记录进位值① 定义两个整数遍历 nums1 …

【第一性原理】邓巴数字

这里写自定义目录标题 什么是邓巴数字邓巴数背后的科学历史上各个组织的人数与邓巴数字的关系在人类进化中的意义现代社会中邓巴数字的体现邓巴数字的意义其他与沟通相关的数据注意事项结论参考 罗宾邓巴教授生于1947年&#xff0c;进化心理学家&#xff0c;牛津大学教授&#…

【SkiaSharp绘图09】SKBitmap属性详解

文章目录 SKBitmap与Bitmap性能对比对比结果 构造函数SKBitmap()SKBitmap(SKImageInfo)SKBitmap(Int32, Int32, SKColorType, SKAlphaType, SKColorSpace) SKBitmap属性AlphaTypeByteCountBytesBytesPerPixelColorSpaceColorTypeDrawsNothingInfoIsEmptyIsImmutableIsNullPixel…

投资者回归理性?美股去年备受追捧的AI概念股,今年超过一半在下跌

喊两句AI就能圈钱的日子一去不复返了&#xff0c;未来企业要用实打实的业绩说话。 正文 去年备受追捧的AI概念股中&#xff0c;今年绝大多数已经开始下跌。面对越来越谨慎的投资者&#xff0c; 上市公司或许很难再打着AI的旗号圈钱。 今年&#xff0c;标普500指数中有60%的股…

动态规划:基本概念

Dynamic Programming 动态规划&#xff08;Dynamic Programming, DP&#xff09; 是一种算法设计技巧&#xff0c;通常用来解决具有重叠子问题和最优子结构性质的问题。它通过将问题分解为更小的子问题&#xff0c;逐步解决这些子问题并将结果存储起来&#xff0c;以避免重复计…

U-Net for Image Segmentation

1.Unet for Image Segmentation 笔记来源&#xff1a;使用Pytorch搭建U-Net网络并基于DRIVE数据集训练(语义分割) 1.1 DoubleConv (Conv2dBatchNorm2dReLU) import torch import torch.nn as nn import torch.nn.functional as F# nn.Sequential 按照类定义的顺序去执行模型&…

win10/11磁盘管理

win10/11磁盘管理 合并磁盘分区的前提是你的两个磁盘区域是相邻的&#xff0c;比如如下&#xff1a; 如果需要吧这个磁盘进行分解&#xff0c;你可以选择压缩一部分磁盘或者是直接删除卷 我这里的话&#xff0c;因为压缩出来的卷和C盘好像是不相邻的&#xff08;我之前做过&…

【SpringCloud-Seata源码分析2】

文章目录 分支事务注册-客户端分支事务服务端的执行 分支事务注册-客户端 第一篇我们将全局事务启动&#xff0c;以及开启源码分析完成了&#xff0c;现在我们需要看一下分支事务注册。 我们分支事务的开始需要从PreparedStatementProxy#executeUpdate中去看。 public class…

GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国

快手可灵大模型推出图生视频功能“纯血”鸿蒙大战苹果AI&#xff0c;华为成败在此一举大模型低价火拼间&#xff0c;智谱AI“钱途”黯淡手握新“王者”&#xff0c;腾讯又跟渠道干上了“美食荒漠”杭州&#xff0c;走出一个餐饮IPOGPT-4o一夜被赶超&#xff0c;Anthropic推出Cl…