1、位地址8FH8EH8DH8CH8BH8AH89H88H功能T1中断标志T0中断标志INT1中断标志INT1触发方式INT0中断标志INT0触发方式TCON位功能: TF1 T1溢出中断请求标志,T1计数溢出后,TF1=1 TF0 T0溢出中断请求标志 T0计数溢出后,TF0=1 IE1 外中断中断请求标志 当P3.3引脚信号有效时,IE1=1 IE0 外中断中断请求标志 当P3.2引脚信号有效时,IE0=1 IT1 外中断触发方式控制位 IT1=1,边沿触发方式; IT1=0,电平触发方式。 IT0 外中断触发方式控制位 其意义和功能与IT1相似。串行控制寄存器SCONTIRI99H98H串行
2、发送中断标志串行接收中断标志 TI 串行口发送中断请求标志 RI 串行口接收中断请求标志 中断允许控制寄存器IE80C51对中断源的开放或关闭由中断允许控制寄存器IE控制。IE的结构、位名称和位地址如下:IEEAESET1EX1ET0EX0AFHACHABHAAHA9HA8H中断源CPU中断允许控制位串行口中断允许控制位T1中断允许控制位INT1中断允许控制位T0中断允许控制位INT0中断允许控制位 EA CPU中断允许控制位 EA=1,CPU开中; EA=0,CPU关中,且屏蔽所有5个中断源。 EX0 外中断INT0中断允许控制位 EX0=1,INT0开中;EX0=0,INT0关中。 EX1
3、 外中断INT1中断允许控制位 EX1=1,INT1开中;EX1=0,INT1关中。 ET0 定时/计数器T0中断允许控制位 ET0=1,T0开中;ET0=0,T0关中。 ET1 定时/计数器T1中断允许控制位 ET1=1,T1开中;ET1=0,T1关中。 ES 串行口中断(包括串发、串收)允许控制位 ES=1,串行口开中;ES=0,串行口关中。说明: 80C51对中断实行两级控制,总控制位是EA,每一中断源还有各自的控制位。首先要EA=1,其次还要自身的控制位置“1”。三. 中断处理过程 中断处理过程大致可分为四步: 中断请求、中断响应、中断服务、中断返回 中断请求 中断源发出中断请求信号,
4、相应的中断请求标志位(在中断允许控制寄存器IE中)置“1”。 中断响应 CPU查询(检测)到某中断标志为“1”,在满足中断响应条件下,响应中断。 中断响应条件: 该中断已经“开中”; CPU此时没有响应同级或更高级的中断; 当前正处于所执行指令的最后一个机器周期; 正在执行的指令不是RETI或者是访向IE、IP的指令, 否则必须再另外执行一条指令后才能响应。 中断响应操作 CPU响应中断后,进行下列操作: 保护断点地址; 撤除该中断源的中断请求标志; 关闭同级中断; 将相应中断的入口地址送入PC; 80C51五个中断入口地址:INT0:0003H;T0:000BH;INT1:0013HT1:0
5、01BH;串行口:0023H 执行中断服务程序 中断服务程序应包含以下几部分: 保护现场 执行中断服务程序主体,完成相应操作 恢复现场 中断返回 在中断服务程序最后,必须安排一条中断返回指令RETI,当CPU执行RETI指令后,自动完成下列操作: 恢复断点地址。 开放同级中断,以便允许同级中断源请求中断。四. 中断响应等待时间 若排除CPU正在响应同级或更高级的中断情况,中断响应等待时间为:38个机器周期五. 中断请求的撤除 中断源发出中断请求,相应中断请求标志置“1”。 CPU响应中断后,必须清除中断请求“1”标志。否则中断响应返回后,将再次进入该中断,引起死循环出错。 对定时/计数器T0、
6、T1中断,外中断边沿触发方式,CPU响应中断时就用硬件自动清除了相应的中断请求标志。 对外中断电平触发方式,需要采取软硬结合的方法清除(CPU自动硬件清除,同时用户也要及时将外部中断引脚变成无效电平)。 对串行口中断,用户应在串行中断服务程序中用软件清除TI或RI。六. 中断优先控制和中断嵌套 中断优先控制 80C51中断优先控制首先根据中断优先级,此外还规定了同一中断优先级之间的中断优先权。其从高到低的顺序为:INT0、INT1、T0、T1、串行口。中断优先级是可编程的,而中断优先权是固定的,不能设置,仅用于同级中断源同时请求中断时的优先次序。80C51中断优先控制的基本原则: 高优先级中断
7、可以中断正在响应的低优先级中断,反之则不能。 同优先级中断不能互相中断。 同一中断优先级中,若有多个中断源同时请求中断,CPU将先响应优先权高的中断,后响应优先权低的中断。 中断嵌套当CPU正在执行某个中断服务程序时,如果发生更高一级的中断源请求中断,CPU可以“中断”正在执行的低优先级中断,转而响应更高一级的中断,这就是中断嵌套。中断嵌套只能高优先级“中断”低优先级,低优先级不能“中断”高优先级,同一优先级也不能相互“中断”。中断嵌套结构类似与调用子程序嵌套,不同的是: 子程序嵌套是在程序中事先按排好的;中断嵌套是随机发生的。 子程序嵌套无次序限制,中断嵌套只允许高优先级“中断”低优先级。七
8、. 中断系统的应用 中断初始化 设置堆栈指针SP 定义中断优先级 定义外中断触发方式 开放中断 安排好等待中断或中断发生前主程序应完成的操作内容。 中断服务主程序 中断服务子程序内容要求: 在中断服务入口地址设置一条跳转指令,转移到中断服务程序的实际入口处。 根据需要保护现场。 中断源请求中断服务要求的操作。 恢复现场。与保护现场相对应,注意先进后出、后进先出操作原则。 中断返回,最后一条指令必须是RETI。 中断系统应用举例*C51中提供的中断服务函数的定义如下:返回值 中断ISR函数名 interrupt n using m其中:n-对应中断源的编号 m-使用指定的寄存器组(03)程序举例
9、:#define uchar unsigned char /定义一下方便使用#define uint unsigned int#define ulong unsigned long#include /包括一个52标准内核的头文件sbit P10 = P10; /头文件中没有定义的IO就要自己来定义了/用外中断方式读按键K1,点亮或者熄灭一个LEDvoid main(void) / 主程序 IT0=1; /外中断跳变产生中断 EX0=1; /打开外部中断0 EA=1; /打开总中断 P10=0; while(1); /主程序循环/外中断0的ISRvoid int0_ISR()interrupt
10、0 P10= P10; /在中断里点亮或者熄灭LED/*提示:需要去抖操作,否则按键抖动会引起多种中断。*/二、80C51定时/计数器定时/计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、脉宽测量、信号发生、信号检测等。此外,定时/计数器还可作为串行通信中波特率发生器。一. 定时/计数器概述80C51单片机内部有两个定时/计数器T0和T1,其核心是计数器,基本功能是加1。对外部事件脉冲(下降沿)计数,是计数器;对片内机周脉冲计数,是定时器。计数器由二个8位计数器组成。定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后加1
11、计满后溢出。调整计数器初值,可调整从初值到计满溢出的数值,即调整了定时时间和计数值。定时/计数器作为计数器时,外部事件脉冲必须从规定的引脚输入。且外部脉冲的最高频率不能超过时钟频率的1/24。二. 定时/计数器的控制寄存器 定时/计数器控制寄存器TCONT1运行标志T0运行标志TR1TR0TCON低4位与外中断、有关,已在中断中叙述。高4位与定时/计数器T0、T1有关。 TF1:定时/计数器T1溢出标志。 TF0:定时/计数器T0溢出标志。 TR1:定时/计数器T1运行控制位。TR1=1,T1运行;TR1=0,T1停。 TR0:定时/计数器T0运行控制位。TR0=1,T0运行;TR0=0,T0
12、停。TCON的字节地址为88H,每一位有位地址,均可位操作。 定时/计数器工作方式控制寄存器TMODTMOD用于设定定时/计数器的工作方式低4位用于控制T0,高4位用于控制T1。高4位控制T1低4位控制T0门控位计数/定时方式选择工作方式选择GC / TM1M0 M1M0 工作方式选择位M1M0工作方式00方式013位计数器01方式116位计数器10方式2两个8位计数器,初值自动装入11方式3两个8位计数器,仅适用T0 C/T 计数/定时方式选择位 C/T=1,计数工作方式,对外部事件脉冲计数,用作计数器。 C/T=0,定时工作方式,对片内机周脉冲计数,用作定时器。 GATE 门控位 GATE
13、=0,运行只受TCON中运行控制位TR0/TR1的控制。 GATE=1,运行同时受TR0/TR1和外中断输入信号的双重控制。 只有当INT0/INT1=1且TR0/TR1=1,T0/T1才能运行。 TMOD字节地址89H,不能位操作,设置TMOD须用字节操作指令。三. 定时/计数器工作方式 工作方式0 13位计数器,由TL低5位和TH 8位组成,TL低5位计数满时不向TL第6位进位,而是向TH进位,13位计满溢出,TF置“1”。最大计数值213 = 8192。 工作方式1 16位计数器,由TL和TH组成,最大计数值为216 = 65536。工作方式与方式0相似; 工作方式2 可自动装载的8位计
14、数器,仅用TL计数,最大计数值为28= 256,计满溢出后,一方面进位TF,使溢出标志TF = 1;另一方面,使原来装在TH中的初值装入TL。 优点:定时初值可自动恢复;缺点:计数范围小。常作为串口波特率发生器。 适用于需要重复定时,而定时范围不大的应用场合。 工作方式3 方式3仅适用于T0,T1无方式3。T1停止计数,只是保持其值,T0分成两个独立的8位计数器TH0和TL0;,此方式较特别。 T0方式3 在方式3情况下,T0被拆成二个独立的8位计数器TH0、TL0。 TL0使用T0原有的控制寄存器资源:TF0,TR0,GATE,C/T,INT0,组成一个8位的定时/计数器; TH0借用T1的
15、中断溢出标志TF1,运行控制开关TR1,只能对片内机周脉冲计数,组成另一个8位定时器(不能用作计数器)。 T0方式3情况下的T1 T1由于其TF1、TR1被T0的TH0占用,计数器溢出时,只能将输出信号送至串行口,即用作串行口波特率发生器。四. 定时/计数器的应用 计算定时/计数初值80C51定时/计数初值计算公式:;故有:其中: N与工作方式有关: 方式0时,N=13; 方式1时,N=16; 方式2、3时,N=8。Fosc-主振频率(单片机晶振); 定时/计数器应用步骤 合理选择定时/计数器工作方式 计算定时/计数器定时初值(按上述公式计算) 编制应用程序 定时/计数器的初始化 包括定义TM
16、OD、写入定时初值、设置中断系统、启动定时/计数器运行等。 正确编制定时/计数器中断服务程序 注意是否需要重装定时初值,若需要连续反复使用原定时时间,且未工作在方式2,则应在中断服务程序中重装定时初值。【例】试用T1方式2编制程序,在P1.0引脚输出周期为400S的脉冲方波,已知fosc=12MHZ。解: 计算定时初值 T1初值=28-200*10(-6)*12*106/12=256200=56=38H TH1=38H;TL1=38H 设置TMOD:00100000B=20H 编制程序如下:(1)查询方式sbit P10=P10;void main(void )TMOD=0x20; /T1 f
17、unction 2 TH1=0x38; TL1=0x38; TR1=1; /start T1 while(1) while(!TF1); /查询等待TF1置位 TF1=0; P10=P10;(2)中断方式 /enable interrupt ET1=1;void Timer1_ISR(void) interrupt 1 using 33、串行通信内容简介见PPT波特率计算:方式1和方式3都是可变的:常用波特率通常按规范取1200、2400、4800、9600、,若采用晶振12MHz和6MHz,则计算得出的T1定时初值将不是一个整数,产生波特率误差而影响串行通信的同步性能。解决的方法只有调整单片
18、机的时钟频率fosc,通常采用11.0592MHz晶振。(1)查询法:点对点的双机通信:要实现甲与乙两台单片机点对点的双机通信,线路只须将甲机的TXD与乙机的RXD相连,将甲机的RXD与乙机的TXD相连,地线与地线相连。分析过程:甲、乙两机都选择方式1:8位异步通信方式,最高位用作奇偶校验,波特率为1200bps,甲机发送,乙机接收,因此甲机的串口控制字为40H,乙机的串口控制字为50H。由于选择的是方式1,波特率由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。则须对定时/计数器T1初始化。设SMOD=0,甲、乙两机的振荡频率为12MHZ,由于波特率为1200。定时/计数
19、器T1选择为方式2,则初值为:初值=256 - fosc2SMOD /(12波特率32)=256-12000000/(12120032)230=E6H;根据要求定时/计数器T1的方式控制字为20H发送程序:#define uchar unsigned charuchar idata trdata=8,9S51,0x0d,0x0a,0x00;main()uchar i; uint j; TMOD= 0x20; /定时器1定时方式2TH1= 0xe6; /12MHz 1200波特率TL1= 0xe6;SCON= 0x40; /串口方式1 ,不允许接收REN=0;PCON=0; /SMOD=0TR1
20、= 1; /启动定时器while(1) i=0;while(trdatai!=0x00) /00结束 SBUF=trdatai; while(TI=0); TI=0; i+; for (j=0;j50000;j+); /延时 接收方程序:uchar idata buf8;SCON= 0x50; /串口方式1,允许接收REN=1TMOD= 0x20;while(1) /接收一祯 for (i=0;i9;i+) while( RI=0) /当有数据时启动接收 RI=0; bufi=SBUF; /读入数据与PC机串行调试器通讯:#include/UART初始化:模式1,8位,9600Bds at 1
21、1.059MHzvoid InitSerial() SCON = 0x50 / uart in mode 1 (8 bit), REN=1 TMOD = TMOD | 0x20 ; / Timer 1 in mode 2 TH1 = 0xFD; / 9600 Bds at 11.059MHz TL1 = 0xFD; /9600 Bds at 11.059MHz TR1 = 1; / Timer 1 runvoid main() unsigned char temp; InitSerial(); /串行口初始化 while(1) while(!RI); /PC机发送数据 RI = 0; temp
22、 = SBUF; /接收数据 SBUF = temp; /发送数据 while(!TI); /MCU发送数据 TI = 0; (2)中断法一般情况下,常采用查询法发送数据。中断法接收程序。下面就是一个中断法的程序:unsigned char i,full_flag;unsigned char buff20; /BUFF ES=1;void main(void)i=0;full_flag=0;while(1) if(full_flag) ES=0;Delay(1000); /延时1sfull_flag=0ES=1;void UART_ISR(void) interrupt 4 if(RI) buffi=SBUF; if(i20) full_flag=1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1