重拾单片机 第三天 中断讲解(一)

52单片机:

中断源:

INTO0--外部中断0,由P3.2端口线引入,低电平或下降沿引起。

INTO1--外部中断1,有P3.3端口线引入,低电平或下降沿引起。

T0--定时器/计数器0中断,由T0计数器计满回零引起。

T1--定时器/计数器1中断,由T1计数器计满回零引起。

T2--定时器/计数器2中断,由T2计数器计满回零引起。

TI/RI--串口中断,串行端口完成一帧字符发送/接收后引起。

单片机在使用中断功能时,通常需要设置两个与中断有关的寄存器:

①中断允许寄存器IE

②中断优先级寄存器IP

一,中断允许寄存器 IE

功能:

EA-- 全局中断允许位

EA=1 打开全局中断控制

EA=0 关闭全部中断

ET2  定时器/计数器2中断允许位

ET2=1   打开T2中断

ET2=0 关闭T2中断

ES 串行中断允许位

ET1 定时器1中断允许位

EX1 外部中断1允许位
ET0 定时器/计数器0中断允许位

EX0 外部中断允许位

二,中断优先级寄存器IP

PS 串行优先级控制位

PS=1 串行口中断定义为高优先级中断

PS=0 串行口中断定义为低优先级中断

PT1 定时器/计数器1优先级控制位

PX1 外部中断1中断优先级控制位

PT0 定时器/计数器0优先级控制位

PX0 外部中断0中断优先级控制位

注意:定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作用,CPU一旦设置开始启动定时功能后,定时器便在晶振的作用下自动开始计时,当定时器计数计满后,会产生中断,即通知CPU该如处理。

单片机在使用定时器/计数器功能时,通常需要设置两个与定时器有关的寄存器:

①工作方式寄存器TMOD

②控制计数器TCON

一,工作方式寄存器TMOD

GATE 门控位

GATE=0 定时器/计数器启动与停止仅受TCON寄存器中TRX(X=0,1)来控制

GATE=1 定时器/计数器启动与停止由TCON寄存器中TRX(X=0,1)和外部中断引脚(INT0或INT1)上的电平状态来共同控制

C/T 定时器模式和计数器模式选择位(1为计数器模式,0为定时器模式)

M1M0 工作方式选择位

每个定时器有4个工作方式,他们由M1M0设定

二,定时器/计数器控制寄存器TCON

IF1   定时器1溢出标志位

TR1  定时器1运行控制位

由软件清零关闭定时器1,当GATE=1,且INT1为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器1

IE1  外部中断1请求标志

当IT0=1时为电平触发方式,每个机器周期的S5P2采样INT1引脚,若INT1脚为低电平。则置1,否则IE1清0.

当IT1=0时,INT1为跳变沿触发,当第一个机器周期采样到INT1为低电平时,则IE1置1,便是外部中断1正向CPU申请中断,当CPU响应中断,转向中断服务程序时,该位由硬件清0.

IT1   外部中断1触发方式选择位

IT1=0  为电平触发模式,引脚INT1上低电平有效

IT1=1 为跳变沿触发模式,引脚INT1上下降沿有效

IE0 同上

IT0 同上

计算定时器的初值问题

52单片机内部有12倍的分频,假设采用的是12MHZ的晶振,那么12个时钟周期为一个机器周期,那么此时机器周期就是1us。以定时器1,工作方式1为例。16位的计数器

溢出一次需要计数2^16-1个数=65536。约为65.5ms

如果要定时50ms的话,(65536-50000)/256 转载到THX

(65536-50000)/256 转载到TLX

公式:

THX=(65536-50000)/256

LTX =(65536-50000)/256

中断服务函数的写法:

void 函数名() interrupt 中断号 using 工作组

{

中断服务程序内容

}

定时器的初始化过程如下

①对TMOD赋值,以确定T0和T1的工作方式

②计算初值,并将初值写入TH0,TL0,或TH1,TL1

③中断方式,则对IE赋值,开放中断

④使TR0或TR1置位,启动定时器/计数器定时或计数

图标:

时间: 2024-12-23 18:15:51

重拾单片机 第三天 中断讲解(一)的相关文章

(二)重拾单片机 第一天 LED灯

由图知道 低电平 亮,高电平 灭 控制第一个 LED1 亮灭程序代码,如下 #include<reg52.h> #define uchar8 unsigned char #define uint16 unsigned int sbit LED1=P1^0; /*****************************/ // 函数名称: DelayMS( ) // 函数功能: 延时 // 入口函数: 延时毫秒 // 出口函数: 无 /********* *******************/

