Presentation is loading. Please wait.

Presentation is loading. Please wait.

第5章 80C51单片机的中断与定时 教学基本要求: (1)、了解单片机系统有关中断的概念; (2)、了解单片机定时器/计数器的功能;

Similar presentations


Presentation on theme: "第5章 80C51单片机的中断与定时 教学基本要求: (1)、了解单片机系统有关中断的概念; (2)、了解单片机定时器/计数器的功能;"— Presentation transcript:

1 第5章 80C51单片机的中断与定时 教学基本要求: (1)、了解单片机系统有关中断的概念; (2)、了解单片机定时器/计数器的功能;
(3)、熟悉与中断控制有关的控制寄存器的功能及用法; (4)、熟悉与定时/计数控制有关的控制寄存器功能及用法; (5)、掌握单片机中断系统的应用方法; (6)、掌握单片机定时器/计数器的应用方法; 教学重点: (1)、单片机中断系统的中断服务流程; (2)、单片机定时器/计数器的工作方式0、2; 教学难点: (1)、中断采样、中断查询、中断响应、中断撤消

2 5.1 中断概述 (1)有关中断的概念 (a)中断 当中央处理器CPU正在处理某件事情的时候,外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件。处理完毕后,再回到原来被暂停的地方,继续原来的工作,这样的过程称为中断。 (b)中断嵌套 即指在中断过程中又发生了新中断的现象。 (c)中断源 向CPU发出中断请求的来源。

3 (d)中断请求或中断申请 中断源要求CPU为其服务的请求。 (e)中断查询 即指CPU通过测试各中断控制寄存器中各标志位的状态,以确定有没有中断请求发生以及是哪一个中断源提出中断请求的过程。 (f)中断响应 即指CPU对中断源提出的中断请求的接受,发生在中断查询之后。 (g)中断处理或中断服务 中断处理就是执行中断服务程序。

4 (h)中断返回 中断返回是指CPU在执行完中断服务程序后,返回原来暂停的地方(断点),继续执行原来程序的过程。

5 C51单片机的中断系统 中断源与中断向量 80C51单片机共有3类5个中断源,即外部中断2个、定时中断2个和串行中断1个。 (1)外中断 (a)由外部信号引起,共有2个中断源,即外部中断“0”和外部中断“1”。由/INT0(P3.2)和/INT1(P3.3)引入。 (b)外中断的两种信号触发方式(通过有关控制位定义) 电平方式:低电平有效 脉冲方式:脉冲下降沿有效,高低电平状态都应至少维持一个 机器周期。

6 (2)定时中断 定时中断是为满足定时或计数的需要设置的。80C51单片机共有2个定时器/计数器中断源,即T/C0和T/C1。 定时器/计数器内部的计数结构对脉冲信号进行计数,当计数结构发生计数溢出时,即表明定时时间到或计数值已满,此时就以计数溢出信号作为中断请求信号,向CPU申请中断,同时置位一个溢出标志位,作为单片机接受中断请求的标志。 定时器/计数器作为定时功能使用时,计数结构需要的计数脉冲信号来自单片机内部。 定时器/计数器作为计数功能使用时,计数结构需要的计数脉冲信号来自单片机外部,由T0(P3.4)、T1(P3.5)引入。

7 串行中断是为串行数据传送的需要设置的。每当串行口接收或发送完一组串行数据时,就产生中断请求信号向CPU申请中断。
(3)串行中断 串行中断是为串行数据传送的需要设置的。每当串行口接收或发送完一组串行数据时,就产生中断请求信号向CPU申请中断。 80C51单片机的中断向量列表 外部中断 H 定时/计数器 BH 外部中断 H 定时/计数器 BH 串行发送中断 0023H 串行接收中断 H 中断控制 所谓中断控制就是指单片机提供给用户使用的中断控制的手段,用户可通过设置中断控制寄存器的状态位来使用中断系统。 中断控制的本质就是利用指令对中断控制寄存器进行操作。 80C51具有4个相关的控制寄存器:TCON,IE,IP,SCON。

8 (1)定时器控制寄存器(TCON) TCON的功能:用于保存外部中断请求以及定时器/计数器的计数溢出信号。 TCON的字节地址:88H;位地址:8FH~88H。 TCON的内容及格式如下: 位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 与中断控制有关的控制位共有6位: (a)IE0、IE1:外中断请求标志位 CPU采样/INT0,/INT1端,如出现有效中断请求信号,则由硬件电路对该位自动置1。在中断响应后,由硬件电路对该位自动清0。

9 (b)IT0、IT1:外中断请求触发方式控制位
由软件置1或清0,即人工编程。 例: SETB IT0;或CLR IT0; (C)TF0、TF1:计数溢出标志位 当计数结构产生溢出时,由硬件电路对该位自动置1; 当转向中断服务时,再由硬件电路对该位自动清0。 计数溢出标志位的使用有两种情况: 1)采用中断方式时,作中断请求标志位使用; 2)采用查询方式时,作查询状态位来使用,必须利用软件对该位清0。

