单片机定时器实验两位倒计时秒表_51单片机基础与应用8天速成(三)

223c2f32d9653d1f668acf418b78f76e.png273c2676f3c2373d7dd436170586d5ef.png

在讲授中断这一概念时,人们总是喜欢举洗衣服烧水的例子:

话说,一天“你”独自在家,为了泡脚给自己烧上了一壶水,然后想着明天没有衣服穿了,就去阳台洗起了衣服。过了十几分钟,“你”在阳台洗着衣服,突然听到了厨房烧水壶沸腾的鸣叫,所以,“你”放下洗了一半的衣服,去关闭了煤气灶,接着又返回阳台继续洗衣服。在这个小故事中,如果我们把烧水和洗衣服分别看作两个进程,那么显然,烧水壶沸鸣对应的是中断请求,洗衣服则是正常运行的主进程,高优先级进程通过向CPU提交中断请求的方式,暂时中断主进程转而运行其他进程,利用有限的CPU资源,尽可能的做到了对效率和实时性的兼顾。

在第一天的教程中曾经提到过,我们会用三天的时间分别学习外部中断、定时器/计数器中断以及串口中断,占据全部八天课程的三分之一还多,单单从课程安排上,大家就可以体会到中断在单片机学习中的重要地位。

7255503e1dd7a7f3cce3ebfe9680f6e3.png

中断的优先级

当有多个中断同时被提交,那么CPU该选择响应哪个中断呢?这要从中断源的类型来分

单片机的中断源分为三类

  • 外部中断

  • 定时器/计数器中断

  • 串口中断

但单片机最基本的中断源却有5个

  • 外部中断0

  • 定时器/计数器中断0

  • 外部中断1

  • 定时器/计时器中断1

  • 串口中断

(排列即为他们的优先级)

丰富的中断源可以大大提高单片机的便捷性,有些较新的单片机已经拥有了8个中断源,但本教程中只讲单片机必备的5个中断源的使用.

在洗衣烧水的小故事中,我们已经意识到了优先级这一概念的存在,高优先级的中断将被优先执行,且可以打断低优先级的中断,反之则不能。5个中断源的优先级(或查询次序)已经被指定,在软件编程中又有着相对应的中断号(0-4),软件编程里的中断号与中断优先级匹配正确,程序才能正常进入中断(程序中会再次讲解)。

039fd3c2fae57f18b26752d3f9ebe86f.png273c2676f3c2373d7dd436170586d5ef.png273c2676f3c2373d7dd436170586d5ef.png273c2676f3c2373d7dd436170586d5ef.png273c2676f3c2373d7dd436170586d5ef.png

特殊功能寄存器

前面也曾讲过,对单片机的编程,基本可以说是对单片机内部寄存器的操作,五种中断所涉及到的特殊寄存器以及各个位的功能讲解如下:

IE寄存器(中断允许控制寄存器)

IE:EAXXESET1EX1ET0EX0

其中,EA为总中断允许位,ES为串口中断允许位。

ET1、ET0分别是定时器/计数器1与定时、计数器0中断允许位。

EX1、EX0为外部中断1与外部中断0中断允许位。

可以看到,IE寄存器可以控制所有中断的开关,而且支持位寻址。

TCON寄存器(定时器/计数器控制寄存器)TCON:TF1TR1TF0TR0IE1IT1IE0IT0

其中,TF1、TF0分别为定时器T1/T0溢出标志位,当定时器溢出时状态改变,无需手动设置。

TR1/TR0分别为定时器1/定时器0中断允许位

IE1/IE0分别为外部中断请求标志位,IT1/IT0分别设置两个外部中断源的触发方式(0上升沿触发,1下降沿触发)。

TCON寄存器支持位寻址。

TMOD寄存器(定时器/计数器模式控制寄存器)

TMOD:GATEC/TM1M0GATEC/TM1M0

