nullnull单片机的中断系统单片机中断系统单片机中断系统中断的定义
所谓中断,是指CPU正在处理某些事务的时候,外部又发生了某一事件,请求CPU及时处理。于是,CPU暂时中断当前的工作,转而处理所发生的事件。处理完毕,再回到原来被中断的地方,继续原来的工作。这样的过程,称为中断。
中断示意图中断示意图null①中断源
②中断申请
③开放中断
④保护现场
⑤中断服务
⑥恢复现场
⑦中断返回中断涉及的几个环节手机手机铃声响了 提醒你去接你准备去接电话一开始你正在看我的视频
在电脑上暂停我的这个视频教程你开始接电话挂断电话 回来继续看我的视频教程AT89S52单片机的中断源及TCONAT89S52单片机的中断源及TCON S52系列有6个中断源(比S51多一个T2)
2个外部中断请求:INT0,INT1
3个片内定时器/计数器T0和T1中断请求:
TF0,TF1,(TF2)
1个串行口中断请求:TI/RInull定时器控制寄存器TCON (88H)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCONTF0/TF1:定时器0/定时器1溢出中断申请标志位:
=0:定时器未溢出;
=1:定时器溢出申请中断,进中断后自动清零。TR0/TR1:定时器运行启停控制位:
=0:定时器停止运行;
=1:定时器启动运行。TCON:Timer控制寄存器,是管理定时器工作的SFR(其中低4位管外部中断)null定时器控制寄存器TCON (88H)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCONIE0/IE1:外部中断申请标志位:
=0:没有外部中断申请;
=1:有外部中断申请。IT0/IT1:外部中断请求的触发方式选择位:
=0:在INT0/INT1端申请中断的信号低电平触发;
=1:在INT0/INT1端申请中断的信号负跳变触发.TCON:Timer控制寄存器,低4位管理外部中断null在CPU已经开放了外部中断允许的前提下:
在INT0/INT1引脚输入一个负脉冲或低电平,
TCON寄存器中的IE0/IE1标志位自动变“1”,
检测到IE0/IE1变“1”后,将产生指令:
执行中断服务程序,
并将IE0/IE1标志位自动清“0”,以备下次申请。外部中断(INT0,INT1)申请过程TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCONnull EA — ET2 ES ET1 EX1 ET0 EX0IE中断允许寄存器IE (0A8H) EX0/EX1/ET1/ET0/ES 位:
分别是INT0/1,Timer0/1,串行口的中断允
许控制位:
=0 时禁止中断; =1 时允许中断。
ET2:T2中断允许控制位(仅52系列有)
=0 时禁止中断; =1 时允许中断。
EA:总的中断允许控制位(总开关):
=0 时禁止全部中断;=1 时允许中断。null中断系统硬件结构注:各中断允许控制位=0,开关断开; =1,开关接通IE0EX0TF0IE1TF1TIESET1EX1ET0外部中断 请求0外部中断 请求1内部 定时器0内部 定时器1内部 串行口TRRIIE寄存器 EA位IP寄存器各单路开关总开关中断源标志位查询机构高中断级中断请求低中断级中断请求中断入口中断源标志位INT0INT1中断入口中断源标志位null — — PT2 PS PT1 PX1 PT0 PX0IPPX0/PX1:INT0/1优先级控制位:
=0 时属低优先级; =1 时属高优先级。
PT0/PT1/PT2:T0/1/2中断优先级控制位:
=0 时属低优先级; =1 时属高优先级。
PS1:串行口中断优先级控制位:
=0 时属低优先级; =1 时属高优先级。中断优先级控制寄存器IP (0B8H)【例】PX1=1;外中断INT1被设置成高优先级
PT0=0;定时器T0被设置成低优先级
总线方式
IP=0x04;//IP=0000 0100 将PX1设为1 PT0设为0;null对同时发生多个中断申请时:
☞不同优先级的中断同时申请(很难遇到)
——先高后低
☞相同优先级的中断同时申请(很难遇到)
——按序执行
☞正处理低优先级中断又接到高级别中断
——高打断低
☞正处理高优先级中断又接到低级别中断
——高不理低中断优先级处理原则单片机的中断矢量与优先级单片机的中断矢量与优先级中断矢量: 单片机的 6 个中断源分别对应有各自的中断服务程序入口地址——中断矢量最高优先级
最低优先级null5.interrupt m 修饰符 interrupt m C51中断函数必须通过它进行修饰。在C51程序
中,当函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按51系统中断的处理方式自动把它安排在程序存储器中的相应位置。 在该修饰符中,m的取值为0~31,对应的中断情况如下:
0——外部中断0
1——定时/计数器T0
2——外部中断1
3——定时/计数器T1
4——串行口中断
5——定时/计数器T2
其它值预留。null
C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。null【例】编写一个用于统计外中断0的中断次数的中断服务程序
int x;
void int0() interrupt 0 using 1
{
x++;
}using n修饰符
修饰符using n用于指定本函数内部使用的工作寄存器组,其中n的取值为0~3,表示寄存器组号。
可以省略 省略后系统自动选择null中断函数注意如下:
(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。
(2)中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。null单片机的定时/计数器定时器计数器的概念定时器计数器的概念一、计数的概念 选票:画“正”。这就是计数,生活中计数的例子处处可见。比如一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。51单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16位的计数器,最大的计数量是65536。 二、定时 计数器是如何作为定时器来用的呢?比如一个闹钟,将它定时在1个小时后响闹,我们也能说成是秒针走了(3600)次,所以时间就转化为秒针走的次数的,也就是计数的次数了,可见,计数的次数和时间之间十分相关。那么它们的关系是什么呢?也就是秒针每一次走动的时间要正好是1秒。 只要计数脉冲的间隔相等,则计数值就代表了时间的流逝。由此,单片机中的定时器和计数器是同一个东西,只不过计数器是记录的外部的触发脉冲,而定时器则是由单片机供给一个非常稳定的计数源。供给定时器的是计数源是机器周期null也就是由单片机的晶体震荡器经过12分频后获得的一个脉冲源(机器周期)。晶振的频率是很准确的,所以这个计数脉冲的时间间隔也很准。一个12M的晶振,它供给给计数器的脉冲时间间隔是1微秒。计数脉冲的间隔与晶振有关,12M的晶振,计数脉冲的间隔是1微秒。这是逻辑图,可以看到T1是一个单刀双掷开关,说明定一个定时/计数器同一时刻要么作定时用,要么作计数用,不能同时用;
接通T1引脚时作为外部计数用。(T0的引脚是P3.4,T1的引脚是P3.5)。 null比如滴水的例子,当水持续落下,盆中的水逐渐变满,最终会有一滴水使得盆中的水全满了。这个时候如果再有一滴水落下,水会漫出来,用术语来讲就是“溢出”,而每一滴水落下,用术语来说就是发出一个计数脉冲。 水溢出是流到地上,而计数器溢出后就会引发一个定时中断事件,就象定时的时间一到,闹钟就会响一样。
现在另一个问题是:要有多少个计数脉冲才会产生事件。
刚才已研究过,计数器的容量是16位,也就是最大的计数值到65536,因此计数计到65536就会产生溢出。这个没有问题,问题是我们现实生活中,经常会有少于65536个计数值的要求,如制药厂包装线上,一瓶药片为100粒,500瓶为一箱 那么怎么样来满足这个要求呢?
举例 如果是一个空的水盆要1万滴水滴进去才会满,我在开始滴水之前就先放入一勺水,还需要10000滴吗?对了,这时我们就采用预置数的办法,我要计 100,那我就先放进65436,再来100个脉冲,不就到了65536了吗。定时也是如此,每个脉冲是1微秒,则计满65536个脉冲需时65.536 毫秒,但现在我只要10毫秒,怎么办?10个毫秒为10000个微秒,所以,只要在计数器里面放进55536就可以了。溢出的概念和设置任意定时计数的
null3个16位定时器/计数器
——(51系列有2个16位Timer少一个T2)
定时器:对片内机器时钟(周期方波)进行计数
计数器:对Tx引脚输入的负脉冲进行计数与Timer工作有关的特殊功能寄存器:
TCON 和 TMODAT89S52单片机的定时器/计数器单片机定时/计数器内部结构单片机定时/计数器内部结构单片机定时/计数器内部结构图null定时器的2个特殊功能寄存器(TCON)TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0定时器控制寄存器TCON (88H)TF0/TF1: 定时器0/1计数溢出标志位。
=1 计数溢出; =0 计数未满
TF0/TF1标志位可用于申请中断或供CPU查询。
在进入中断服务程序时会自动清零;但在
查询方式时必须软件清零。TR0/TR1: 定时器0/1运行控制位。
=1 启动计数; =0 停止计数nullTR0/TR1:定时器0/1运行控制位:
TR0/TR1 =0 时,Timer0/1停止计数
TR0/TR1 =1 时,Timer0/1启动计数定时器T0/T1 中断申请过程 在已经开放T0/T1中断允许且已被启动的前提下:
T0/T1加满溢出时 TF0/TF1标志位自动置“1” 检测到TCON中TF0/TF1变“1”后,将产生指令:
执行中断服务程序,
TF0/TF1标志位会自动清“0”,以备下次中断申请。 定时/计数器可按片内机器周期定时,也可对由T0/T1引脚输入一个负脉冲进行加法计数TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0TCON (88H)nullGATE C / T M1 M0 GATE C / T M1 M0定时器方式寄存器TMOD (89H)T1T0M1,M0:工作方式定义位 ( 定义4 种方式 ):C/T :计数器/定时器选择位
= 1 外部事件计数器。对T0/T1引脚的负脉冲计数;
= 0 片内时钟定时器。对机器周期脉冲计数定时0 0:13位 定时器——几乎不用
0 1:16位 定时器——经常用到
1 0:可自动重装的 8位 定时器——经常用到
1 1:T0 分为2个8位 Timer;T1 此时不工作
——几乎不用nullGATE C / T M1 M0 GATE C / T M1 M0T1T0GATE门控位: Timer可由软件与硬件两者控制
GATE = 0 ——普通用法
Timer的启/停由软件对TRx位写“1”/“0”控制定时器方式寄存器TMOD(89H) GATE = 1 ——门控用法
Timer的启/停由软件对TR0/TR1位写“1”/“0”
和在INT0/INT1引脚上出现的信号的高/低共同控制null GATE=0时,定时/计数是否工作,只取决于TR0是否为1。GATE=1,只有TR0为1,且INT0管脚也是高电平,定时/计数才工作。
从
上看到GATE是一个非门,它与INTx组成一个或门,这个或门与TR0又组成一个与门。当GATE=0时,则~GATE=1(非门),此时无论INT0为高或低,它们相或之后必然为1,此时只要TR0=1,则工作,TR0=0则不工作,不受INT0的影响。当GATE=1时,~GATE=0,则INT0=1时,它们相或为1,此时定时器是否工作受TR0影响;若INT0=0,则无论TR0为什么,定时器都不能工作,即当GATE=0时,定时器受INT0和TR0共同的作用。
所以,GATE位的状态决定定时器运行控制取决于TR0的一个条件还是TR0和INT0引脚这两个条件。当GATE=1时,由于GATE信号封锁了与门,使引脚 INT0信号无效。而这时候如果TR0=1,则接通模拟开关,使计数器进行加法计数,即定时/计数工作。而TR0=0,则断开模拟开关,停止计数,定时 /计数不能工作。
当GATE=0时,与门的输出端由TR0和INT0电平的状态确定,此时如果TR0=1,INT0=1与门输出为1,允许定时/计数器计数,在这 种情况下,运行控制由TR0和INT0两个条件共同控制,TR0是确定定时/计数器的运行控制位,由软件置位或清“0”。振荡器12TLx THx (8位) (8位)TFx申请中断Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制 开关或门与门非门定时器结构与工作方式定时器结构与工作方式工作方式1:——16位的定时/计数器在工作方式1下,计数器的计数值范围是: 1~65536(216) 当为定时工作方式1时,定时时间的计算公式为: (216—计数初值)╳晶振周期╳12或 (216—计数初值)╳机器周期 其时间单位与晶振周期或机器周期相同。 null THx/TLx赋初值:THx赋高8位,TLx赋低8位工作方式1 的编程要点: TMOD选方式: 写“M1,M0”=01 选方式1 若不用门控位,直接用软件写TRx控制启/停
若使用门控位,先置位TRx,然后由INTx端
的高/低电平来控制其启/停 若要允许中断,还须先置位ETx、EA等中断
允许控制位,并编写中断服务程序
若不用中断,可查询“计数溢出标志TFx”
的方式工作,但溢出标志TFx须软件清0null工作方式2:——8 位自动重装的定时/计数器振荡器12TLx (8位)TFx申请中断Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制 =1开关接通或门与门THx (8位)溢出位门开null☞ THx/TLx赋相同初值
在TLx计数达到0FFH 再加“1”时,TL0
将溢出,进位位直接进入“TFx”去申请
中断,同时打开三态门,使THx中的值
自动重装(Copy)进TLx工作方式 2 的编程:☞ TMOD寄存器选方式:
写“M1,M0” = 10选中方式2☞ 其他用法与各种方式1完全相同nullT0: 组织成TL0和TH0两个8位定时/计数器Timer工作方式 3 ——几乎无用T1: 不再是定时/计数器了
T1 的TR1和TF1出借给TH0当控制位使用,
剩下的TH1/TL1寄存器只能当作普通寄存
器用。null振荡器12TL0 (8位)TF0申请中断T0端TR0位GATE位INT0端≥1&C/T=0C/T=1控制 =1开关接通或门与门TH0 (8位)TF1申请中断TR1位控制 =1Timer工作方式 3 结构:☞T0成为双 8位Timer ☞T1不再有Timer功能 ☞TF1,TR1出借给TH0 null定时器小结: (2个16位加法计数器)☞运行/停止由TRx位控制,(当GATE=1时:
由TRx位和Tx引脚上的信号共同控制)☞工作方式由TMOD决定;
计数/定时由C/T位决定
工作方式0(13位) 永远不用
工作方式3(T0拆为双8位) 几乎无用
工作方式1(16位) 经常用到
工作方式2(8位自动重装) 经常用到☞从初值按机器周期或外部脉冲递加,溢出位
TFx申请中断;中断允许由ETx位和EA位控制,null定时器/计数器的定时/计数范围
工作方式0:13位定时/计数方式,因此,最多能计到2的13次方,也就是8192次。
工作方式1:16位定时/计数方式,因此,最多能计到2的16次方,也就是65536次。
工作方式2和工作方式3,都是8位的定时/计数方式,因此,最多能计到2的8次方,也说是256次。
预置值计算:用最大计数量减去需要的计数次数即可。null串行口与串行通信null串行通信的基本特征是数据逐位顺序进行传送
串行通信的格式及约定(如:同步方式、通讯速率、数据块格式、信号电平……等)不同,形成了多种串行通信的协议与接口
。
常见的有:
☞通用异步收发器(UART)——本课程介绍的串口
☞通用串行总线(USB)
☞I2C总线
☞CAN总线
☞SPI总线
☞RS-232C, RS-485, RS422A标准……等等null全双工串行接口(UART)☞数据通信的几个术语:
并行:数据各位同时进行传送
串行:数据逐位顺序进行传送☞全双工:(串行通信)收/发可同时进行
半双工:(串行通信)收/发不可同时进行☞异步串行通信:以字符为单位进行传送
同步串行通信:以数据块为单位进行传送
波特率(bps.):单位时间传送的位数null51单片机的串行接口SBUF(发)SBUF(收)发送控制器 TI接收控制器 RI移位寄存器波特率发生器T11A累加器(门)移位寄存器RxDTxD去申请中断引脚引脚CPU内部null SM0 SM1 SM2 REN TB8 RB8 TI RISCON☞ SM0,SM1:串行口4种工作方式的选择位。
0 0 方式0:8位移位寄存器I/O,波特率固定为 fosc/12
0 1 方式1:8位UART(1+8+1位),
波特率可变,按公式计算
1 0 方式2:9位UART(1+8+1+1位),
波特率固定=fosc x1/32或1/64
1 1 方式3:9位UART(1+8+1+1位),
波特率可变,按公式计算☞ SM2:串行口多机通信控制位
(作为方式2、方式3的附加控制位)串行口控制寄存器SCON(98H)null☞ RI,TI:串行口收/发数据申请中断标志位
=1 申请中断; =0 不申请中断☞ TB8:方式2、3中,是要发送的第9位数据。
多机通信中,TB8=0 表示发送的是数据;
TB8=1 表示发送的是地址。(奇偶校验)☞ RB8:在方式2、3中,是收到的第9位数据。
在多机通信中,用作区别地址帧/数据帧的
标志。(奇偶校验) SM0 SM1 SM2 REN TB8 RB8 TI R1☞ REN:串行口接收允许控制位
= 1 表示允许接收; = 0 禁止接收。SCONnullSMOD — — — GF1 GF0 PD 1DL电源控制寄存器 PCON(97H)
——特殊功能寄存器PCON不能按位寻址——☞ SMOD:在串行口工作方式 1、2、3 中,
是波特率加倍位
=1 时,波特率加倍
=0 时,波特率不加倍。
(在PCON中只有这一个位与串口有关) PCON串行口工作方式 0串行口工作方式 0工作方式0:8位移位寄存器I/O方式☞发送:SBUF中的串行数据由RxD逐位移出;
TxD输出移位时钟,频率=fosc1/12;
每送出8位数据 TI就自动置1;
需要用软件清零 TI。 ☞接收:串行数据由RxD逐位移入SBUF中;
TxD输出移位时钟,频率=fosc1/12;
每接收 8位数据RI就自动置1;
需要用软件清零 RI。null☞经常配合“串入并出”“并入串出”移位
寄存器一起使用扩展接口 74HC164 74HC165等
我们开发板不涉及这方面 所以不做讲解工作方式0:8位移位寄存器I/O方式null☞常用于串行通讯。除发/收8位数据外,还
在D0位前有一个起始位“0”;
在D7位后有一个停止位“1”。☞方式1工作时:
发送端自动添加一个起始位和一个停止位;
接收端自动去掉一个起始位和一个停止位。工作方式1:8位UART(1+8+1位)波特率可变
☞波特率可变
——用定时器T1作波特率发生器:
公式:波特率 =(2SMOD/32)T1的溢出率null波特率=(2SMOD/32)T1的溢出率☞ 溢出率:T1溢出的频繁程度
即:T1溢出一次所需时间的倒数。☞ 初值 X = 2n - 2SMOD fosc
32 波特率 12☞ 波特率 =2SMOD fosc
32 12(2n - X)其中:X 是定时器初值null☞ 初值 X = 2n - 2SMOD fosc
32 波特率 12☞ 用T1工作于方式2来产生波特率1200,
已知晶振频率=6MHz。要求出T1的初值:初值 X = 28 - 20 6106
32 1200 12= 256 - = 256 - 13.026106
460800 243 = 0F3H ——结果后面要用到null 常用波特率和T1初值查表null☞RxD引脚为接收端,TxD引脚为发送端,由波特率
发生器T1控制发送速度,不同于方式0:收/发都
需要由TxD送出移位时钟。 ☞T1作波特率发生器时初始化包括:
选定时器工作方式2(TMOD选8位自动重装);
将计算出的初值X赋给TH1,TL1;
启动T1 (TR1=1);
注意!对T1不要开中断 !!工作方式1的接收/发送☞串行口的初始化包括:
对SCON选工作方式
对PCON设波特率加倍位“SMOD”(缺省值=0)
如果是接收数据,仍要先置“1”REN位 null SM0 SM1 SM2 REN TB8 RB8 TI R1SCON☞ SM0,SM1:串行口工作方式选择位。
0 1 :方式1,8位UART(1+8+1位) ☞ REN:串行口接收允许位。 REN=1 允许接收串行口控制寄存器SCON 0 1 0 1 0 0 0 0☞ TB8,RB8,TI,RI等位由运行中间的情况
决定,可先写成 “0”☞ SM2:串行口多机通信控制位,作为方式2、3
的附加控制位,此处不用,可写成“0”null☞由于波特率固定,常用于单片机间通讯。
数据由8+1位组成,通常附加的一位
(TB8/RB8)用于“奇偶校验”。 工作方式2:
9位UART(1+8+1+1位)两种波特率 ☞方式2的波特率 = fosc 2SMOD/64
即: fosc 1/32 或 fosc 1/64 两种null☞奇偶校验是检验串行通信双方传输的数据正确与否的一个措施,并不能保证通信数据的传输一定正确。
换言之:如果奇偶校验发生错误,表明数据传输一定出错了;如果奇偶校验没有出错,绝不等于数据传输完全正确。☞奇校验:8位有效数据连同1位附加位中,
二进制“1”的个数为奇数
偶校验:8位有效数据连同1位附加位中,
二进制“1”的个数为偶数null☞约定接收采用奇校验
若接收到的9位数据中“1”的个数为奇数,
则表明接收正确,取出8位有效数据即可;
若接收到的9位数据中“1”的个数为偶数,
则表明接收出错!应当进行出错处理。☞约定发送采用奇校验
若发送的8位有效数据中“1”的个数为偶数,
则要人为添加一个附加位“1”一起发送;
若发送的8位有效数据中“1”的个数为奇数,
则要人为添加一个附加位“0”一起发送。采用偶校验时,处理方法与奇校验相反 null回顾:
程序状态字寄存器PSW中有一个奇偶状态位 PCYACF0RS0OVPRS1PSW.7PSW.0 P (PSW.0):奇偶状态位。
P=1 表示目前累加器中 “1”的个数为奇数
P=0 表示目前累加器中 “1”的个数为偶数
CPU随时监视着Acc的“1”的个数并自动反映在 P工作方式2 的奇偶校验用法null串口方式2 的奇偶校验用法: SM0 SM1 SM2 REN TB8 RB8 TI R1SCON串行口控制寄存器SCONTB8 RB8null工作方式3:当SM0,SM1为11时,串行口工作于方式3
9位UART(1+8+1+1位) 波特率可变 串口方式3和方式2唯一的区别是波特率机制不同。
☞方式2的波特率固定为时钟周期的32或64分频,不可变。此工作方式与其他串行通讯设备连接困难,因此不常用。
☞方式3的波特率可变,按前面的公式计算: 波特率=(2SMOD/32)T1的溢出率☞ 波特率 =2SMOD fosc
32 12(2n - X)其中:X 是定时器初值