首页 > 其他分享 >定时器与LED模式切换控制

定时器与LED模式切换控制

时间:2025-01-19 15:54:21浏览次数:1  
标签:P3 定时器 LED 30 Delay keyNumber TMOD 切换

定时器是单片机内部功能,电路连接和运转均在单片机内部完成

  • 定时器用于计时系统,或者使程序每隔一段固定时间完成一项操作
  • 替代长时间的DELAY,提高效率
    每隔一个单位时间,内部的计数单元数值就增加一,当计数单元的数值达到设定值时,技术单元就会向端系统发出中断申请,产生响铃提醒,使程序跳转到中断服务函数中执行
    ![[Pasted image 20250118110827.png]]
    ![[Pasted image 20250118111320.png]]
  • SYSclk:系统时钟,即晶振周期,本开发板为11.0592MHz
  • T0 Pin:外部输入时钟,即外部提供脉冲来作为系统时钟
    中断系统:暂停当前CPU事件处理,转而去处理紧急事件,处理完之后回到原来中断的地方,继续之前的工作
    ![[Pasted image 20250118112442.png]]

就是高优先级的中断可以打断低优先级的中断
![[Pasted image 20250118113444.png]]

图中寄存器就是用来控制模式(上图中开关走向)
定时器/计数器使用TCON寄存器控制(Time control)

  • 可位寻址寄存器:可以给寄存器内部单独赋值
  • 不可位寻址寄存器:只能给寄存器整体赋值

与或式赋值法

TMOD = TMOD & 0xF0;
// 也可以直接简写
TMOD  &= 0xF0;

这样子赋值可以只给TMOD低四位清零,而高四位不变
可以更加准确的启用想要使用的功能块

TMOD = TMO | 0x01;
TMOD |= 0x01;

这样可以把低四位置1,高四位不变
总的来说就是与清零,或置1

使用按键控制流水灯

#include <REGX52.H>
#include <INTRINS.H>
#include "key.h"

unsigned char LEDmod = 0;

void Timer0Init(void)		//1毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1;
	ET0 = 1;
}


void Timer0_Rountine(void) interrupt 1
{
	static unsigned int timerCount = 0;
	TL0 = 0x18;
	TH0 = 0xFC;
	timerCount++;
	if(timerCount >= 1000)
	{
		timerCount = 0;
		if(LEDmod == 0)
		{
			P2 = _cror_(P2,1);
		}
		if(LEDmod == 1)
		{
			P2 = _crol_(P2,1);
		}
	}
}

void main()
{
		P2 = 0xFE;
	Timer0Init();
	while(1)
	{
		unsigned char keyNum = key();
		if(keyNum != 0)
		{
			LEDmod++;
			if(LEDmod >= 2) LEDmod = 0;
		}
	}
}


#include "DELAY.H"
#include <REGX52.H>

unsigned char keyNumber;

unsigned char key()
{
	if(P3_1 ==0) {Delay(30);while(P3_1 == 0);Delay(30);keyNumber = 1;}
	if(P3_0 ==0) {Delay(30);while(P3_0 == 0);Delay(30);keyNumber = 2;}
	if(P3_2 ==0) {Delay(30);while(P3_2 == 0);Delay(30);keyNumber = 3;}
	if(P3_3 ==0) {Delay(30);while(P3_3 == 0);Delay(30);keyNumber = 4;}
	
	return keyNumber;
}

标签:P3,定时器,LED,30,Delay,keyNumber,TMOD,切换
From: https://www.cnblogs.com/surime/p/18679633

相关文章

  • 【花雕学编程】Arduino动手做(246)---使用 Web 服务器的 ESP8266 LED 控制
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • 求助,51单片机定时器中断控制数码管
    遇到的问题是:动态显示时,如果位选变化间隔太小,会导致计数的部分失效,数码管一直显示0000,间隔在30时数字会有变化,但是显示闪烁的效果太明显了代码如下:#defineuintunsignedint#defineucharunsignedchar//位选定义sbitwei0=P1^3;sbitwei1=P1^4;sbitwei2=P1^5;sbi......
  • 51单片机学习日记:独立按键控制LED灯
    我们可以再单片机上看到4个独立的按键,控制一个LED灯的亮灭先用第一个就可以,我们先找到独立按键的原理图来看看如何通过按键来控制LED灯的亮灭;独立按键的一段接地,另一端接P3,则我们按下按键时会使端口为低电平,我们就可以通过逻辑:当P31=0(按下去按键)时让灯亮,当P31=1时灯灭。(大......
  • 鸿蒙开发教程实战案例源码分享-tab切换动画
    鸿蒙开发教程实战案例源码分享-tab切换动画往往会看到tab切换时有个显示变大的动画,不会那么突兀。关键是用到animation动画一、思路:用animation二、效果图:看视频更直观点:【2025最新】鸿蒙开发教程实战案例源码分享-推荐和最新tab切换动画三、关键代码:@Compon......
  • 28、【OS】【Nuttx】最小系统初始化分析(4):定时器(二)
    背景接上篇wiki27、【OS】【Nuttx】最小系统初始化分析(4):定时器(一)分析了定时器初始化过程,以及初始化生成的定时器实例,并着重分析了实例对象里的sim_current方法,接下来对最小系统中,定时器的启动,以及执行的任务进行分析定时器启动来看定时器启动函数sim_start,这里有两......
  • Flutter使用FractionallySizedBox组件报错Failed assertion: line 2164 pos 12: 'hasS
    这里从解决方法那里直接给出个有效的方式。就是如果你使用了FractionallySizedBox组件,第一是这个组件只能在固定宽高下或者Row,Flex,Column组件下使用。第二就是这个组件需要在Flexible下使用.结构就是:Row->Flexible->FractionallySizedBox给出简单的代码示例......
  • IAR编译工程报错:CreateProcess failed:The system cannot find the file specified
    IAR安装完成后,编译STM32的工程时报如下错误信息:CreateProcessfailed:Thesystemcannotfindthefilespecified全网检索各种答案都有,尝试重新安装、版本升级等都没能解决。因为之前有过安装8.32版本,卸载后又进行安装的9.2版本,抱着试探的心理,打开注册表将和IAR相关......
  • rK3568-修改RTL8211F-CG网口led显示灯状态
    1.修改代码路径/home/salesdmcf/works/SDK/Linux/kernel/drivers/net/phy/realtek.cstaticintphy_rtl8211f_led_fixup(structphy_device*phydev){u32val,val2;printk("lyc----->in:%s\n",__func__);/*setled1(green)Link10/100/1000M......
  • 0.LED基础控制
    典中典之发光二极管,我从小学到大长脚是正级,断脚是负极里面大块的是负级,小块的是正极电阻标注:若标注102->代表着为1K电阻(10^2)若标注473->代表着为47K电阻(47*10^3)以此类推其他器件标注也为类似模式RP7RP9模块为限流电阻此单片机使用TTL规范(高电平5V低电平0V)......
  • 解决 spring boot 2.7.18 导入 flowable 6.8.1 报 Liquibase failed to start because
    解决springboot2.7.18导入flowable6.8.1报Liquibasefailedtostartbecausenochangelogcouldbefoundat'classpath:/db/changelog/db.changelog-master.yaml'.的办法 不论是导入<dependency><groupId>org.flowable</groupId><ar......