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

51单片机 06 定时器

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

作用:1、用于计时;2、替代长时间的Delay,提高CPU 运行效率和处理速度。

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

单片机通过配置寄存器来控制内部线路的链接。

一、TMOD

 M0 1 M1 0 :16位定时器/计数器

TMOD:0x01 (不可位寻址)

可位寻址:可以对每一位进行单独赋值;不可位寻址:只能进行整体赋值。

二、TCON

如果GATE=0就不用管IE0和IT0(不影响)

 三、TH0/TL0

256=2^8 对应一个字节8位 

TH0=64535/256;     TL0=64535%256;     64535(计数1000微秒->1毫秒)

四、中断系统

在中断函数中不要执行过长的任务。

ET0=1  EA=1  PT0=0

五、计数1秒 

设置T0Count

unsigned int T0Count;

void Timer0_Routine() interrupt 1
{
    TH0=64536/256;
	TL0=64536%256;
	T0Count++;
	if (T0Count>=1000) 
	{
		P20=0;
	}
}
#include <STC89C5xRC.H>

void Timer0_Init()
{
	// TMOD=0x01;
    TMOD=TMOD&0xF0; //把TMOD第四位清零,高四位不变
    TMOD=TMOD|0x01;
	TF0=0;
	TR0=1;
	TH0=64536/256;
	TL0=64536%256;
	PT0=0;
	EA=1;
	ET0=1;
}

void main()
{
	Timer0_Init();
	while(1)
	{
	
	}
}

unsigned int T0Count;

void Timer0_Routine() interrupt 1
{
	TH0=64535/256;
	TL0=64535%256;
	T0Count++;
	if (T0Count>=1000) 
	{
		T0Count=0;
		P20=~P20;
	}
}

初始化-进行while-计时-中断程序(改变灯状态)-重新进入while/计时-......

这个代码中没有中断的配置,要自己加一下。

六、定时器自动流水灯

1、timer0.c

#include <STC89C5xRC.H>

/**
  * @brief  定时器0初始化,1毫秒
  */

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

/*
void Timer0_Routine() interrupt 1 //一般放到main中
{
	static unsigned int T0Count; //加了static不会销毁
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if (T0Count>=1000) 
	{
		T0Count=0;
		P20=~P20;
	}
}
*/

2、timer0.h

# ifndef __TIMER0_H__
# define __TIMER0_H__
 
void Timer0Init(void);

# endif

3、key.h流水灯

# ifndef __KEY_H__
# define __KEY_H__
 
extern unsigned char pattern;
void key();

# endif

extern 声明告诉编译器:这个变量在程序的其他地方已经定义。(声明一个外部变量 )

4、key.c

unsigned char pattern=0xFE;

void key()
{
	pattern=(pattern<<1)|0x01;
	if(pattern==0xFF) pattern=0xFE;
}

5、main.c

#include <STC89C5xRC.H>
#include "timer0.h"
#include "key.h"

void main()
{
	Timer0Init();
	while(1)
	{
	
	}
}

void Timer0_Routine() interrupt 1 //一般放到main中
{
	static unsigned int T0Count; //加了static不会销毁
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if (T0Count>=1000) 
	{
		T0Count=0;
		key();
		P2=pattern;
	}
}


http://www.kler.cn/a/532946.html

相关文章:

  • Baklib推动数字化内容管理解决方案助力企业数字化转型
  • AI 算力瓶颈,硬件、算法、共享能否破局?
  • BGP路径属性
  • 【教程】禁止网页右键和打开调试页面
  • 实验十 Servlet(一)
  • CNN的各种知识点(五):平均精度均值(mean Average Precision, mAP)
  • Effective Objective-C 2.0 读书笔记—— 接口与API设计
  • Java-数据结构-优先级队列(堆的使用)
  • 数据中心服务器对PCIe测试的需求、挑战和应用
  • 【大数据技术】本机DataGrip远程连接虚拟机MySQL/Hive
  • 5分钟掌握React的Redux Toolkit + Redux
  • 深度学习篇---张量数据流动处理
  • windows环境下如何在PyCharm中安装软件包
  • 【CSS】什么是响应式设计?响应式设计的基本原理,怎么做
  • 实际操作 检测缺陷刀片
  • 【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
  • 新手STM32:基于HAL库的定时器和PWM输出
  • 利用Docker简化机器学习应用程序的部署和可扩展性
  • 项目中常用中间件有哪些?分别起什么作用?
  • (10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例
  • Mac M1 ComfyUI 中 AnyText插件安装问题汇总?
  • Unity 2D实战小游戏开发跳跳鸟 - 计分逻辑开发
  • 1.PPT:天河二号介绍【12】
  • Vue - toRaw 与 markRaw
  • Kubeflow——K8S的机器学习利器
  • 人工智能基础知识速成 - 机器学习、深度学习算法原理及其实际应用案例