其中,GATE为门控制位,当此位为1时,外部中断被触发与定时器中断允许位同时为1,才会开启定时器/计数器。

两个C/T位,分别是定时器/计数器1模式选择位,0为定时器模式,1为计数器模式。

M1M0,设置定时器/计数器1/0工作方式,00为13位定时/计数器模式,01为16位定时器/计数器模式,10为8位定时/计数器自重装模式(就是自动归零),11则是指将T0分为两个8位定时/计数器,T1停止计数。

要注意的是,TMOD不支持位寻址,只能对整体赋值

T0寄存器组:TH0TL0

T1寄存器组:TH1TL1

以上两种寄存器分别是定时/计数器的计数初值设定,TH是高八位,TL指低八位,这两者共同控制定时器/计数器溢出的时间(在定时/计数器中断一节会详细讲解)

从上面的总体介绍中,我们单独提取外部中断需要设置的寄存器:IE寄存器中的EA、EX,TCON中的IT1、IT0,同时需要接线P3^2、P3^3外部中断引脚

接下来,我们将会在上次流水灯的项目基础上,使用外部中断的方式让按钮控制流水灯的切换

原理图

本项目新增Button元件(按钮),原理图如下:

cafbdc78527ff63551508408bd1231f7.png

说明:

emm,没什么特别好说的,看图连接就行了,注意整洁美观。

ac5cb0d741e922f707dc3b5ddf4cb9fc.png273c2676f3c2373d7dd436170586d5ef.png273c2676f3c2373d7dd436170586d5ef.png273c2676f3c2373d7dd436170586d5ef.png273c2676f3c2373d7dd436170586d5ef.png

keli中的代码

#include

#include

sbit k0 = P3^2;

sbit k1 = P3^3;

sbit LED = P2^0;

void IntInit()

{

EA = 1;//打开总中断

IT0 = 1;//设置触发方式为下降沿

EX0 = 1;

IT1 = 1;

EX1 = 1;

P0 = 0x01;

k0 = k1 = 1;

}

void main()

{

IntInit();

while(1);

}

void Int0() interrupt 0

{

if(k0 == 0)

{

P0=P0>>1;

}

if(P0==0x00)

{

P0 = 0x80;

}

}

void Int1() interrupt 2

{

LED = 0;

if(k1 == 0)

{

P0=P0<<1;

}

if(P0==0x00)

{

P0 = 0x01;

}

}

说明

说明:

1.头文件中包含了很多汇编会用的操作,比如这个项目中使用的左移右移运算,可以大大简化代码

2.IntInit()函数主要用来初始化外部中断,其中语句的顺序可以调换,可以依照自己的习惯或者记忆方式,自行设计安排。

3.void Int0() interrupt 0 、void Int1() interrupt 2分别对应外部中断0与外部中断1,interrupt之后跟的数字就是我们之前说的优先级标号,格式不能错,编号一定一一对应,名字各自随便修改(依照C语言命名规范),函数里面的内容就是中断后执行的程序。

实验现象

f57384ad450b53d66428b15203148c5a.png

分别按下两个按钮,可以观察到LED灯向左/右接力闪烁,证明实验成功。

f304fd8f277dce777d639d1e8db82904.png

另外:

剩下两天基础课程的学习难度将会提升,定时器/计数器中断以及串口中断的学习,将要比今天的课程难度提升不少

不过,稳扎稳打,多做实验,你会发现也没有什么大不了。加油!

ce320d272087ca6676f58de0a7c69c5e.pnga122808377562edebcba63dd3737f053.png

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

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

相关文章

网线制作ppt_快速制作PPT技巧!

为什么同样的PPT&#xff0c;你花费了一天&#xff0c;我却只用了一小时&#xff1f;在我仔细观察了一些制作人员的操作后&#xff0c;总结了如下实用技巧&#xff01;01自定义访问工具栏在PPT中我们有很多的常用操作&#xff0c;例如「左对齐/右对齐」「置于底层/置于顶层」「…