10 (2)串行口控制寄存器(SCON) SCON的功能:用于串行数据通信的控制。 SCON的字节地址:98H;位地址:9FH~98H。 SCON的内容及格式如下: 位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H 位符号 SM0 SM1 SM2 REN TB8 RB8 TI RI 与中断控制有关的控制位共有2位: (a)TI:串行口发送中断请求标志位 发送完一帧串行数据后,由硬件电路对该位自动置1,在转向中断服务程序后,用软件对该位清0。 (b)RI:串行口接收中断请求标志位 接收完一帧数据后,由硬件电路对该位自动置1,在转向

11 中断服务程序后,用软件对该位清0。 TI、RI标志位的使用有两种情况: 1)采用中断方式时,作中断请求标志位使用; 2)采用查询方式时,作查询状态位来使用; 无论采用何种方式,都必须利用软件对该位清0。 (3)中断允许控制寄存器(IE) IE的功能:中断系统的开关。 IE的字节地址:0A8H;位地址:0AFH~0A8H。 IE的内容及格式如下: 位地址 AFH AEH ADH ACH ABH AAH A9H A8H 位符号 EA / ES ET1 EX1 ET0 EX0

12 与中断控制有关的控制位共有6位: (a)EA:中断允许总控制位 EA=0:中断总禁止; EA=1:中断总允许; (b)EX0、EX1:外部中断允许控制位 EX0、EX1=0:禁止外中断; EX0、EX1=1:允许外中断; (c)ET0、ET1:定时器/计数器中断允许控制位 ET0、ET1=0,禁止定时(或计数)中断; ET0、ET1=1,允许定时(或计数)中断; (d)ES:串行中断允许控制位 ES=0,禁止串行中断;

13 ES=1,允许串行中断; 注意: 1)MCS-51单片机复位后(IE)=00H,即中断系统处于禁止状态; 2)单片机在中断响应后不会自动关闭中断,需使用有关指令禁止中断,即以软件方式关闭中断。 (4)中断优先级控制寄存器(IP) IP的功能:决定各中断源的优先权。 IP的字节地址:0B8H;位地址:0BFH~0B8H。 IP的内容及格式如下: 位地址 BFH BEH BDH BCH BBH BAH B9H B8H 位符号 / PS PT1 PX1 PT0 PX0

14 与中断控制有关的控制位共有5位: (a)PX0:外部中断0优先级设定位; (b)PT0:定时中断0优先级设定位; (c)PX1:外部中断1优先级设定位 ; (d)PT1:定时中断1优先级设定位 ; (e)PS:串行中断优先级设定位; 为0的位优先级为低,为1的优先级为高。 中断优先级控制 中断优先级是为中断嵌套服务的。MCS-51单片机具有两级优先级,因此它具备两级中断服务嵌套的功能,其中断优先级的控制原则是: (a)低优先级中断请求不能打断高优先级的中断服务,但高优

15 先级中断请求可以打断低优先级的中断服务,实现中断嵌套。
(b)如一个中断请求已被响应,则同级的其它中断响应将被禁止。即同级不能嵌套。 (c)如果同级的多个中断请求同时出现,则按CPU查询次序确定那个中断请求被响应。 查询次序: 外部中断0→定时中断0→外部中断1→定时中断1→串行中断 中断优先级控制,除了中断优先级控制寄存器之外,还有两个不可寻址的优先级状态触发器: 一个用于指示某一高优先级中断正在进行服务,从而屏蔽其它高优先级中断;另一个用于指示某一低优先级中断正在进行服务,从而屏蔽其它低优先级中断,但不能屏蔽高优先级的中断。

16 中断初始化与中断控制寄存器状态设置 MCS-51单片机的中断系统在使用之前,必须在单片机的应用程序初始化部分进行设置,具体情况如下: (a)外部中断:中断总允许、外中断允许、中断触发方式设定、中断优先级设定 (b)定时中断:中断总允许、定时中断允许、中断优先级设定; (c)串行中断:中断总允许、串行中断允许、中断优先级设定。 MCS-51单片机中断系统的4个控制寄存器既可以进行字节寻址,又可进行位寻址,对位状态的设置,既可以使用字节操作指令,又可以使用位操作指令。 例:设要开放外中断0,则可以使用以下指令: MOV IE, #81H;或 SETB EA; SETB EX0; 80C51单片机中断系统内部结构图

17 中断响应过程 中断响应过程发生在中断查询之后,包括中断响应、中断处理、中断返回三个阶段。因此,必须首先研究中断查询。 所谓中断查询就是指CPU通过测试TCON和SCON中各标志位的状态,以确定有没有中断请求发生以及是哪一个中断源提出中断请求的过程。 中断请求标志位的置位方式由于单片机中断类型的不同而存在差异。 (a)对于外中断,必须通过采样的方法把外中断请求信号锁定在TCON的相应标志位中; (b)对于定时中断和串行中断,可以通过硬件电路直接置位的方法将TCON和SCON中各自的中断请求标志位置“1”。

