当前位置: 首页 > news >正文

按键控制LED流水灯模式定时器时钟

目录

1.定时器

2. STC89C52定时器资源

3.定时器框图

4. 定时器工作模式

5.中断系统

1)介绍

2)流程图:​编辑

3)STC89C52中断资源

4)定时器和中断系统

5)定时器的相关寄存器

6.按键控制LED流水灯模式


1.定时器

介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成

作用:

1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作

2)替代长时间的Delay,提高CPU的运行效率和处理速度(避免按键不灵敏)

) 

2. STC89C52定时器资源

定时器个数:3个(T0T1T2), T0 和 T1 与传统的51单片机兼容,T2是此型号单片机增加的资源

注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的

3.定时器框图

提供计数单元的时钟脉冲                               时钟计数                              产生中断,执行定时任务

定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行 

4. 定时器工作模式

STC89C52T0T1均有四种工作模式:

  模式013位定时器/计数器

  模式116位定时器/计数器(常用)

  模式28位自动重装模式

  模式3:两个8位计数器

工作模式1框图:

1)TH0 TL0 计数系统最多可以存65535

2)TF0为标志位,通过标志位向中断系统申请中断

3)时钟提供脉冲,一个脉冲使计数系统加 1 ,当计数系统到达65535后会溢出(计数系统为 0 )通过TF0产生中断

4)/12或/6 为分频   如:12MHZ/12 ==1 MHZ

SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz  (system clock)

T0 Pin :单片机外部接口 

当有外部引脚来提供时钟时,定时器为计数器                 

5.中断系统
1)介绍

2)流程图:
3)STC89C52中断资源

中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3

中断优先级个数:4

中断号:

注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等

4)定时器和中断系统

为了方便理解,这里使用的中断系统图是传统51单片机的图,STC89C52的中断系统图可参考手册

从左下往右分别为 非门(数据取反) 或门(有1 则为1) 与门(有0则为0)

5)定时器的相关寄存器

寄存器是连接软硬件的媒介,在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式寄存器相当于一个复杂机器的“操作按钮”

 

6.按键控制LED流水灯模式
#include <REGX52.H>
#include"Timer0.h"            //main.c
#include"Key.h"
#include<INTRINS.H>unsigned char KeyNum,LEDMode;
void main()
{P2=0xfe;Timer0Init();while(1){KeyNum=Key();if(KeyNum){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>=500){T0Count=0;if(LEDMode==0)P2=_crol_(P2,1);if(LEDMode==1)P2=_cror_(P2,1);}
}
#include <REGX52.H>
void Timer0Init(void)		//Timer0.c
{TMOD &= 0xF0;		TMOD |= 0x01;		TL0 = 0x18;		TH0 = 0xFC;		TF0 = 0;	TR0 = 1;ET0=1;EA=1;PT0=0;
}
#ifndef    ___Timer0__     //防止重定义
#define ___Timer0__        //Timer0.hvoid Timer0Init(void);		#endif
#include <REGX52.H>    //Key.c
#include"Delay.h"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;
}
#ifndef    ___Key__ //防止重定义
#define ___Key__    //Key.hunsigned char Key();#endif
#include <REGX52.H>void Delay(unsigned int xms)		//延时 xms ms{unsigned char i, j;
while(xms)
{i = 2;j = 239;do{while (--j);} while (--i);xms--;
}
}
#ifndef __Delay_H  //防止重定义
#define __Delay_H  //Delay.hvoid Delay(unsigned int xms);	#endif

注意:可位寻址可以对单独的位进行赋值(TCON),不可位寻址只能整体赋值(TMOD)

谢谢观看

http://www.lryc.cn/news/394202.html

相关文章:

  • 【Docker安装】OpenEuler系统下部署Docker环境
  • 小程序 使用 UI 组件 Vant Weapp 、vant组件样式覆盖
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • 迭代器模式在金融业务中的应用及其框架实现
  • 浏览器插件利器-allWebPluginV2.0.0.14-stable版发布
  • 机器学习训练之使用静态图加速
  • 数据结构速成--图
  • 昇思25天学习打卡营第12天|FCN图像语义分割
  • 昇思MindSpore学习笔记4-03生成式--Diffusion扩散模型
  • Go:hello world
  • JVM专题之内存模型以及如何判定对象已死问题
  • vscode使用Git的常用操作
  • RPC与REST
  • 计数排序的实现
  • 【Qt】QTableWidget设置可以选择多行多列,并能复制选择的内容到剪贴板
  • 跨越界限的温柔坚守
  • Vue3 对于内嵌Iframe组件进行缓存
  • L04_MySQL知识图谱
  • 什么是CNN,它和传统机器学习有什么区别
  • 游戏开发面试题3
  • postman请求访问:认证失败,无法访问系统资源
  • Apache Seata新特性支持 -- undo_log压缩
  • Java中的软件架构重构与升级策略
  • 设置Docker中时区不生效的问题
  • LeetCode436:寻找右区间
  • 前端JS特效第22集:html5音乐旋律自定义交互特效
  • pyrender 离线渲染包安装教程
  • XSS平台的搭建
  • 【持续集成_03课_Jenkins生成Allure报告及Sonar静态扫描】
  • PageHelper分页查询遇到的小问题