JdbcTemplate(操作数据库-查询返回值)

目录 JdbcTemplate&#xff08;操作数据库-查询返回值&#xff09; 1.创建数据库 2.创建实体类 3.创建dao层 4.创建service层 5.创建测试类&#xff1a; 6.xml配置 7.测试结果&#xff1a; 8.结构示意&#xff1a; JdbcTemplate&#xff08;操作数据库-查询返回值&…

c++opencv显示中文_OpenCV安装,配置和运行

今天小崔有个项目功能想用OpenCV软件库实现一下&#xff0c;就安装了OpenCV,在这里给大家分享一下安装过程。一.什么是OpenCV OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量…

qt 当前窗口句柄_QT获取Windows系统所有窗口句柄

#include #include #pragma comment(lib,"user32.lib")/* 回调函数&#xff0c;用于捕获进程 */BOOL MyEnumProc(HWND hwnd, LPARAM param){LPWSTR lpString (LPWSTR)malloc(sizeof(WCHAR) * MAX_PATH);if (IsWindow(hwnd) &&IsWindowEnabled(hwnd) &&a…

JdbcTemplate(操作数据库-查询返回对象、查询返回集合)

JdbcTemplate&#xff08;操作数据库-查询返回对象、查询返回集合&#xff09; 1.创建数据库 数据库中有三条记录&#xff0c;数据库名为user_db&#xff0c;数据库表为t_book 2.新建实体类&#xff1a; Book类中的每一个属性对应数据库中的一条记录 package org.example.sp…

hbase 查询设置超时_hbase master挂掉-zookeeper连接超时原因

并行运行hbase删表&#xff0c;建表操作&#xff0c;多个表多个region&#xff0c;导致hbase挂掉。查看日志&#xff1a;从日志中可以看出GC时间过长导致zookeeper连接超时&#xff0c;master退出。(是master退出而不是regionserver退出是因为进行的操作是建表&#xff0c;删表…

机器学习如何计算特征的重要性_机器学习之特征工程

特征选择是特征工程中的一个子集&#xff0c;从所有的特征中&#xff0c;选择有意义的&#xff0c;对模型有帮助的特征&#xff0c;以避免将所有特征中对模型没作用的特征导入模型去训练&#xff0c;消耗不必要的计算资源。更正式地说&#xff0c;给定n个特征&#xff0c;我们搜…

白中英 计算机组成原理_计算机组成原理 第五版.立体化教材 白中英 大学教材...

目 录第1章 计算机系统概论第2章 运算方法和运算器第3章 多层次的存储器第4章 指令系统第5章 中央处理器第6章 总线系统第7章 外存与IO设备第8章 输入输出系统第9章 并行组织与结构关于我们大学生必备资源库为大学生提供网课答案、大学课后答案、软件安装、大学考试考证资源以及…

Spring事务操作-事务

目录 Spring事务操作-事务 1.什么是事务 &#xff08;1&#xff09;典型场景 2.事务的四个特性&#xff08;俗称ACID特性&#xff09; &#xff08;1&#xff09;原子性 &#xff08;2&#xff09;一致性 &#xff08;3&#xff09;隔离性 &#xff08;4&#xff09;持久性…

ios 静态库合成_iOS : 静态库(.framework)合并

如果写了一个Framework&#xff0c;根据Build时选择的机器类型&#xff0c;会分为模拟器Framework和真机Framework&#xff0c;两者是不能混用的。此时可以通过配置一个Run Script&#xff0c;在Script中使用lipo命令来合并两个版本的Framework&#xff0c;重新生成一个新的Fra…

python在统计专业的应用_Python:使用Counter进行计数统计