18 (1)中断采样(针对外中断) 中断请求采样:即如何识别外部中断请求信号并把它锁定在TCON的相应标志位中。 采样时刻:在每个机器周期的S5P2(第5状态,第2节拍)时刻,对/INT0(P3.2)和/INT1(P3.3)引脚进行。 对于电平方式的外中断请求,采样为高→IE0(IE1)→0,为低→IE0(IE1)→1; 对于脉冲方式外中断请求,采样先高后低→IE0(IE1)→1;否则IE0(IE1)→0。 (2)中断查询 中断查询:CPU对中断请求标志位的查询来获悉有无中断请求发生以及是哪一个中断源提出中断请求;

19 查询次序:按优先级顺序进行; 查询时刻:每个机器周期的最后一个状态S6,一旦查到有中断请求发生,接着就从相临的下一个机器周期的S1状态开始进行中断响应。 (3)中断响应 中断响应的主要内容:由硬件电路自动生成一条长调用指令 LCALL addr16(即程序存储器中相应中断区的入口地址),生成LCALL指令后,就由CPU执行,从而转移到真正的中断服务程序。 中断响应是有条件的,并不是查询到的所有中断请求都能被立即响应,当存在下列情况之一时,中断响应被封锁: (a)CPU正处在为一个同级或高级的中断服务中; (b)查询中断请求的机器周期不是当前指令的最后一个机器

20 周期; (c)当前指令是返回指令(RET,RETI)或访问IE,IP指令。 MCS-51单片机对中断查询结果不作记忆,当有新的查询结果出现时,因为以上原因而被拖延的查询结果将不复存在,其中断请求也就不能再被响应了。 中断响应的条件: (a)有中断源发出有效的中断请求信号; (b)EA=1,即CPU开总中断; (c)申请中断的中断源的中断允许位为1,即没有屏蔽; (d)中断响应没有被封锁。 (4)中断响应时间 即指从查询中断请求标志位到转向中断区入口地址所需的

21 机器周期数。 最短响应时间:3个机器周期(1个查询机器周期和2个LCALL指令机器周期); 最长响应时间:8个机器周期(2+4+2)。 一般的中断响应时间在3~8个机器周期之间。 (5)中断处理 即执行中断服务程序的过程。 (6)中断返回 指CPU在执行完中断服务程序后,返回原来暂停的地方(断点),继续执行原来程序的过程。

22 中断请求的撤消问题 中断响应后,TCON或SCON中的中断请求标志应及时清除,否则就意味着中断请求依然存在,弄不好就会造成中断的重复查询和响应,因此,必须在中断响应后及时清除中断请求信号(即将中断请求标志位清0)。 (1)定时中断请求的撤消 定时中断的中断请求是由硬件电路自动撤消的(即硬件电路自动把标志位(TF0或TF1)清0),无需用户干预。 (2)脉冲方式外部中断请求的撤消 外部中断请求的撤消包括两项内容: (a)中断标志位的清0; (b)外部中断请求信号的撤消;

23 对于脉冲方式的外部中断请求,其标志位(IE0或IE1)的清0是由硬件电路自动完成的;由于中断请求信号是脉冲信号,因此,中断请求信号也是自动撤消的。
(3)电平方式外部中断请求的撤消 对于电平方式的外部中断请求,其标志位(IE0或IE1)的清0是由硬件电路自动完成的;由于中断请求信号是低电平信号,因此,必须借助外电路将其拉高,否则,在以后的机器周期采样时又会将标志位(IE0或IE1)置“1”,造成重复中断响应。 结合硬件电路,只需在中断服务程序中增加两条指令就可在P1.0口线上产生一个负脉冲,将中断请求低电平信号撤消: ORL P1, #01H; P1.0输出高电平 ANL P1, #0FEH;P1.0输出低电平

24 (4)串行中断软件撤消 串行中断的标志位TI,RI,硬件电路不会将其自动清0,因为在中断响应后,还需测试TI,RI的状态,以判定是接收还是发送操作,然后才能清除。应使用软件方法进行,加在中断服务程序中。 中断服务程序 中断服务流程 (1)现场保护和现场恢复 现场保护: 为了使中断服务程序的执行不破坏CPU中寄存器或存储单元的原有内容,以免在中断返回后影响主程序的运行,须把CPU中有关寄存器或存储单元的内容推入堆栈中保护起来。这个过程称现场保护。

