3. 定时器与LED模式切换控制

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

  • 定时器用于计时系统,或者使程序每隔一段固定时间完成一项操作
  • 替代长时间的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;
}
posted @ 2025-01-19 15:53  Lain_surime  阅读(32)  评论(0)    收藏  举报