定时器与晶振时钟、中断系统、定时中断

news2024/11/23 21:09:51

定时器

  • 简介:

    C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器 或者计数器使用。

    确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号 (信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。

    标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致。

  • 定时器和计数器,电路一样

  • 定时或者计数的本质就是让单片机某个部件数数

  • 当定时器用的时候,靠内部震荡电路数数

  • 当计数器用的时候,数外面的信号,读取针脚的数据

定时器怎么定时

定时器的本质原理: 每经过一个机器周期,就加1 :寄存器

  • 什么是晶振

    晶振(晶体震荡器),又称数字电路的“心脏”,是各种电子产品里面必不可少的频率元器件。数字电路的所有工作都离不开时钟,晶振的好坏、晶振电路设计的好坏,会影响到整个系统的稳定性。

  • 什么是时钟周期

    时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。更小的时钟周期就意味着更高的工作频率。

  • 什么是机器周期

    机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。

在这里插入图片描述

  • 加1经过了多少时间

    当晶振频率是11.0592MHz的时候,等于11059.2KHz = 11059200Hz

    机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 = 12 / 时钟频率

    秒 = 12 / 11059200 秒 = 12 000 000 / 11059200 微秒 = 1.085 微秒

定时器编程

  • 相关寄存器

    在这里插入图片描述

  • 在哪里加1,最大计数时间,也就是爆表了能计算多长

    在TH0/1和TL0/1寄存器中加1,默认是从0开始数数,最多能数65536下,累计计时71ms

  • 如何算出10ms定时器的初值

    就不让他从0开始数数,10ms需要数9216下,你让他从65536-9126=56320(16进制表示为 0xDC00)开始数数。

    这样TL0=0x00;TH0=0xDC;

//定时器计算器 计算的TL0 和TH0,与我们手动计算的一样
void Timer0Init(void)		//10毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}
  • 关于TCON

    在这里插入图片描述

  • 怎么知道爆表

    TCON寄存器的bit5(TF0)能表示爆表:当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成 1(置1),进入中断,硬件置TF0为0,如果不用中断,我们用软件代码吧TF0清零。

  • 怎么开始计时

    TCON寄存器的bit4,通过编程让这个位为1的时候,开始计时,相当于按下了闹钟

  • 定时器使用是有很多种模式的

    在这里插入图片描述

    定时器模式寄存器:TMOD来选择定时器模式,选择工作方式1,TMOD的bit0 bit1配置成0 1 :16 的定时器功能。

  • 定时器控制小灯闪烁

    #include "reg52.h"
    
    sbit led = P3^7;
    
    void main()
    {
    	int cnt = 0;
    	led = 1;
    	//1.选择定时器模式
    	TMOD = 0x01;
    	//2.给定定时器初值
    	TL0 = 0x00;
    	TH0 = 0xDC;
    	//3.开启定时器
    	TR0 = 1;
    	TF0 = 0;
    	while(1){
    		//4.爆表后cnt++,同时还原初值
    		if(TF0 == 1){
    			TF0 = 0;//不中断,软件置0
    			cnt++;
    			TL0 = 0x00;
    			TH0 = 0xDC;
    		}
    		//5.cnt=100后,正好1s小灯状态取反
    		if(cnt == 50){
    			led = !led;
    			cnt = 0;
    		}
    	}
    }
    
  • 按位操作

    四个二进制数表示一位的16进制数

    421法进制的转换(方便人类来看,对计算机底层来说,不关心进制010101010)

    配寄存器推荐用按位操作,清零的时候,对应的需要清零的位与上0,不需要清零的位与上1

    置1的时候,需要置1的位置或1不需要置1的位置或0

    //配置定时器时,选择TMOD模式,为了不影响定时器1,单独设置定时器0为16位
    TMOD &= 0xF0;
    TMOD |= 0x01; 
    //比直接TMOD = 0x01;更严谨
    
  • 中断

    中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。

    当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求COU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求

    当CPU正在处理一个中断源请求的时候,(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停原来的中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统

  • 中断优先级

    在这里插入图片描述

    如果使用C语言编程,中断查询次号就是中断号,例如:

    在这里插入图片描述

  • 中断寄存

在这里插入图片描述

CPU能响应定时器0中断的条件:需要配置IE寄存器的bit1:ET0 bit7:EA

1.  ET0中断允许要置1  :ET0 = 1;
2.  EA总中断要置1       :EA = 1;

在这里插入图片描述

  • 中断控制小灯闪烁

    #include "reg52.h"
    
    sbit led = P3^7;
    sbit led2 = P3^6;
    
    int cnt = 0;
    
    void time0_init()//定时器初始化函数
    {
    	//1.选择定时器模式
    	TMOD &= 0xF0;
    	TMOD |= 0x01;
    	//2.给定定时器初值
    	TL0 = 0x00;
    	TH0 = 0xDC;
    	//3.开启定时器
    	TR0 = 1;
    	TF0 = 0;
    	//开启中断
    	EA = 1;
    	ET0 = 1;
    
    }
    void time0_inter() interrupt 1
    {
    	//4.爆表后cnt++,同时还原初值
    	cnt++;
    	TL0 = 0x00;
    	TH0 = 0xDC;
    	//5.cnt=100后,正好1s小灯状态取反
    	if(cnt == 100){
    		led = !led;
    		cnt = 0;
    	}
    }
    void Delay500ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	i = 4;
    	j = 129;
    	k = 119;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    void main()
    {
    	led = 1;
    	led2 = 1;
    	time0_init();
    	while(1){
    		Delay500ms();
    		led2 = 0;
    		Delay500ms();
    		led2 = 1;
    	}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1566257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一维数组oj练习(4)

又是一维数组的练习.... 小A的学号在数组中可以看成a[k]&#xff0c;在判断谁大于a[k]。大于的数用sum来统计&#xff0c;最后输出。 #include<cstdio> int a[10010],n,k,sum; int main(){scanf("%d %d",&n,&k);for(int i1;i<n;i){scanf("%d…

uniapp开发安卓跟ios所遇问题集合

Android平台配置CPU类型 一般勾选armeabi-v7a跟arm64-v8a就好了 armeabi-v7a 第7代及以上的ARM处理器&#xff08;ARM32位&#xff09;&#xff0c;市面上大多数手机使用此CPU类型。arm64-v8a 第8代、64位ARM处理器&#xff08;ARM64位&#xff09;&#xff0c;最近两年新发的…

实现顺序表的增删查改

现在让我们探索数据结构这个美妙的世界吧&#xff01; 概念介绍 线性表是具有相同特性的数据元素的有限序列。线性表是一种在实际运用中广泛运用的线性结构&#xff0c;如线性表&#xff0c;栈&#xff0c;队列&#xff0c;字符串等。 顺序表的本质是数组&#xff0c;实现了…

微信小程序使用icon图标

原因&#xff1a; 微信小程序使用fontawesome库使用icon图标&#xff0c;网上有很多教程&#xff0c;按照网上说法制作&#xff0c;引入到微信小程序中&#xff0c;但是验证成功&#xff0c;只能使用部分图标&#xff0c;结果不尽如人意。后面使用阿里巴巴开源iconfont来使用ic…

DBU-Net:用于乳腺超声图像中肿瘤分割的双分支U形网络

DBU-Net&#xff1a;用于乳腺超声图像中肿瘤分割的双分支U形网络 摘要引言材料和方法概述所提出的方法 DBU-Net Dual branch U-Net for tumor segmentation in breast ultrasound images 摘要 乳腺超声医学图像通常具有低成像质量沿着不清楚的目标边界。这些问题使得医生在诊断…

VSCode调试C++

1、环境准备 1.1、g的安装与使用 1.1.1、安装 方式一&#xff1a;Xcode安装 苹果的开发集成工具是Xcode.app&#xff0c;其中包含一堆命令行工具。 在 App store 可以看到其大小有好几个G&#xff0c;有点大。 方式二&#xff1a;Command Line Tools 安装 Command Line Too…

Ai音乐大师演示(支持H5、小程序)独立部署源码

Ai音乐大师演示&#xff08;支持H5、小程序&#xff09;独立部署源码

【开发问题】为什么Java写文件时文件名中带有“*”会写入失败呢?

前言&#xff1a;在开发过程中&#xff0c;可能会遇写文件的问题。当我们写文件时&#xff0c;文件名中可能会带“*”号。这时候可能会导致写文件失败。 比如有一段写文件的代码&#xff1a; public static void createFile(String filename, byte[] content) {FileOutputStr…

蓝桥杯刷题-四平方和

四平方和 代码&#xff1a; from copy import deepcopy n int(input()) maxn int(5e6) 10 dic dict() for a in range(maxn):if a * a > n:breakfor b in range(a,maxn):if a * a b * b > n:breakif dic.get(a*ab*b) is None:dic[a*ab*b] (a,b) ans [maxn for _ …

情感视频素材在哪找?8个视频素材大全网站

在追求创意表达的道路上&#xff0c;每一位视频创作者都是一名勇敢的探险家&#xff0c;不断寻找那些能够点亮作品、让故事生动起来的珍贵资源。无论你的目标是打动人心、传达信息&#xff0c;还是简单地分享生活&#xff0c;以下八个视频素材网站将为你的每一个项目提供无尽的…

【C++第三阶段】模板类模板通用数组实现案例

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 模板怎么使用模板函数模板注意事项普通函数与函数模板的区别普通函数与函数模板调用规则函数模板限制 类模板类模板语法类模板与函数模板区别类模板中成员函数创建时机类模板对象做函…

Linux网络协议栈从应用层到内核层④

文章目录 1、网卡接受数据2、网络设备层接收数据3、ip层接受数据4、tcp层接受数据5、上层应用读取数据6、数据从网卡到应用层的整体流程 1、网卡接受数据 当网卡收到数据时&#xff0c;会触发一个中断&#xff0c;然后就会调用对应的中断处理函数&#xff0c;再做进一步处理。…

WSL安装与使用

开启之后&#xff0c;会提示你重启电脑才能使配置生效&#xff0c;我们重启即可。 电脑重启后&#xff0c;打开Microsoft Store搜索WSL&#xff0c;既可以看到支持的操作系统&#xff0c;我们选择Ubuntu即可&#xff0c;我们选择第一个就可以。 随后我们打开&#xff0c;发现报…

【WebKit架构讲解】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

开源知识管理和协作平台:插件丰富,主题精美 | 开源日报 No.209

logseq/logseq Stars: 27.8k License: AGPL-3.0 logseq 是一个注重隐私的开源平台&#xff0c;用于知识管理和协作。 提供强大的知识管理、协作、PDF 标注和任务管理工具支持多种文件格式&#xff0c;包括 Markdown 和 Org-modeWhiteboard 功能可使用空间画布组织想法&#x…

vue源码解析——vue如何将template转换为render函数

Vue 将模板&#xff08;template&#xff09;转换为渲染函数&#xff08;render function&#xff09;是 Vue 编译器的核心功能&#xff0c;它是 Vue 实现响应式和虚拟 DOM 的关键步骤。在 Vue 中&#xff0c;模板&#xff08;template&#xff09;是开发者编写的类似 HTML 的代…

SAP FI学习笔记03 - 应付账款

上一章讲了MM与FICO的集成。 SAP FI学习笔记02 - 基础知识 - MM与FICO集成-CSDN博客 本章讲应付账款。 上一章也讲了应付账款&#xff08;買掛金&#xff09;&#xff0c;它的来源可以是 - 购买发注&#xff0c;入库&#xff0c;请求书照合 之后系统自动生成 &#xff08;具…

南京大学提出用于大模型生成的动态温度采样法,简单有效!

在自然语言处理&#xff08;NLP&#xff09;的领域&#xff0c;大语言模型&#xff08;LLMs&#xff09;已经在各种下游语言任务中展现出了卓越的性能。这些任务包括但不限于问答、摘要、机器翻译等。LLMs的强大能力在于其生成的文本质量和多样性。为了控制生成过程&#xff0c…

任意文件下载漏洞

1.文件下载漏洞存在的位置 文件经过php处理可能存在文件下载漏洞&#xff0c;配合目录遍历漏洞使用 2.目录遍历漏洞检验方法 测试是否存在目录遍历漏洞&#xff1a;在网站网址中间添加随意写一个文件名../&#xff08;返回上一级&#xff09;进行测试&#xff0c;没有报错就…

UART通信

UART——通用异步收发传输器&#xff0c;UART 作为异步串口通信协议的一种&#xff0c;工作原理是将传输数据的每个字符一位接一位地传输。在应用程序开发过程中使用频率较高的数据总线。 基于UART的数据传输是异步形式的串行数据传输。基于UART的串行数据传输不需要使用时钟信…