25 现场恢复: 中断服务结束后,在返回主程序前,把保存的现场内容从堆栈中弹出,以恢复寄存器或存储单元的原有内容。 现场保护和现场恢复利用PUSH、POP指令实现,现场保护一定要位于中断处理程序前面,而现场恢复一定要位于中断处理程序后面。 (2)开中断和关中断 开中断即中断允许,关中断即中断屏蔽。在现场保护和现场恢复的过程中,即使有更高级的中断请求,也不允许中断嵌套。 (3)中断处理 (4)中断返回 利用RETI指令把程序运行从中断服务程序转回到被中断的

26 主程序上去,这条指令位于中断服务程序的最后一条指令。
RETI指令执行时,首先将响应中断时置位的优先级触发器复位,然后将断点地址从堆栈中弹出送PC,接着CPU从断点处重新执行被中断的主程序。

27 返回

28 返回

29 返回

30 80C51单片机中断系统内部结构图 返回

31 返回

32 5.3 80C51单片机的定时器/计数器 定时方法概述 (1)软件定时 (a)依靠执行一个循环程序以进行时间延迟;
(b)定时精确,无须增加硬件电路,但占有CPU资源。 (2)硬件定时 硬件电路完成,不占有CPU资源,定时时间长,使用不灵活。 (3)可编程定时器定时 通过对系统时钟脉冲的计数来实现,使用灵活、方便。

33 定时器/计数器的计数和定时功能 MCS-51单片机有两个定时器/计数器(T/C0,T/C1),均为十六位加法计数结构,分别由TH0,TL0,TH1,TL1两个8位计数器组成。80C51单片机定时器/计数器逻辑结构图。 MCS-51单片机的定时器/计数器具有定时和计数功能: (1)计数功能 (a)所谓计数:指对外部事件进行计数,外部事件的发生以输入脉冲表示,因此,计数功能的实质是对外来脉冲进行计数。 (b)计数输入端:T0(P3.4)、T1(P3.5) 。 (c)有效计数脉冲:外部输入的脉冲在下降沿有效,进行计数器加1。 (d)计数采样时刻:每个机器周期的S5P2(共要2个周期)。

34 (e)计数时刻:计数采样时刻的下一个机器周期的S3P1。
(f)计数脉冲频率:1/24fosc。 (2)定时功能 定时功能也是通过计数器的计数来实现的。计数脉冲来自内部,每个机器周期产生一个计数脉冲,即每个机器周期计数器加1,计数频率为1/12fosc。 用于定时器/计数器的控制寄存器 定时器/计数器的控制寄存器有3个:TCON、TMOD、IE。 (1)定时器控制寄存器(TCON) TCON的功能:用于保存外部中断请求以及定时器/计数器的计数溢出信号。 TCON的字节地址:88H;位地址:8FH~88H。

35 TCON的内容及格式如下: 位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 与定时有关的控制位共有4位: (a)TF0、TF1:计数溢出标志位 当计数结构产生溢出时,由硬件电路对该位自动置1; 当转向中断服务时,再由硬件电路对该位自动清0。 计数溢出标志位的使用有两种情况: 1)采用中断方式时,作中断请求标志位使用; 2)采用查询方式时,作查询状态位来使用,必须利用软件对该位清0。

36 (b)TR0、TR1:定时器运行控制位 TR0、TR1=0,停止T/C工作; TR0、TR1=1,启动T/C工作。 该位根据需要以软件方法置1或清0。 (2)工作方式控制寄存器(TMOD) TMOD的功能:用于设定两个定时器/计数器的工作方式。 TMOD的字节地址:89H,应采用字节传送指令设置其内容。 TMOD的内容及格式如下: 位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 GATE C/T M1 M0 与定时有关的控制位共有8位,分两组:

37 (a)GATE:门控位 GATE=0,以运行控制位TR0、TR1启动T/C; GATE=1,以外中断请求信号(/INT1,/INT0)启动T/C。 (b)C/T:定时方式或计数方式选择位 C/T=0,定时工作方式; C/T=1,计数工作方式。 (c)M1M0:工作方式选择位 M1M0=00 方式0 M1M0=01 方式1 M1M0=10 方式2 M1M0=11 方式3

38 (3)中断允许寄存器(IE) IE的功能:中断系统的开关。 IE的字节地址:0A8H;位地址:0AFH~0A8H。 IE的内容及格式如下: 位地址 AFH AEH ADH ACH ABH AAH A9H A8H 位符号 EA / ES ET1 EX1 ET0 EX0 与定时有关的控制位共有3位: (a)EA:中断允许总控制位 EA=0:中断总禁止; EA=1:中断总允许; (b)ET0、ET1:定时器/计数器中断允许控制位 ET0、ET1=0,禁止定时(或计数)中断; ET0、ET1=1,允许定时(或计数)中断;

39 方式0是13位计数结构的工作方式,其计数器由TH全部8位和TL的低5位构成,TL的高3位不用。
定时工作方式0 (1)电路逻辑结构 方式0是13位计数结构的工作方式,其计数器由TH全部8位和TL的低5位构成,TL的高3位不用。 首先着重讲方式1,其他方式与方式1对比,方式3可自学

