定时器是单片机内部功能,电路连接和运转均在单片机内部完成
- 定时器用于计时系统,或者使程序每隔一段固定时间完成一项操作
- 替代长时间的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