计数统计就是统计某一项出现的次数。实际应用中很多需求需要用到这个模型。比如测试样本中某一指出现的次数、日志分析中某一消息出现的频率等等‘这种类似的需求有很多实现方法。下面就列举几条。 (1)使用dict 看下面代码#codingutf-8 data [‘a‘,‘2‘,2,4,5,‘2‘,‘b‘,4…

Spring事务操作-事务引入

目录 Spring事务操作-事务引入 1.模拟异常 2.测试异常 3.没有使用spring框架的时候异常该如何处理 4.使用spring框架的时候异常该如何处理 5.在spring 进行声明式事务管理&#xff0c;底层使用AOP 6.spring 事务管理API 7.事务操作&#xff08;注解声明式事务管理&…

oracle中取反_oracle正则表达式regexp_like的用法详解

oracle正则表达式regexp_like的用法详解更新时间&#xff1a;2013年06月13日 17:42:05 作者&#xff1a;本篇文章是对oracle正则表达式regexp_like的用法进行了详细的分析介绍&#xff0c;需要的朋友参考下/*ORACLE中的支持正则表达式的函数主要有下面四个&#xff1a;1&…

在r中rowsums_用R进行数据分析-05

20-矩阵与数组一、矩阵的定义矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集。向量是一维的&#xff0c;而矩阵是二维的&#xff0c;需要有行和列。R中&#xff0c;矩阵是有维数的向量&#xff0c;但元素必须拥有相同的模式&#xff0c;此和向量一致…

python字典和集合对象可以进行索引操作_Python中的字典跟集合整理笔记

泛映射类型映射类型&#xff1a;不仅仅是dict&#xff0c;标准库里的所有映射类型都是利用dict来实现的&#xff0c;因此它们有个共同的限制&#xff0c;即只有可散列的数据类型才能用做这些映射的键。(只有键有这个需求&#xff0c;值并不需要必须是可散列的数据类型。)什么是…

JAVA入门级教学之(super的内存示意)

Super的原理&#xff1a; 代表的是当前对象this的父类型特征 如果类加载过程中&#xff0c;这个类有静态代码块&#xff0c;有静态变量&#xff0c;一律都会执行&#xff0c;系统会先分配空间 只要方法调用&#xff0c;就一定会进行方法压栈 new一个方法&#xff0c;其实是调用…

python博客项目评论_Python 爬虫入门——小项目实战(自动私信博客园某篇博客下的评论人,随机发送一条笑话,完整代码在博文最后)...

之前写的都是针对爬虫过程中遇到问题的解决方案&#xff0c;没怎么涉及到实际案例。这次&#xff0c;就以博客园为主题&#xff0c;写一个自动私信博客下的评论人员(在本篇留下的评论的同学也会被自动私信&#xff0c;如果不想被私信&#xff0c;同时又有问题&#xff0c;请私信…

JAVA入门级教学之(猜数字测试)

一个类A有一个实例变量v&#xff0c;从键盘接受一个正整数作为实例变量v的初始值 另外再定义一个类B&#xff0c;对类A的实例变量v进行猜测 如果大了则提示大了 如果小了则提示小了 等于则提示测试成功 猜测数字比大小的测试&#xff1a; /*** author LBJ* version V1.0* P…

硬盘突然提示没有初始化_新硬盘的分区

★前言如果你添加了一个新硬盘到电脑上&#xff0c;但是它没有在文件管理器中出现&#xff0c;你可能需要为它分配一个盘符&#xff0c;或者对它进行初始化并分区才能使用。★警告在分区时&#xff0c;”删除磁盘分区“和”格式化“都会清空该分区的数据&#xff0c;请提前备份…

正高职称 程序员_正高级工程师评审条件最新版

.精选范本正高级工程师评审条件申报条件&#xff1a;学历资历条件具有大学本科以上学历&#xff0c;取得高级工程师资格后&#xff0c;从事本专业工作满5年。外语、计算机、继续教育条件(一)按照规定参加国家统一组织的职称外语和计算机应用能力考试&#xff0c;取得合格证&…