40 (2)定时和计数应用 (a)在方式0下,作计数功能时,计数值范围1~8192(213),计数可从0~8191开始。 (b)在方式0下,作定时功能时,定时时间计算公式: (213-计数初值)×晶振周期×12 或(213-计数初值)×机器周期。 注意:1)T/C是可编程的,TH,TL可以按字节寻址。 例:MOV TL0, #Data; MOV TH0, #Data; TL0,TH0中的初值可通过指令预置。 2)计数脉冲→TL5位→TH8位→TF 假设fosc=6MHz,则最长、最短定时时间分别为2μs、16384μs

41 例:假设单片机fosc=6MHz,使用定时器1以方式0产生周期为500μs的等宽正方波连续脉冲,由P1.0输出,以查询方式完成。
解:1)计算计数初值 利用定时器/计数器1的定时功能,定时时间250μs。 假设待求的计数初值为X:则:(213-X)×2×10-6S=250×10-6S 得:X=8067(十进制), (二进制),十六进制表示:高8位0FCH送TH1,低5位03H送TL1。

42 2)TMOD寄存器初始化 位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 GATE C/T M1 M0 根据以上分析,TMOD寄存器应初始化位00H。 3)由T/C1的TCON中TR1位控制其启动,停止: TR1=1启动,TR1=0停止; 4)程序设计: ORG H START:LJMP MIAN MAIN:MOV TMOD, #00H;T/C1方式0 MOV TH1, #0FCH;设计数初值 MOV TL1, #03H;

43 MOV IE, #00H;禁止中断 SETB TR1; 启动定时器 LOOP:JNB TF1, LOOP;查询计数溢出否 MOV TH1, #0FCH;重置计数初值 MOV TL1, #03H; CLR TF1;清计数溢出标志 CPL P1.0; 输出取反 AJMP LOOP; 重复循环 END 思考题:1)如采用中断方式,如何编程? 2)如P1.0输出的不是方波, 而是矩形波(高电平100μs,低电平200μs), 其它条件不变,如何编程?

44 #include <reg51.h> sbit P1_0=P1^0; void main(void) { TMOD=0x00;
TR1=1; TH1= 0xfc; TL1=0x03; for( ;;) { TH1= 0xfc; do { } while (!TF1); P1_0=!P1_0; TF1=0; } 思考题只讲思路

45 补充内容:CX51 一:Cx51数据与运算 1、 Cx51数据类型

46 #define uchar unsigned char #define uint unsigned int
例如: #define uchar unsigned char #define uint unsigned int 这样,在编程中,就可以用uchar代替unsigned char,用uint代替unsigned int来定义变量。

