首页 > 其他分享 >11_定时器

11_定时器

时间:2023-11-09 17:45:43浏览次数:42  
标签:11 __ 定时器 void T0Count Timer0 include

定时器

定时器介绍

image-20231108194256936

STC89C52定时器资源

image-20231108194548327

定时器框图

image-20231108194911082

定时器工作模式

image-20231108195159647

定时器时钟

image-20231108195617812

中断系统

image-20231108200059744

中断程序流程

image-20231108200426330

STC89C52中断资源

image-20231108200527731

定时器和中断系统

image-20231108200627421

定时器相关寄存器

image-20231108201048079

使用定时器0每隔一秒使LED亮灭

Timer0.c

#include <REGX52.H>

/**
* @brief 定时器0初始化,1毫秒@12.000MHz
  * @param 无
  * @retval 无
  */
void Timer0_Init(void)
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

/* 定时器中断函数模板
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;
	TH0 = 0xFC;
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
		
	}
}
*/

Timer0.h

#ifndef __TIMER0_H__
#define __TIMER0_H__

void Timer0_Init(void);

#endif

main.c

#include <REGX52.H>
#include "Timer0.h"

void main()
{
	Timer0_Init();
	while(1)
	{
		
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;
	TH0 = 0xFC;
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
		P2_0=~P2_0;
	}
}

运行效果

VID_20231109_135339

使用独立键盘控制流水灯

Key.c

#include <REGX52.H>
#include "Delay.h"

/**
  * @brief 获取独立按键键码
  * @param 无
  * @retval 按下按键的键码,范围:0~4, 无按键按下返回0
  */
unsigned char Key()
{
	unsigned char KeyNumber=0;
	if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
	if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
	if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
	if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
	return KeyNumber;
}

Key.h

#ifndef __KEY_H__
#define __KEY_H__

unsigned char Key();

#endif

main.c

#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include <INTRINS.H>

unsigned char KeyNum,LEDMode;

void main()
{
	P2=0xFE;
	Timer0_Init();
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)
		{
			LEDMode++;
			if(LEDMode>=2)
				LEDMode=0;
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;
	TH0 = 0xFC;
	T0Count++;
	if(T0Count>=100)
	{
		T0Count=0;
		if(LEDMode==0)P2=_crol_(P2,1);
		if(LEDMode==1)P2=_cror_(P2,1);
	}
}

运行效果

VID_20231109_170803

定时器闹钟

Timer0.c

#include <REGX52.H>

/**
* @brief 定时器0初始化,1毫秒@12.000MHz
  * @param 无
  * @retval 无
  */
void Timer0_Init(void)
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

/* 定时器中断函数模板
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;
	TH0 = 0xFC;
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
		
	}
}
*/

Timer0.h

#ifndef __TIMER0_H__
#define __TIMER0_H__

void Timer0_Init(void);

#endif

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"

unsigned char Sec,Min,Hour; //秒分时

void main()
{
	LCD_Init();
	Timer0_Init();
	LCD_ShowString(1,1,"Clock:");
	while(1)
	{
		LCD_ShowNum(2,1,Hour,2);
		LCD_ShowString(2,3,":");
		LCD_ShowNum(2,4,Min,2);
		LCD_ShowString(2,6,":");
		LCD_ShowNum(2,7,Sec,2);
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;
	TH0 = 0xFC;
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
		Sec++;
		if(Sec>=60)
		{
			Sec=0;
			Min++;
			if(Min>=60)
			{
				Min=0;
				Hour++;
				if(Hour>=24)
				{
					Hour=0;
				}
			}
			
		}
		
	}
}

运行效果

VID_20231109_172800

标签:11,__,定时器,void,T0Count,Timer0,include
From: https://www.cnblogs.com/mzx233/p/17822395.html

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (131)-- 算法导论11.2 3题
    三、用go语言,Marley教授做了这样一个假设,即如果将链模式改动一下,使得每个链表都能保持已排好序的顺序,散列的性能就可以有较大的提高。Marley教授的改动对成功查找、不成功查找、插入和删除操作的运行时间有何影响?文心一言:Marley教授的假设是关于调整链表(可能是一个散列链表)......
  • 11.8 模拟赛小记
    僕を連れてって,浸み込んでしまう前に菜哭了。不会打,看了半个小时史铁生散文集。100+0+80+0喵。A.俨俨与道路(constructure)正解是最小生成树。我的思路差不多。为了全部联通,需要n-1条边。随意先计算给定的确定起始点的边,根据边权排序,从中挑至少\(n-1-k\)条边。剩下的用......
  • CC1101 一款低功耗sub- 1ghz收发器芯片 适用于无线遥控智能家居
    产品描述CC1101是一个低成本的sub-1ghz收发器,专为极低功耗的无线应用而设计。该电路主要用于工业、科学和医学)和SRD(ShortRangeDevice)频带,在315,433,868和915兆赫,但可以轻松可编程用于其他操作频率在300-348MHz、387-464MHz,以及779-928MHz频段。射频收发器集成了一......
  • 2023-11-09
    背景:开发个人博客系统存在的问题1.EFCore基础功不扎实导航属性如何运行不清楚新增实体时导航属性会再次添加报错2.网络请求知识储备不足基本的httpclient类不够了解,restsharp使用不够熟练3.MVC基础知识点薄弱使用很少,功底不扎实4.开发工具新版本不适应 ......
  • 市面上主流嵌入式操作系统(RTOS)有哪些?看这11种操作系统
    市面上主流嵌入式操作系统(RTOS)有哪些?看这11种操作系统嵌入式操作系统RTOS2023-03-1316:26广东满足实时控制要求的嵌入式操作系统(RTOS)操作系统,以下介绍11种主流的RTOS,分别为RTX、Vxworks、QNX、NuttX、μClinux、FreeRTOS,而国产的嵌入式操作系统包括都江堰操作系统(d......
  • 11.9打卡
    1. 不同路径(61)一个机器人位于一个 mxn 网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。classSolution{publicintuniquePaths(intm,intn){int[][]d......
  • LeetCode #1131 Maximum of Absolute Value Expression 绝对值表达式的最大值
    安装Flutter环境首先配置flutter3开发环境,照着官方教程傻瓜式安装即可。>>安装和环境配置|Flutter中文文档|Flutter中文开发者网站注意在国内网络环境下需要进行一些额外的环境配置:>>在中国网络环境下使用Flutter|Flutter中文文档|Flutter中文开发者网站Description......
  • 2023119
    2023/11/9CodeforcesRound908(Div.2)补题A.SecretSport简单签到,一个思路就是比赛结束总是在刚刚得出胜者的时候,所以最后一个人总是获胜的B.TwoOutofThree签到C.AnonymousInformant(补)思路:逆推,因为每次左移的时候,选择的数总是会到最后一位,那么我们就可以看当前......
  • 每日总结20231109
    代码时间(包括上课)6h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周四,上午上的是软件设计和软件需求分析,软件设计写的是组合模式和装饰模式的实验报告,软件需求分析讲的是如何做需求调研分析。2、今天下午上的是人机交互技术,写的是人机交互技术的两个实验报告。3、今天晚上打......
  • 每日总结1109
    今天对于企业ERP有了新的了解,其中最重要的部分莫过于支出收入,考核三个部分,因为每一个企业都是与利益挂钩了。ERP的核心价值:提高工作效率:简化和自动化核心业务流程,帮助企业所有人员用更少的资源完成更多任务。深化洞察力:消除信息孤岛,建立统一的真实数据源,快速解决任务关键......