重拾单片机 第二天 数码管的使用 (动态扫描数码管)

我们要实现的功能是什么呢? 从 第一个数码管扫描 1 到第二个数码管 2 ,第三个数码管 3,.......一直到 第8个数码管 显示8 1 /*--------------www.szjcdz.cn-------------------- 2 名称:数码管动态扫描 3 编写:shenhui 4 日期:2015.10.28 5 内容:数码管动态扫描 6 ------------------------------------------------*/ 7 #include<reg52.h>

重拾单片机 第二天 数码管的使用 ( 按下加按键,数值增加直到最大值,按减按键,数值减小,直到最小值 )

1. 1 /*--------------www.szjcdz.cn-------------------- 2 名称:2按键加减操作 3 编写:szjcdz 4 日期:2010.9 5 内容:按下加按键,数值增加直到最大值,按减按键,数值减小,直到最小值 6 ------------------------------------------------*/ 7 #include<reg52.h> 8 #define uchar8 unsigned char 9 #define uint16

重拾单片机 第一天 LED灯

由图知道 低电平 亮,高电平 灭 控制第一个 LED1 亮灭程序代码,如下 1 #include<reg52.h> 2 #define uchar8 unsigned char 3 #define uint16 unsigned int 4 sbit LED1=P1^0; 5 /*****************************/ 6 // 函数名称: DelayMS( ) 7 // 函数功能: 延时 8 // 入口函数: 延时毫秒 9 // 出口函数: 无 10 /*********

重拾c++第三天(5):循环和关系表达式

1.改变步长 for(i=0;i<4;i=i+2) 2.*与++优先级相同,从右向左 3.strcmp函数比较两个字符串,=0两个相同,><0 ----> str1><str2 4.对string直接!=或者==就行 5.二维数组定义 int a[2][2] = { {1,2}, {3,4} } 原文地址:https://www.cnblogs.com/dai-yu/p/12197131.html

编程成长日记——重拾C语言

人生总是需要一个契机才会去改变,其实与其说是契机,也不过是自己再给自己一次机会而已. 重拾C语言,我决定再给自己一次机会,不知道多年以后的我再次翻看这篇博客的时候会是怎样的心情,会不会记得当下身为大三狗的我终于想要告别一事无成,一无所获,一败涂地的颓废而不自知的大学生活,我不想说是为了理想而奋斗,更不是为了中华崛起,只是为了我自己,仅此而已. 感谢比特,给我一次改变的机会. 从零开始学起C语言. --------------------------------------煽情分割线-------

重拾梦想,做更好的自己

亥时,就寝,忽入空灵,甲申年出师已历一纪,诸多记忆电光石火逐一闪现.时年家贫无靠,生计无着,每日波奔却心系梦想,虽日日身疲体倦,却每以<孟子·告子下>篇中名句“天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行指乱其所为,所以动心忍性,曾益其所不能也”以慰寸心,类比篇中清史名人,胸中满溢浩然正气,行事尽显峥嵘:历12载,生活稳定,已婚并育一女,四老体健而心宽,内子贤而持家,小女伶俐活泼,此三项尽得,可谓得意了. 然忆及往昔践行之路与现时行走之途,高下立判,原所行皆可日日前行,步步

重拾算法(5)——最小生成树的两种算法及其对比测试

重拾算法(5)——最小生成树的两种算法及其对比测试 什么是最小生成树 求解最小生成树(Minimum Cost Spanning Tree,以下简写做MST)是图相关的算法中常见的一个,用于解决类似如下的问题: 假设要在N个城市之间建立通信联络网,那么连通N个城市只需N-1条线路.这时自然会考虑这样一个问题:如何在最节省经费的前提下建立这个通信网. 在任意两个城市间都可以设置一条线路,相应地都要付出一定的经济代价.N个城市之间最多可能设置N(N-1)/2条线路,那么如何在这些线路中选择N-1条,

重拾算法(2)——线索二叉树

重拾算法(2)——线索二叉树 上一篇我们实现了二叉树的递归和非递归遍历,并为其复用精心设计了遍历方法Traverse(TraverseOrder order, NodeWorker<T> worker);今天就在此基础上实现线索二叉树. 什么是线索二叉树 二叉树中容易找到结点的左右孩子信息,但该结点在某一序列中的直接前驱和直接后继只能在某种遍历过程中动态获得. 先依遍历规则把每个结点某一序列中对应的前驱和后继线索预存起来,这叫做"线索化". 意义:从任一结点出发都能快速找到