47 直接寻址片内数据存储区,访问速度快(128字节)
2、Cx51数据的存储类型与8051存储结构 KEIL Cx51完全支持8051单片机的硬件结构,可以完全访问8051硬件系统的所有部分。该编译器通过将变量、常量定义成不同的存储类型的方法,将他们定义在不同的存储区中。 存储类型 与存储空间的对应关系 data 直接寻址片内数据存储区,访问速度快(128字节) bdata 可位寻址片内数据存储区,允许位与字节混合访问(16字节) idata 间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节) pdata xdata 片外数据存储区(64 code 程序存储器64

48 带存储类型的变量的定义的一般格式为 数据类型 存储类型 变量名 变量存储类型定义举例: Char data var1; /* var1定位在内部RAM*/ Bit bdata flags; /* flags定位在内部RAM的位寻址区*/ Float idata x,y,z; /*变量定位在内部RAM,但只能采用间 址寻址方式*/ Unsigned int pdata i; /*无符号整型变量i定位在外部 Unsigned char xdata v[10][4][4]; /*无符号三维数组变 量, 定位在外部RAM,并占据10×4 × 4=160字节存储空间*/

49 如果定义时略去存储类型标志符,编译器会自动选择默认的类型,由SMALL,COMPACT和LARGE存储模式指令限制。
说 明 SMALL 默认的存储类型是data,参数及局部变量放入可直接寻址片内RAM的用户区中(最大128字节)。 COMPACT LARGE 默认的存储类型是xdata,参数及局部变量直接放入片外数据存储区,使用数据指针DPTR来进行寻址。

50 3、80C51特殊功能寄存器(SFR)的Cx51定义 80C51单片机中,地址范围为80H~FFH的单元为SFR寄存器。 为了能直接访问这些SFR,KEIL Cx51提供了一种自主形式的定义方法,这种定义方法与标准C语言不兼容,只适用于对8051系列单片机进行C语言编程。 特殊功能寄存器C51定义的一般语法格式如下: sfr sfr_name =int constant; “sfr”是定义语句的关键字,其后必须跟一个80C51单片机真实存在的特殊功能寄存器名,“=”后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存“sfr_name”的字节地址,这个常数值的范围必须在SFR地址范围内,位于0x80~0xFF。

51 sfr SCON=0x98;/* 串口控制寄存器地址98H */
例如: sfr SCON=0x98;/* 串口控制寄存器地址98H */ sfr TMOD=0x89;/* 定时/计数器方式控制寄存器地址89H */ 80C51系列单片机的特殊功能寄存器的数量与类型不尽相同,因此建议将所有特殊的“sfr”定义放入一个头文件中,该文件应包括MCS-51单片机系列机型中的SFR定义。 C51编译器的“reg51.h”头文件就是这样一个文件。 对于位寻址的SFR中的位,C51的扩充功能支持特殊位的定义,像SFR一样不与标准C兼容,使用"sbit"来定义位寻址单元。 打开KEIL与学生一起查看头文件

52 第一种格式: sbit bit-name = sfr-name^int constant; “sbit”是定义语句的关键字,后跟一个寻址位符号名(该位符号名必须是80C51单片机中规定的位名称),“=”后的“sfr-name”必须是已定义过的SFR的名字,“^”后的整常数是寻址位在特殊功能寄存器“sfr-name”中的位号,必须是0~7范围中的数。 例如: sfr PSW=0xD0 ; /* 定义PSW寄存器地址为D0H */ sbit OV=PSW^2 ; /* 定义OV位为PSW.2,地址为D2H */ sbit CY=PSW^7 ; /* 定义CY位为PSW.7,地址为D7H */

53 第二种格式: sbit bit-name =int constant^int constant; “=”后的int constant为寻址地址位所在的特殊功能寄存器的字节地址,“^”符号后的int constant为寻址位在特殊功能寄存器中的位号。 例如: sbit OV=0XD0^2 ;/* 定义OV位地址是D0H字节中的第2位 */ sbit CY=0XD0^7 ;/* 定义CY位地址是D0H字节中的第7位 */

54 第三种格式: sbit bit-name = int constant; “=”后的int constant为寻址位的绝对位地址。 例如: sbit OV=0XD2 ;/* 定义OV位地址为D2H */ sbit CY=0XD7 ;/* 定义CY位地址为D7H */ 特殊功能位代表了一个独立的定义类,不能与其它位定义和位域互换。

55 sfr P0=0x80 ; /* 定义P0口,地址为80H */ sfr P1=0x90 ; /* 定义P1口,地址为90H */
4、80C51并行接口及Cx51定义 80C51系列单片机并行I/O接口除了芯片上的4个I/O口(P0~ P3)外,还可以在片外扩展I/O口。 80C51单片机I/O口与数据存储器统一编址,即把一个I/O口当作数据存储器中的一个单元来看待。 使用C51进行编程时,80C51片内的I/O口与片外扩展的I/O可以统一在一个头文件中定义,也可以在程序中(一般在开始的位置)进行定义,其定义方法如下: 对于80C51片内I/O口按特殊功能寄存器方法定义。 例如: sfr P0=0x80 ; /* 定义P0口,地址为80H */ sfr P1=0x90 ; /* 定义P1口,地址为90H */

56 对于片外扩展I/O口,则根据硬件译码地址,将其视作为片外数据存储器的一个单元,使用#define语句进行定义。
例如: #include <absacc.h> #define PORTA XBYTE [0xFFC0] absacc.h是C51中绝对地址访问函数的头文件,将PORTA定义为外部I/O口,地址为 FFC0H,长度为8位。 一旦在头文件或程序中对这些片外I/O口进行定义后,在程序中就可以自由使用变量名与其实际地址的联系,以便使程序员能用软件模拟MCS-51的硬件操作。

57 5、80C51位变量及Cx51定义 使用C51编程时,定义了位变量后,就可以用定义了的变量来表示80C51的位寻址单元。 位变量的C51定义的一般语法格式如下: 位类型标识符(bit) 位变量名; 例如: bit direction_bit ;/* 把direction_bit定义为位变量 */ bit look_pointer ;/* 把look_pointer定义为位变量 */

58 二 中断应用的C语言编程 C51编译器支持在C源程序中直接开发中断程序。中断服务程序是通过按规定语法格式定义的一个函数。 中断服务程序的函数定义的语法格式如下: 返回值 函数名([参数]) [模式][重入] interrupt m [using n] { } nterrupt m 其中m是中断号(0到31),中断号告诉编译器中断程序的入口地址,中断号对应着IE寄存器中的使能位。

59 中断源 入口地址 外部中断0 0003H 1 定时器0 溢出 000BH 2 外部中断1 0013H 3 定时器1 溢出 001BH 4
下表给出了对应关系 IE 寄存器中的使能位和C 中的中断号 中断源 入口地址 外部中断0 0003H 1 定时器0 溢出 000BH 2 外部中断1 0013H 3 定时器1 溢出 001BH 4 串行口中断 0023H 5 定时器2 溢出 002BH

60 在进入中断服务程序前的程序中使用一组工作寄存器,进入中断服务程序后,由“using n”切换到另一组寄存器,中断返回后又恢复到原寄存器组。这样互相切换的两组寄存器中的内容彼此都没有被破坏。
为中断程序指定工作寄存器组的缺点是:所有被中断调用的过程都必须使用同一个寄存器组,否则参数传递会发生错误。 中断不允许用于外部函数,它对函数目标代码影响如下: 当调用函数时,SFR中的ACC,B,DPH,DPL和PSW入栈。如果不使用寄存器组切换,则甚至中断函数所需要的所有工作寄存器都入栈。 函数退出前,所有的寄存器内容出栈; 函数由8051的指令RETI终止。

61 定时工作方式1 (1)电路逻辑结构 方式1是16位计数结构的工作方式,由TH全部8位和TL全部8位构成。

62 (2)定时和计数应用 (a)在方式1下,作计数功能时,计数值范围1~65536(216),计数可从0~65535开始。 (b)在方式1下,作定时功能时,定时时间计算公式: (216-计数初值)×晶振周期×12 或(216-计数初值)×机器周期。 注意:1)T/C是可编程的,TH,TL可以按字节寻址。 例:MOV TL0, #Data; MOV TH0, #Data; TL0,TH0中的初值可通过指令预置。 2)计数脉冲→TL8位→TH8位→TF 假设fosc=6MHz,则最长、最短定时时间分别为2μs、131ms。

