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)

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

与或式赋值法

复制代码
  • 1
  • 2
  • 3
TMOD = TMOD & 0xF0; // 也可以直接简写 TMOD &= 0xF0;

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

复制代码
  • 1
  • 2
TMOD = TMO | 0x01; TMOD |= 0x01;

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

使用按键控制流水灯

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
#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; } } }
复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
#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 @   Lain_surime  阅读(8)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开