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

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

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

相关文章

springAI(一)

目录 一、spring AI 目的 二、spring AI 来源 三、sprig AI 是什么&#xff1f; 四、spring AI中的 概念 4.1、模型&#xff08;Models&#xff09; 4.2、提示&#xff08;Prompts&#xff09; 4.3、提示模板&#xff08;Prompt Templates&#xff09; 4.4、令 牌&#…

Axios-入门

介绍 Axios对原生Ajax进行了封装&#xff0c;简化书写&#xff0c;快速开发 官网&#xff1a;Axios中文文档 | Axios中文网 (axios-http.cn) 入门 1引入Axios的js文件 <script src"js/axios.js"></script> 2使用Axios发送请求&#xff0c;并获取响应…

系统架构师考点--嵌入式技术

​大家好。今天来总结一下嵌入式技术的考点。该考点分值3-5分&#xff0c;上午场选择题和下午场案例题都可能会考&#xff0c;但不是每年都考。 一、嵌入式微处理体系结构 冯诺依曼结构&#xff1a;传统计算机采用冯诺依曼(Von Neumann)结构&#xff0c;也称普林斯顿结构是一…

动画与帧率

先看视频&#xff0c;同样的代码&#xff0c;左侧是240刷显示器&#xff0c;右侧是60刷显示器&#xff0c;但是动画中粒子的运动速度不同。 原因是机器的帧率导致了基于帧的动画显示效果不同。 动画的移动距离是相同的&#xff0c;但是在240刷的显示器上&#xff0c;每秒移动…

【代码随想录】【算法训练营】【第45天】 [198]打家劫舍 [213]打家劫舍II [337]打家劫舍III

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 45&#xff0c;周五&#xff0c;坚持不了一点~ 题目详情 [198] 打家劫舍 题目描述 198 打家劫舍 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 虚拟头…

中国科学院西北生态环境资源研究院联合多单位在《PNAS》发文:气候变暖对多年冻土区地上与地下生物量分布的影响

文章简介 论文名称&#xff1a;Changes in above-versus belowground biomass distribution in permafrost regions in response to climate warming&#xff08;气候变暖对多年冻土区地上与地下生物量分布的影响&#xff09; 第一作者及单位&#xff1a;贠汉伯&#xff08;研…

深度学习大体过程

一、深度学习的神秘面纱 深度学习&#xff0c;就像是一个超级魔法师&#xff0c;它能够从海量的数据中提炼出隐藏的秘密&#xff0c;然后利用这些秘密来预测未来、识别图像、翻译语言……简直是无所不能&#xff01;那么&#xff0c;这个魔法师是怎么工作的呢&#xff1f; 二…

代码随想录训练营Day 66|卡码网101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

1.孤岛的总面积 101. 孤岛的总面积 | 代码随想录 代码&#xff1a;(bfs广搜) #include <iostream> #include <vector> #include <queue> using namespace std; int dir[4][2] {1,0,0,1,-1,0,0,-1}; int count; void bfs(vector<vector<int>>&a…

SCI一区TOP|双曲正弦余弦优化算法(SCHO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年&#xff0c;J Bai受到双曲正弦余弦函数启发&#xff0c;提出了双曲正弦余弦优化算法&#xff08;Sinh Cosh optimizer, SCHO&#xff09;。 2.算法原理 2.1算法思想 SCHO灵感来源…

1panel + Pbootcms 设置伪静态规则

这里确保我们引用的样式路径是否是这样的&#xff0c;&#xff08;不然可能会设置了伪静态无法加载样式&#xff09; //这种格式在不开起伪静态是可以引入的&#xff0c;一旦开启就不行了,一定要在static 前面加上反斜杠 /<link rel"stylesheet" href"{pbo…

【数据分享】《中国法律年鉴》1987-2022

而今天要免费分享的数据就是1987-2022年间出版的《中国法律年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 自1987年起&#xff0c;《中国法律年鉴》作为一部全面记录中国法律发展进程的重要文献&#xff0c;见证了中国法治建设的每…

python魔法__dir__和__dict__

# 魔法方法dir, __dir__, __dict__class Student:address "wh" # 类属性def __init__(self, name):self.name name # 对象属性self._age 20self.__tel "123456"staticmethoddef static_func():...# __dir__: 查看对象的方法和属性 st Student("z…

【linux】6.9.0系统调用接口列表,一共644个

文件生成命令行&#xff1a; grep "ifdef" /usr/include/x86_64-linux-gnu/bits/syscall.h | awk { print $2 } >/mnt/hgfs/Share/syscall_small.h __NR_FAST_atomic_update __NR_FAST_cmpxchg __NR_FAST_cmpxchg64 __NR__llseek __NR__newselect __NR__sysctl …

Linux服务升级:Almalinux 升级 WebCatlog桌面程序

目录 一、实验 1.环境 2.Almalinux 升级 WebCatlog桌面程序 二、问题 1.Ubuntu如何升级 WebCatlog桌面程序 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本软件IP备注Almalinux9.4 WebCatlog 192.168.204.150 &#xff08;2&#xff09;Termi…

odoo17 小变更4

odoo17 小变更4 1、代码中去除了访问私人地址权限,但翻译中均还有,怪不 model:res.groups,name:base.group_private_addresses msgid "Access to Private Addresses" msgstr "" 代码也查看了,的确没有了此权限组 --><record model="res.g…

大聪明教你学Java | 深入浅出聊 Kafka

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

35 - 最后一个能进入巴士的人(高频 SQL 50 题基础版)

35 - 最后一个能进入巴士的人 -- sum(weight) over(order by turn) as total,根据turn升序&#xff0c;再求前面数的和 selectperson_name from(selectperson_name,sum(weight) over(order by turn) as totalfromQueue) new_Queue wheretotal<1000 order by total desc lim…

华为终于要“三分天下”

在被苹果iOS、谷歌安卓长期统治的手机操作系统市场中&#xff0c;一个新操作系统要想杀出来需要多久&#xff1f;华为给出的答案是五年。 6月21日&#xff0c;华为迎来了其过去五年来最扬眉吐气的一次开发者大会。大会首日&#xff0c;HarmonyOS NEXT鸿蒙星河版正式开启开发者…

34 - 指定日期的产品价格(高频 SQL 50 题基础版)

34 - 指定日期的产品价格 -- row_number(行号) 生成连续的序号&#xff0c;不考虑分数相同 -- 在2019-08-16之前改的价格&#xff0c;使用最近一期的日期&#xff0c;没有在2019-08-16之前改的价格&#xff0c;默认价格为10 select t.product_id, t.new_price as price from (s…

Idea安装插件刷Leetcode

一、下载插件 idea版本2022以下两个插件都可以用来刷Leetcode 二、登录Leetcode 获取token 登录 三、配置 配置1 配置2 Code FileName C$!velocityTool.leftPadZeros($!{question.frontendQuestionId},4)$!velocityTool.replace(${question.title}," ","&qu…