63 例:假设单片机fosc=6MHz,使用定时器1以方式1产生周期为500μs的等宽正方波连续脉冲,由P1.0输出,以中断方式完成。
解:1)计算计数初值 利用定时器/计数器1的定时功能,定时时间250μs。 假设待求的计数初值为X:则:(216-X)×2×10-6S=250×10-6S 得:X=65410(十进制),十六进制表示:高8位0FFH送TH1,低8位83H送TL1。

64 2)TMOD寄存器初始化 位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 GATE C/T M1 M0 1 根据以上分析,TMOD寄存器应初始化位10H。 3)由T/C1的TCON中TR1位控制其启动,停止: TR1=1启动,TR1=0停止; 4)程序设计: ORG H; 主程序 STAR:LJMP MIAN ORG BH LJMP LOOP1 MAIN:MOV TMOD, #10H;T/C1方式1

65 MOV TH1, #0FFH;设计数初值 MOV TL1, #83H; SETB EA;开总中断 SETB ET1;T/C1允许中断 LOOP:SETB TR1;启动定时器 HERE:SJMP $;等待中断 中断服务程序 ORG H; LOOP1:MOV TH1, #0FFH;重置计数初值 MOV TL1, #83H; CPL P1.0; 输出取反 RETI; 中断返回 END

66 #include <reg51.h>
sbit P1_0=P1^0 ; void main( void ) {TMOD=0x10 ; /* T/C0工作在定时器非门控制方式1 */ P1_0=0; TH1= 0xff; /* 预置计数初值 */ TL1= 0x83; EA=1 ; /* CPU中断开放 */ ET1= 1 ; /* T/C0中断开放 */ TR1=1; /* 启动T/C0开始定时 */ do { } while(1) ; /* 等待中断 */ } void time (void) interrupt 3 using 1 {P1_0=!P1_0; /* P1.0取反 */ TH1= 0x0ff; TL1=0x83;

67 定时工作方式2 (1)电路逻辑结构 方式2是自动重新加载计数初值工作方式,以TL作计数器,以TH作预置寄存器,初始化时把计数初值分别装入TL和TH中。当计数溢出后,由预置寄存器TH以硬件方法自动给计数器TL重新加载初值。

68 (2)循环定时和循环计数应用 (a)在方式2下,作计数功能时,计数值范围1~256(28),计数可从0~255开始。 (b)在方式2下,作定时功能时,定时时间计算公式: (28-计数初值)×晶振周期×12 或(28-计数初值)×机器周期。 注意:1)T/C是可编程的,TH,TL可以按字节寻址。 例:MOV TL0, #Data; MOV TH0, #Data; TL0,TH0中的初值可通过指令预置。 2)计数脉冲→TL8位→TF 假设fosc=6MHz,则最长、最短定时时间分别为2μs、512μs。

69 例:假设单片机fosc=6MHz,使用T/C0以方式2产生100μs定时,在P1.0输出周期为200μs的连续方波脉冲。
解:1)计算计数初值 利用定时器/计数器0的定时功能,定时时间100μs。 假设待求的计数初值为X:则:(28-X)×2×10-6S=100×10-6S 得:X=206(十进制),十六进制表示:0CEH送TH0,0CEH送TL0。

70 2)TMOD寄存器初始化 位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 GATE C/T M1 M0 1 根据以上分析,TMOD寄存器应初始化为02H。 3)由T/C0的TCON中TR0位控制其启动,停止: TR0=1启动,TR0=0停止; 4)程序设计(查询方式) ORG H; 主程序 LJMP MAIN MAIN:MOV TMOD, #02H;T/C0方式2 MOV TH0, #0CEH;设计数初值 MOV TL0, #0CEH;

71 MOV IE, #00H;禁止中断 SETB TR0; 启动定时器 LOOP:JNB TF0, LOOP;查询计数溢出否 CLR TF0; 清计数溢出标志 CPL P1.0; 输出取反 AJMP LOOP; 重复循环 END

72 #include <reg51.h>
sbit P1_0=P1^0; void main(void) { TMOD=0x02; /* 设置定时器0为控制方式2*/ EA=0; TR0=1; TH0= 0xce; /* 装载计数器初值 */ TL0=0xce; for(;;) /* 启动 T/C0 */ { do { } while (!TF0); /* 查询等待TF0置位 */ P1_0=!P1_0; /* 定时时间到P1.0反相 */ TF0=0; /* 软件清 TF0 */ }

73 (5)程序设计:(中断方式) ORG 0000H; 主程序 END LJMP MAIN ORG 000BH LJMP LOOP1
MAIN: MOV TMOD, #02H;T/C0方式2 MOV TH0, #0CEH;设计数初值 MOV TL0, #0CEH; SETB EA;开总中断 SETB ET0;T/C0允许中断 LOOP:SETB TR0;启动定时器 HERE:SJMP $;等待中断 中断服务程序 ORG H; LOOP1:CPL P1.0;输出取反 RETI; 中断返回 END

74 #include <reg51.h>
sbit P1_0=P1^0 ; void main( void ) {TMOD=0x02 ; /* T/C0工作在定时器非门控制方式1 */ P1_0=0; TH0= 0xce; /* 预置计数初值 */ TL0= 0xce; EA=1 ; /* CPU中断开放 */ ET0= 1 ; /* T/C0中断开放 */ TR0=1; /* 启动T/C0开始定时 */ do { } while(1) ; /* 等待中断 */ } void time (void) interrupt 1 using 1 {P1_0=!P1_0; /* P1.0取反 */

75 例:假设单片机fosc=6MHz,用T/C1以方式2实现计数,每计100次进行A加1操作。
解:1)计算计数初值 利用定时器/计数器1的计数功能,假设待求的计数初值为X:则:X=(28-100)=156(十进制),十六进制表示:9CH送TH1,9CH送TL1。 2)TMOD寄存器初始化 位序 B7 B6 B5 B4 B3 B2 B1 B0 位符号 GATE C/T M1 M0 1 根据以上分析,TMOD寄存器应初始化为60H。 3)由T/C1的TCON中TR1位控制其启动,停止: TR1=1启动,TR1=0停止;

76 MAIN:MOV TMOD, #60H;T/C1方式2 MOV TH1, #9CH;设计数初值 MOV TL1, #9CH;
4)程序设计(查询方式) ORG H; LJMP MAIN ORG H; 主程序 MAIN:MOV TMOD, #60H;T/C1方式2 MOV TH1, #9CH;设计数初值 MOV TL1, #9CH; MOV IE, #00H;禁止中断 SETB TR1; 启动定时器 LOOP:JNB TF1, LOOP;查询计数溢出否 CLR TF1; 清计数溢出标志 INC A; 累加器加1 AJMP LOOP; 重复循环 END

77 #include <reg51.h>
sfr a=0xe0; void main(void) { TMOD=0x60; /* 设置计数器1为控制方式2*/ IE=0; TR1=1; for(;;) /* 启动 T/C1 */ { TH1= 0x9C; /* 装载计数器初值 */ TL1=0x9C; do { } while (!TF1); /* 查询等待TF1置位 */ TF1=0; /* 软件清 TF1 */ a++; }

78 定时工作方式3 (1)电路逻辑结构

79 (2)工作方式3下的定时器/计数器0 在工作方式3下,T/C0被折成两个独立的8位计数器TL0,TH0,其中,TL0即可以计数使用,又可以定时使用。T/C0的各控制位和引脚信号全归它使用。而TH0只能作为简单的定时器使用,借用T/C1的TR1和TF1。 (3)工作方式3下的定时器/计数器1 如果T/C0工作在方式3,则T/C1只能工作在方式0,方式1,方式2下,并且T/C1通常作为串行口波特率发生器使用,以确定串行通信的速率。

80 80C51单片机定时器/计数器逻辑结构图 返回


Download ppt "第5章 80C51单片机的中断与定时 教学基本要求: (1)、了解单片机系统有关中断的概念; (2)、了解单片机定时器/计数器的功能;"

Similar presentations


Ads by Google