第4章 单片机中断系统及定时器计数器

第4章  单片机中断系统及定时器计数器
第4章  单片机中断系统及定时器计数器

第4章单片机中断系统及定时器/计数器

1、简述中断、中断源、中断入口、中断优先级和中断嵌套的含义。

答:中断:中断原有的程序,转去与外设传送数据。数据传送完毕后,CPU再回到原有的程序执行。

中断源:向CPU发出中断请求的来源称之为中断源。

中断入口:中断向量地址又称为中断入口地址,当某个中断源的中断请求被CPU响应之后,CPU便自动将该中断源的中断入口地址装入程序计数器PC,中断服务程序便从该地址开始执行,直到执行到RETI指令才重新回到原先的断点。

中断优先级:单片机的中断系统通常允许多个中断源,当几个中断源同时向CPU发出中断请求时,就存在CPU优先响应哪一个中断源请求的问题。我们通常根据中断源的轻重缓急排队,即规定每一个中断源有一个优先级别,CPU总是响应优先级别最高的中断。

中断嵌套:高优先级中断源可以中断一个正在执行的低优先级中断源的中断服务程序,即可实现两级中断嵌套,但同级或低优先级中断源不能中断正在执行的中断服务程序。2、AT89S51单片机能提供几个中断源?几个中断优先级?在同一优先级中各中断源的优先顺序如何确定?

答:AT89S51单片机是一种多中断源的单片机,有6个中断源,比MCS8051单片机的5个中断源多1个,但这个中断源是用于芯片的编程,对用户使用而言也是只有5个可用的中断源,它们分别是外部中断源2个,定时/计数器中断2个和串行口中断1个。AT89S51单片机中有2个中断优先级,当几个同级的中断源提出中断请求,CPU同时收到几个同一优先级的中断请求时,哪一个的请求能够得到服务取决于单片机内部的硬件查询顺序,其硬件查询顺序便形成了中断的自然优先级,CPU将按照自然优先级的顺序确定该响应哪个中断请求,自然优先级是按照外部中断0、定时/计数器0、外部中断1、定时/计数器1、串行口的顺序依次来响应中断请求。

3、与AT89S51单片机中断系统的控制有关的特殊功能寄存器有哪些?

答:在AT89S51单片机中,是通过设置一些特殊功能寄存器来对中断信号进行锁存、屏蔽、优先级控制。它们是寄存器TCON、SCON、IE和IP。

4、AT89S51单片机的外部中断有哪两种触发方式?如何选择?

答:外部中断请求有两种方式:即脉冲触发方式和电平触发方式

IT0(IT1)=1 脉冲触发方式,后沿负跳有效。

IT0(IT1)=0 电平触发方式,低电平有效。

5、简述AT89S51单片机响应中断的过程。

答:中断处理过程可分为三个阶段:即中断响应、中断处理和中断返回。

(1)中断响应

AT89S51单片机中断响应条件为:①当前不处于同级或更高级中断响应中,这是为了防止同级或低级中断请求中断同级或更高级中断;②当前机器周期必须是当前指令的最后一个机器周期,否则等待。执行某些指令需要两个或两个以上机器周期,如果当前机器周期不是指令的最后一个机器周期,则不响应中断请求,即不允许中断一条指令的执行过程,这是为了保证指令执行过程的完整性;③如果当前指令是中断返回指令RETI,或读写中断控制寄存器IE、优先级寄存器IP,则必须再执行一条指令后才能响应中断请求。

(2)中断处理

CPU响应中断并转至中断处理程序的入口,从第一条指令开始到返回指令为止,这个过程称为中断处理(也称为中断报务程序处理)。中断处理的过程即为执行中断服务子程序的过程。

(3)中断返回

中断处理程序的最后一条指令是中断返回指令RETI。它的功能是将断点弹出送回PC 中,使程序能返回到原来被中断的程序继续执行。AT89S51单片机的RETI指令除了弹出断点之外,还通知中断系统已完成相应的中断处理。

6、 AT89S51单片机的哪些中断源在CPU响应后可自动撤除中断请求?对于不能自动撤除中断请求的中断源用户应采取什么措施?

答:

(1)IE0和IE1 :外中断请求标志位。当CPU在0

INT(P3.2)或(P3.3)引脚上采样到有效的中断请求信号时,IE0或IE1位由硬件置“1”。在中断响应完成后转向中断服务时,再由硬件将该位自动清“0”。

(2)IT0和IT1 :外部中断请求触发方式控制位。IT0(IT1)=1 脉冲触发方式,后沿负跳有效。IT0(IT1)=0 电平触发方式,低电平有效。它们是根据需要由软件来置“1”或“0"。

(3)TF0和TF1 :定时/计数器溢出中断请求标志位

TF0(或TF1)=1时,表示对应计数器的计数值已由全1变为全0,计数器计数溢出,相应的溢出标志位由硬件置“1”。计数溢出标志位的使用有两种情况,当采用中断方式时,它作为中断请求标志位来使用,在转向中断服务程序后,由硬件自动清“0";当采用查询方式时,它作为查询状态位来使用,并由软件清“0”。

(4) TR0(TR1):定时/计数器的运行控制位。由软件方法使其置“1”或清“0”。

7、AT89S51单片机片内设有几个可编程的定时/计数器?它们可以有四种工作方式,如何选择和确定?

答:2个。主要由TMOD寄存器确定。

TMOD是一个不可以位寻址的8位特殊功能寄存器,字节地址为89H,其高4位专供T1使用的,其低4位专供T0使用的,如下图所示:

各位的含义如下:

(1)GATE:门控位

GATE=0:表示只要用软件使TCON中的运行控制位TR0(或TR1)置为1,就可以启动T0(或T1)。

GATE=1:表示只有在0

INT引脚为高电平时,并且有软件使运行控制位

INT或1

TR0(或TR1)置为1的条件下才可以启动T0(或T1)。

(2)T

C/:定时/计数方式选择位

T

C/=0:设置为定时方式,对内部的机器周期进行计数。

C/=1:设置为计数方式,通过T0(或T1)的引脚对外部脉冲信号进行计数。

T

(3)M1、M0:工作方式选择位

M1M0=00:为工作方式0,作13位计数器用;

M1M0=01:为工作方式1,作16位计数器用;

M1M0=10:为工作方式2,分成了2个独立的8位计数器用;

M1M0=11:为工作方式3,

8、AT89S51单片机定时器的门控位GATE设置1时,定时/计数器如何启动?

答:表示只有在0

INT引脚为高电平时,并且有软件使运行控制位TR0(或

INT或1

TR1)置为1的条件下才可以启动T0(或T1)。

9、对于定时器T0的工作模式3,由于TR1的控制位已经被T0占用,如何控制定时器T1的开启与关闭?

答:当T0工作在方式3时,T1只能工作在方式0~方式2,因为它的控制位已以被占用,不能置位TF1,而且也不再受TR1和的控制,此时T1只能工作在不需要中断的场合,功能受到限制。

一般T0工作在方式3时,T1通常用作串行口波特率发生器,用以确定串行通信的速率。

10、利用定时器T0产生一个50Hz的方波,由P1.1输出,设

f osc=12MHz.

答:

(1)思路:利用T0定时10ms,允许中断,中断服务程序中P1.1

(2)程序设计:

确定工作方式及TMOD

方式1定时,TMOD:00000001H=01H

计算初值X

X=65536-10000=55536=D8F0H

源程序

主程序:

ORG 0000H

LJMP MAIN ;转向主程序

ORG 000BH ;T0中断入口

LJMP INT-T0

MAIN : MOV TMOD, #01H ;T0方式1定时

MOV TH0, #0D8H ;定时10ms

MOV TL0, #0F0H

SETB ET0 ;允许T0中断

SETB EA

SETB TR0 ;启动T0

SJMP $;等待中断

TO中断服务程序

INT–T0: MOV TH0, ﹟0D8H ;重装初值

MOV TL0, ﹟0F0H

CPL P1.1 ;P1.0取反

RETI ;中断返回

11、什么是串行异步通信?它有哪些特点?串行异步通信的数据帧格式是怎样的?

答:串行通信方式: 数据信号的传送是按位顺序进行,最少只需一根传输线即可完成。其特点是成本低但速度慢。计算机与外界的数据传送大多数是串行的,串行通信传送的距离可以从几米到几千公里。

异步通信方式

数据是以帧为单位传送的,每1帧数据由1个字符代码组成,而每1个字符代码又是由起始位、数据位、奇偶校验位和停止位四个部分组成,如图4-9所示:

①起始位:它为接收端提供同步信息

0电平表示要传送信号,用于通知接收设备开始接收;

1电平表示不传送信号,接收设备在检测到1电平时,不作响应。

②数据位:它为接收端提供数据信息

数据位可以用5~8位数据来表示。

若是5位数据,则用D0~D4来表示,若是8位数据,则用D0~D7来表示。

③奇偶校验位:它为接收端提供校验信息或性质信息

排在数据位的后面,占有1位。如果数据位有8位,则校验位用D8表示。若作校验使用时,此位自动设置为0或1;若不作校验使用时,此位用来表示本帧信号的性质是地址或数据,1表示传送的为地址帧,0表示传送的为数据帧。

④停止位:它为接收端提供结束信息

停止位可以用1位、1位半或2位来表示,而且必须用1电平表示。

接收端收到此信息,就认为此字符发送完毕。在停止位的后面继续为1的位又称为空闲位,

空闲位可有可无,但必须是1电平,这时电路处于等待状态。

只有异步通信才有空闲位,这也是异步通信的特征。

12、什么是波特率?如果某异步通信的串行口每秒传送250个字符,每个字符由11位组成,其波特率应为多少?

答:特率对于CPU与外界的通信是很重要的。波特率是每秒钟传送的二进制代码的位数。每秒传送一个格式位就是1波特。即:1波特=lbps(位/秒)。

11×250=2750bit/s,即2750bps。

13、简述AT89S51单片机内部串行口的4种工作方式的特点与适用场合。

答:串行口工作方式0

为同步移位寄存器输入/输出方式。它可以外接移位寄存器以扩展并行I/O口,也可以外接同步输入/输出设备。此时用RXD(P3.0脚)来输入/输出8位串行数据,用TXD(P3.1脚)来输出同步脉冲。此方式的波特率是固定的,为fosc/12。

串行口工作方式1

它是最常用的10位且波特率可调的异步串行数据通信方式。

串行口工作方式2和工作方式3:

工作方式2和工作方式3都是每帧11位异步通信格式,由TXD和RXD发送和接收,工作过程完全相同。只是它们的波特率不同,方式2的波特率是固定的,方式3的波特率是由

定时器T1控制的。主要用于多机通信。

14、为什么定时器T1作串行口波特率发生器时常采用工作模式2?若已知系统晶振频率f osc,则通信选用的波特率,如何计算其初值?

答:T1的溢出速率取决于T1的计数速率(计数速率=振荡频率f osc/12)和T1的设定初值。定时器T1做波特率发生器使用时,因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当,若设定的初值为X,则每过256-X个机器周期,定时器T1就产生一次溢出。

用公式表示为: T1的溢出速率=(f osc/12)/(256-X), 反过来在已知波特率的条件下,可算出定时器T1工作在方式2的初值:X=256-f osc×(SMOD+1)/(384×波特率)

15、简述如何利用AT89S51单片机的串行口进行并行I/O口的扩展?

答:它由CPU和8位移位寄存器74LS164组成。

(1)串行数据转为并行输出的工作过程:

当CPU执行了一条对缓冲寄存器SBUF的写指令“MOV SBUF,A”,立即启动发送,将8位数据以fosc/12的固定波特率从RXD输出,低位在前,高位在后,在TXD的脉冲为时钟信号的作用下,数据一位一位装入74LS164。对移位寄存器74LS164来说,为“串入并出”。发送完一帧数据后,中断标志位TI由硬件置1。可以通过查询TI位来确定是否发送完一组数据,TI=1表示发送缓冲器已空。另外TI=1也可以作为中断请求信号,向CPU申请串行口发送中断,TI=1表示SBUF已空,可以再接收从CPU来的数据。当要发送下一组数据或中断响应后,需用软件使TI清0,才可以发送下一组数据。

⑵串行口用于扩展为并行输入口的工作原理

①电路结构:它由CPU和8位移位寄存器74LS165组成,如图4-15所示:

图4-15 串行口用于扩展为并行输入口的工作原理图

②并行转串行输入的工作过程:

当串行口以方式0接收数据时,先置位允许接收控制位REN为1。此时,RXD为串行数据输入端,TXD仍为同步移位脉冲输出端。当接收中断标志位RI=0和允许接收控制位REN=1同时满足时,就启动了一次接收。数据从RXD端串行输入到CPU内的接收缓冲器SBUF,在TXD的同步移位脉冲作用下, 从74LS165一位一位地取出数据,对移位寄存器74LS165来说,为“并入串出”。RXD端由D0(低位)开始接收数据,当接收完第8位数据时,由硬件置位RI。可以通过查询RI位来确定是否接收到一组数据,RI=1表示接收数据已装入接收缓冲器SBUF,可以由CPU用指令来读取,另外RI=1也可以作为中断请求信号,向CPU申请串行口接收中断,RI=1表示SBUF已满,CPU可以读取SBUF中的数据了。当接收完一组数据或中断响应后,

需用软件使RI清0,以准备接收下一组数据。

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

定时器中断程序设计实验

实验一定时器/中断程序设计实验 一、实验目的 1、掌握定时器/中断的工作原理。 2、学习单片机定时器/中断的应用设计和调试 二、实验仪器和设备 1、普中科技单片机开发板; 2、Keil uVision4 程序开发平台; 3、PZ-ISP 普中自动下载软件。 三、实验原理 805l 单片机内部有两个 16 位可编程定时/计数器,记为 T0 和 Tl。8052 单片机内除了 T0 和 T1 之外,还有第三个 16 位的定时器/计数器,记为 T2。它们的工作方式可以由指令编程来设定,或作定时器用,或作外部脉冲计数器用。定时器 T0 由特殊功能寄存器 TL0 和 TH0 组成,定时器 Tl 由特殊功能寄存器 TLl 和 TH1 组成。定时器的工作方式由特殊功能寄存器 TMOD 编程决定,定时器的运行控制由特殊功能寄存器 TCON 编程控制。T0、T1 在作为定时器时,规定的定时时间到达,即产生一个定时器中断,CPU 转向中断处理程序,从而完成某种定时控制功能。T0、T1 用作计数器使用时也可以申请中断。作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由 P3 口的 P3.4(或 P3.5)即 T0(或 T1)引脚输入。 方式控制寄存器 TMOD 的控制字格式如下: 低 4 位为 T0 的控制字,高 4 位为 T1 的控制字。GATE 为门控位,对定时器/计数器的启动起辅助控制作用。GATE=l 时,定时器/计数器的计数受外部引脚输入电平的控制。由由运行控制位 TRX (X=0,1)=1 和外中断引脚(0INT 或 1INT)上的高电平共同来启动定时器/计数器运行;GATE=0时。定时器/计数器的运行不受外部输入引脚的控制,仅由 TRX(X=0,1)=1 来启动定时器/计数器运行。 C/-T 为方式选择位。C/-T=0 为定时器方式,采用单片机内部振荡脉冲的 12 分频信号作为时钟计时脉冲,若采用 12MHz 的振荡器,则定时器的计数频率为 1MHZ,从定时器的计数值便可求得定时的时间。 C/-T=1 为计数器方式。采用外部引脚(T0 为 P3.4,Tl 为 P3.5)的输入脉冲作为计数脉冲,当 T0(或 T1)输入信号发生从高到低的负跳变时,计数器加 1。最高计数频率为单片机时钟频率的 1/24。 M1、M0 二位的状态确定了定时器的工作方式,详见表。

单片机定时器与计数器的工作方式解析

单片机定时器与计数器的工作方式解析 1 工作方式0 定时器/计数器的工作方式0称之为13位定时/计数方式。它由TL(1/0)的低5位和TH (0/1)的8位组成13位的计数器,此时TL(1/0)的高3位未用。 我们用这个图来讨论几个问题: M1M0:定时/计数器一共有四种工作方式,就是用M1M0来控制的,2位正好是四种组合。C/T:前面我们说过,定时/计数器即可作定时用也可用计数用,到底作什么用,由我们根据需要自行决定,也说是决定权在我们??编程者。如果C/T为0就是用作定时器(开关往上打),如果C/T为1就是用作计数器(开关往下打)。顺便提一下:一个定时/计数器同一时刻要么作定时用,要么作计数用,不能同时用的,这是个极普通的常识,几乎没有教材会提这一点,但很多开始学习者却会有此困惑。 GATE:看图,当我们选择了定时或计数工作方式后,定时/计数脉冲却不一定能到达计数器端,中间还有一个开关,显然这个开关不合上,计数脉冲就没法过去,那么开关什么时候过去呢?有两种情况 GATE=0,分析一下逻辑,GATE非后是1,进入或门,或门总是输出1,和或门的另一个输入端INT1无关,在这种情况下,开关的打开、合上只取决于TR1,只要TR1是1,开关就合上,计数脉冲得以畅通无阻,而如果TR1等于0则开关打开,计数脉冲无法通过,因此定时/计数是否工作,只取决于TR1。 GATE=1,在此种情况下,计数脉冲通路上的开关不仅要由TR1来控制,而且还要受到INT1管脚的控制,只有TR1为1,且INT1管脚也是高电平,开关才合上,计数脉冲才得以通过。这个特性能用来测量一个信号的高电平的宽度,想想看,怎么测? 为什么在这种模式下只用13位呢?干吗不用16位,这是为了和51机的前辈48系列兼容而设的一种工作式,如果你觉得用得不顺手,那就干脆用第二种工作方式。 2 工作方式1

51单片机中断定时器浅谈

51单片机中断定时器浅谈 中断处理函数原型 void timer1() interrupt0 using 0 timer1() 函数名 interrupt 表示是中断处理函数 0 表示是第几个中断源的处理函数 using 0 表示是使用第几组工作寄存器一般在C语言里面编译器屏蔽了会自动分配程序员一般不用关心。 注意:如果在中断处理函数中进行处理数据不能处理的数据量太大,因为定时器时间已到它就会又进入下一个中断处理函数,也就是这个中断处理函数还没有处理完下一个中断又来了。这样会造成结果错误或异常。 定时器: 定时器又2个寄存器控制,一个是TMOD 用于选择定时器、计数器 T0,T1的工作模式和工作方式。另一个是TCON 用于控制TO,T1的启动和停止,同时包含了T0,T1的状态,这2个寄存器在单片机复位时候所有位都被清0. TMOD 是不能位寻址的,因为它的地址是89H不能被8

整除。只能赋值或者进行与或运算进行赋值,其中有位是C/T 是把它配置成定时器还是计数器 0 表示是 定时器 M0,M1 这2位进行是定时器的模式几共4种模式其中方式1为16 高8位 TH0,低8位在 TL0 (65536-50000)/256 这就是高8位(65536-50000)%6 放入低8位是大约50毫秒前提是晶振为12兆赫。凡是用11.0592 的晶振是因为单片机要进行串口通讯因为 实现标准的波特率 4800 2400 115200 好计算。才选用11.0592的晶振。单片机的晶振可以选12兆一下的晶振都可以。12兆算是最快的速度了。当然不排除其他高速的单片级,可能达到更高运算速度。定时器最高一次定时为65535的数字,也就是大概65毫秒,因为是16位高8位低8位。所以如果用定时器长时间定时可以设置多次定时然后在main里面判断。实现长时间定时。定时器是一个加1的寄存器。初值最小为0 。最大65535 ,单片机做延时不占用MCU的资源比用 while 或 for循环好,能提高效率,当时浪费一个I/O口,所以用时综合考虑。 在一般情况下都是定时器与中断一起使用的,如:定时器时间到发生中断,一般都是IE TMOD TCON 三个寄存器联合使用 TCON 控制TR0 TR1 运行与停止 TMOD 控制工作模式 IE 控制总中断与对应的那个中断的开关

51单片机独立按键程序查询法和外部中断两种

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推 //1111111111111111111111111111111111111111111111111111111111111111111 //1111111111111111111111111111111111111111111111111111111111111111111 /****************************************************************************** * * 实验名: 左右流水灯实验 * 使用的IO : LED使用P2,键盘使用P3.1 * 实验效果: 按下K1键, * 注意: ******************************************************************************* / #include #include #define GPIO_LED P2 sbit K1=P3^1; void Delay10ms( ); //延时10ms /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main(void) { unsigned int i,j; j=0xfe; //1111_1110 while(1) { GPIO_LED=j; if(K1==0) //检测按键K1是否按下 { Delay10ms(); //消除抖动 if(K1==0) {

单片机计数器与定时器的区别

单片机计数器与定时器的区别 在的学习过程中,我们经常会发现中断、串口是学习的难点,对于初学者来说,这几部分的内容很难理解。但是我个人觉得这几部分内容是的重点,如果在一个学期的课堂学习或者自学中没有理解这几部分内容,那就等于还没有掌握51单片机,那更谈不上单片机的开发了,我们都知道在成品的单片机项目中,有很多是以这几部分为理论基础的,万年历是以定时器为主的,报警器是以中断为主的,联机通讯是以串口为主的。 在这几部分内容中,计数器/定时器对于初学者说很容易搞混淆,下面我将对这方面的内容结合自己的学习经验谈几点看法。 计数器和定时器相同的,他们都是对单片机中产生的脉冲进行计数,只不过计数器是单片机外部触发的脉冲,定时器是单片机内部在晶振的触发下产生的脉冲。当他们的脉冲间隔相同的时候,计数器和定时器就是一个概念。 在定时器和计数器中都有一个溢出的概念,那什么是溢出了。我们可以从一个生活小常识得到答案,当一个碗放在水龙头下接水的时候,过了一会儿,碗的水满了,就发生溢出。同样的道理,假设水龙头的水是一滴滴的往碗里滴,那

么总有一滴水是导致碗中的水溢出的。在碗中溢出的水就浪费了,但是在单片机的中溢出将导致一次中断。 在定时器计数器中,我们有个概念叫容量,就是最大计数量。 把水滴比喻成脉冲,那么导致碗中水溢出的最后一滴水的就是定时计数器的溢出的最后一个脉冲。 在各种单片机书本中,在介绍定时计数器时都讲到一个计数初值,那什么是计数初值呢?在这里我们还是假设水滴碗。假设第一百滴水能够使碗中的水溢出,我们就知道这个碗的容量是100。 在这里计数初值有3个,假设: 根据所得的初始值,再将其转换为,就可以进行计数或者定时了。后面讲解定时器初值的。 单片机, 计数器, 定时器

单片机实验 中断、定时器

大连理工大学实验报告(模板) 实验时间:年月日星期时间::~ : 实验室(房间号):实验台号码:班级:姓名: 指导教师签字:成绩: 实验三外部中断/INT0实验 一、实验目的和要求 学习、掌握单片机的中断原理。正确理解中断矢量入口、中断调用和中断返回的概念及物理过程。学习编写“软件防抖”程序,了解“软件防抖”原理。 对/int0、/int1两个外部中断进行编程,其中: ●主程序的功能:LDE灯“全亮”、“全灭”交替进行 --------(状态2); ●Int0中断服务程序功能:2个相邻的LED灯被点亮且循环左移(状态0); ●Int1中断服务程序功能:1个LED灯被点亮且循环右移 ---(状态1);【注意】:实验仪上的LED灯物理位置最左侧为d0;最右侧为d7。 二、实验算法 1 在主程序中利用CPL P3.3的指令驱动其电平不断地转换(由逻辑笔电路做程序状态监视)。 2 在中断服务程序中将P3.3置位(P3.3=1),实现对计数器“加1”并(通过P1口)显示的功能。 3 中断结束后回到主程序,程序继续对P3.3的电平不断取反。 三、实验电路图

四、实验流程图 主程序入口INT0入口 设置中断允许P3.2置1 设置中断优先级调用延时子程序 设TCON 计数器加一并显示 CLR A开中断 (P0)—(A) P3.2=0? 调用延时子程序调用延时子程序 (A)—(A) RETI INT1同理 五、程序清单 ORG 0000H LJMP START ORG 0003H LJMP INT_0 ORG 0013H LJMP INT_1 ORG 0100H ;主程序 START: MOV SP,#60H MOV IE,#85H

51单片机定时中断C语言的写法步骤

51单片机定时中断C语言的写法步骤 程序说明:51单片机定时器0工作于方式一,定时50ms中断一次 晶振为12M #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 ET0 = 1; //开定时器0中断 EA = 1; //开总中断 TR0 = 1; //启动定时器0 while(1) { ; } } void Timer0_int() interrupt 1 { //重新装初值 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 } /****************************************************************************** *********************************/ 上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样 #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = 0x3c; //高八位装入初值 TL1 = 0xb0; //低八位装入初值 IE = 0x82;//开总中断并开定时器0中断 TR0 = 1; //启动定时器0 while(1) { ; } }

void Timer0_int() interrupt 1 { //重新装初值 TH1 = 0x3c; //高八位装入初值TL1 = 0xb0; //低八位装入初值}

单片机定时器详解

一、MCS-51单片机的定时器/计数器概念 单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51单片机外接的是12MHZ的晶振(实际上是,所以,MCS-51单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒=1000000次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令; 注:个人PC机上的CPU主频是晶振经过倍频之后的频率,这一点恰好与MCS-51单片机的相反,MCS-51单片机的主频是晶振经过分频之后的频率; 总之:MCS-51单片机中的时间概念就是通过计数脉冲的个数来测量出来的;1个脉冲=1微秒=1条指令=1个机器周期; MCS-51单片机定时器/计数器的简单结构图: 8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合; 二、定时器/计数器的结构

51单片机学习笔记(三)_定时器和计数器

51单片机学习笔记(三)_定时器和计数器 注:定时器与计数器原理与使用方法相似、此处计数器知识为基础普及、后 面详讲2 个定时器(寄存器)、定时器0、定时器1、(计数器0、计数器1) TMOD:定时器/计数器模式控制寄存器详见百度百科TMOD 每经过一个机器周期、寄存器+1TF:定时器溢出标志。溢出时自动置1。中 断时硬件清零否则必须软件清零。TR:定时器运行控制位。置1 开始计时、清 零停止计时。C/T:该位为0 时用作计时器、该位为1 时用作计数器。溢出时 时间-开始计时时间=预设定时时间 一个机器周期共有12 个振荡脉冲周期若设定时为0.02s,则: 12*(65535-X)/11059200=0.02s 定时器作加1 次数:X=47104=0xB800 次时间为0.02s 使用定时器的方法 1、设置特殊功能寄存器TMOD,使之工作在需求的状态。 2、设置计数寄存 器的初值,精确设定好定时时间。3、设置特殊功能寄存器TCON,通过打开 TR 来让定时器进行工作。 4、判断寄存器TCON 的FT0 位、检测定时器溢出情况。 假设我们使用定时器0、定时为0.02s,两个寄存器计时 TMOD=0x01; TMOD=0x01,指的是采用T0 方式,将M1 置0,M0 置1,是 方式一的定时器 高八位寄存器TH0=0xB8、低八位寄存器TL0=0x00 C 程序实现1s 钟定时 #include typedef unsigned char uint8;typedef unsigned int uint16;sbit led=P1;uint8 counter;void main(){TMOD=0x01;TH0=0xb8;TL0=0x00;TR0=1;

51单片机C语言中断程序定时计数器

51单片机C语言中断程序定时/计数器 程序一 利用定时/计数器T0从P1.0输出周期为1s 的方波,让发光二极管以1HZ闪烁, #include //52单片机头文件 #include //包含有左右循环移位子函数的库#define uint unsigned int //宏定义 #define uchar unsigned char //宏定义 sbit P1_0=P1^0; uchar tt; void main() //主函数 { TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 while(1);//等待中断产生 }

void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; if(tt==20) { tt=0; P1_0=~P1_0; } } 程序二 利用定时/计数器T1产生定时时钟, 由P1口控制8个发光二极管, 使8个指示灯依次一个一个闪动, 闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。#include //52单片机头文件 #include //包含有左右循环移位子函数的库 #define uint unsigned int //宏定义 #define uchar unsigned char //宏定义

51单片机外部中断与定时器的实用

中断使能寄存器 通过设置中断使能寄存器 IE 的 EA 位 使能所有中断 每个中断源都有单独的使能位 可通过软件设置 IE 中相应的使能位在任何时候使能或禁能中断 中断使能寄存器 IE 的各 位如下所示 中断使能寄存器IE 位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA / ET2 ES ET1 EX1 ET0 EX0 EA 使能标志位 置位则所有中断使能 复位则禁止所有中断保留 ET2 定时器2 中断使能 ES 串行通信中断使能 ET1 定时器 1 中断使能 EX1 外部中断 1 使能 ET0 定时器0 中断使能 EX0 外部中断 0使能 8051 支持两个中断优先级 有标准的中断机制, 低优先级的中断只能被高优先级的中断所中断 ,而高优先级的中断不能被中断。 中断优先级寄存器 每个中断源都可通过设置中断优先级寄存器IP 来单独设置中断优先级 如果每个中断源的相应位被置位 则该中断源的优先级为高,如果相应的位被复位, 则该中断源的优先级为低, 如果你觉得两个中断源不够用 ,别急以后我会教你如何增加中断优先级 表 A-5 示出了 IP 寄存器的各位 此寄存器可位寻址 IP 寄存器 位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 位符号 / / / PS PT1 PX1 PT0 PX0 编号 中断源 中断向量 上电复位 0000H 0 外部中断0 0003H 1 定时器0溢出 000BH 2 外部中断1 0013H 3 定时器1溢出 001BH 4 串行口中断 0023H 5 定时器2溢出 002BH PT2 定时器 2中断优先级 PS 串行通信中断优先级 PT1 定时器 1中断优先级 PX1 外部中断1 优先级 PT0 定时器0中断优先级 PX0 外部中断0 优先级

实验五 8051单片机定时中断实验

实验五8051单片机定时中断实验 一实验目的: 了解8051系列单片机的定时中断基本工作原理。掌握8051系列单片机定时中断的用法。 二实验原理: 在上一个实验里我们介绍了8051单片机的外中断应用,本实验要介绍的是定时器中断的应用。 8051系列单片机至少有两个16位的内部定时器/计数器,既可以编程为定时器使用,也可以作为计数器使用。如果是计数内部晶振驱动时钟,它是定时器,如果是计数8051的输入管脚的信号,就是计数器。 MCS-51单片机内部的定时/计数器的结构如图5-1所示,定时器T0特性功能寄存器TL0(低8位)和TH0(高8位)构成,定时器T1由特性功能寄存器TL1(低8位)和TH1(高8位)构成。特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。程序开始时需对TL0、TH0、TL1和TH1进行初始化编程,以定义它们的工作方式和控制T0和T1的计数。 图5-1 TMOD特殊功能寄存器的格式参见下表(表5-1): 表5-1 高4位为定时器/计数器1的控制字,低4位为定时器/计数器0的控制字。其中GATE 为门控信号,C/T为定时器或计数器的选择,而M1,M0是工作方式选择位。 当M1M0=00时,T/C工作在方式0。方式0为13位的T/C,其计数器由TH的8位和TL的5

位构成,计数器的计数值范围是: 1—8192(213),但是启动前可以预置计数初值。当C/T为 0时,T/C为定时器,计数脉冲为振荡源12分频的信号;当C/T为1时,T/C为计数器,对输入端T0或T1输入的脉冲进行计数。计数脉冲加到计数器上与否决定于启动信号。当GATE=0时,TR=1时T/C便启动,当GATE=1时,启动受到TR与INT的双重控制,即二者同时为高 时才启动。当计数满时,TH向高位进位,这时中断溢出标志TF置1,即产生中断请求。而当CPU转向中断服务程序时,TF自动清零。 当M1M0=01时,T/C工作在方式1。方式1和方式0的区别仅在于方式0的计数器位数为13位,而方式1的为16位。 当M1M0=10时,T/C工作在方式2。区别于前面的两种工作方式的是,方式2具有自动重装载的功能。TH和TL作为两个8位的计数器,TH中的8位初值始终保持不变,由TL进行8位计数。在计数溢出时不但会产生中断请求,而且自动将TH中的值加载至TL 中,即自动重装载。 当M1M0=11时,T/C工作在方式3。但是这种工作方式只存在于T/C0中,这时TH0与TL0成为两个独立的计数器。只有在T/C1作为串行口的波特率发生器使用,而造成定时器不够用时,T/C0才能工作在方式3。 下面是定时器时间常数计算公式,这个公式在方式1,即16 位定时或计数模式可用。 THX=(65536-定时时长[μS]/(机器周期数/时钟频率[MHz])/256; TLX=(65536-定时时长[μS]/(机器周期数/时钟频率[MHz])%256; 在定时器重装载过程中因为TL1=0可以不写。 三实验内容: 利用中断方式在LED上输出10HZ方波,系统晶体频率11.059MHz。 四实验电路图:

单片机外部中断详解及程序

单片机外部中断详解及程序 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。 实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。 #include ;

unsigned int t=500; //定义一个全局变量t,并设定初始值为500次 //===========延时子函数,在8MHz晶振时约 1ms============= void delay_ms(unsigned int k) { unsigned int i,j; for(i=0;i

按键和定时器中断综合应用-秒表计时器

& INT1按键中断INT0# 和T0中断的综合应用 ‐简易秒表计时器 范例1:汇编源代码 范例2:C51源代码

P7 EQU 0F8H ORG 0100H #60H P6 EQU 0E8H D1 EQU 0FEH //数码管个位EQU 0FDH MAIN: MOV SP ,#60H //设置堆栈 MOV P2,#0FFH //关P2口LED MOV TMOD,#00H D2 //十位D3 EQU 0FBH // 百位 VARX DATA 30H //计数变量DATA 31H MOV TH0,#4BH MOV TL0,#0FDH //设置T0MOV R7,#20MOV VARX,#0 //置计数变量0DIG1 //BCD 个位DIG2 DATA 32H //BCD 十位DIG3 DATA 33H //BCD ,SETB ET0SETB EX0SETB IT0//百位ORG 0000H LJMP MAIN SETB EX1SETB IT1 SETB EA //允许相关中断 ORG 0003H LJMP KY1INT //KY1中断ORG 000BH LJMP T0INT //T0中断ORG 0013H KY2INT //KY2LJMP 中断

CONV: MOV A,VARX //读计数变量MOV A,DIG2 //读十位BCD MOV B,#100DIV AB DIG3A MOVC A,@A+DPTR MOV P7,A P6#D2//MOV DIG3,A MOV A,B MOV B,#10MOV P6,#D2 查表送显示ACALL DELAY //扫描延时A,DIG3//DIV AB MOV DIG2,A DIG1B MOV 读百位BCD MOVC A,@A+DPTR MOV P7,A MOV DIG1,B //转换为3位BCD DISP: MOV A,DIG1 //读个位BCD MOV DPTR,#SEGTBL MOV P6,#D3 //查表送显示ACALL DELAY CONV //MOVC A,@A+DPTR MOV P7,A P6,#D1//LJMP 返回读取VARX MOV 查表送显示 ACALL DELAY //扫描延时

单片机定时器中断时间误差的解决方案

单片机定时器中断时间误差的解决方案 时间:2012-06-12 14:04:04 来源:作者: 1 前言 单片机内部一般有若干个定时器。如8051单片机内部有定时器0和定时器1。在定时器计数溢出时,便向CPU发出中断请求。当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。 2 误差原因、大小及特点 产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。 2.1. CPU正在执行某指令时的误差及大小 由于CPU正在执行某指令,因此它不能及时响应定时器的溢出中断。当CPU执行此指令后再响应中断所延迟的最长时间为该指令的指令周期,即误差的最大值为执行该指令所需的时间。由于各指令都有对应的指令周期,因此这种误差将因CPU正在执行指令的不同而不同。如定时器溢出中断时,CPU正在执行指令MOV A, Rn,其最大误差为1个机器周期。而执行指令MOV Rn, direct时,其最大误差为2个机器周期。当CPU正在执行乘法或除法指令时,最大时间误差可达4个机器周期。在8051单片机指令系统中,多数指令的指令周期为1~2个机器周期,因此最大时间误差一般为1~2个机器周期。若振荡器振荡频率为fosc,CPU正在执行指令的机器周期数为Ci,则最大时间误差为Δtmax1=12/fosc× Ci(us)。例如fosc=12MHZ,CPU正在执行乘法指令(Ci=4),此时的最大时间误差为: Δtmax1=12/fosc×Ci=12/(12×106)×4=4×10-6(s)=4(μs)

单片机实验――利用中断控制LED灯(精)

单片机实验——利用中断控制LED灯 1.实验目的 (1掌握单片机中断的基本原理。 (2掌握单片机中断程序的编制方法。 2.预习要点 (1单片机中断基本原理 (2中断程序编制方法 3.实验设备 计算机、单片机实验箱、信号发生器。 4.实验内容 基本要求: 将信号发生器输出的脉冲信号连接到CPU的INT0上,将CPU的P1.0到P1.7和八个LED连接,脉冲信号为5V、100Hz,每输入一百个脉冲LED灯亮一次,并且LED灯顺序循环移位一次,形成跑马灯。 扩展要求: 提高输入脉冲频率,但跑马灯的显示频率不变。 实验4 ORG 0000H AJMP MAIN

;****************************************** ;中断子程序入口地址 ORG 0003H LJMP EXINT0 ;****************************************** ;主程序 ORG 0030H MAIN:MOV SP,#70H SETB IT0 ;设置为下降沿触发 SETB EX0 ;开INT0的中断开关 SETB EA ;开总中断开关 MOV R0,#01H ;只让一盏灯亮,R0赋给P1口 MOV R3,#00H ;R3用来记中断次数 MOV A,R0 MOV P1,A HERE:SJMP HERE ;死循环,还有另外一种形式是SJMP $ ;****************************************** ;外中断0服务程序 EXINT0:INC R3 ;每来一次中断R3自加1

CJNE R3,#100,NEXT ;当来了100次中断之后,R3清零,然后P1口的MOV R3,#00H ;数左移一位,也就是让下一个LED亮 MOV A,R0 RL A MOV P1,A MOV R0,A ;保存左移之后的结果 NEXT:RETI ;****************************************** END 实验4扩展 ORG 0000H AJMP MAIN ;****************************************** ;中断入口地址 ORG 0003H LJMP EXINT0 ;****************************************** ;主程序 ORG 0030H

51单片机每个外部中断和定时器中断 应用模版

第一步,中断配置 /************************************************************ 函数名:INT0_Config 功能:配置单片机与中断相关的硬件,让单片机能够正常检测中断和执行中断代码。 输入参数: 输出参数: ************************************************************/ void INT0_Config(void) { IT0=1; //中断触发方式,IT0=0,低电平触发,INT0=1下降沿触发(下降沿就是由高电平向低电平的跳变); EX0=1; //外部中断0的中断开关,每个中断源都有自己的中断开关。 EA=1; //打开总中断,如果总中断不打开,就是其他中断开关被打开,单片机也不能执行中断。 } 第二步,中断服务,也就是cpu被中断后所要做的事。 /************************************************************ 函数名:Isr_INT0 功能:中断服务 输入参数: 输出参数: ************************************************************/ void Isr_INT0() interrupt 0 //interrupt表明该函数是中断函数,后面的标号表示是哪个中断源产生的中断。{ //(INT0)为0, Timer0为1,INT1为2,Timer3,串口中断为4。 // Add your code here //自己想要中断后发生的程序 } 第三部主函数 /************************************************************ 函数名:main 功能:主函数 输入参数: 输出参数: ************************************************************/ void main() { INT0_Config();//调用这个函数来配置外部中断 while(1) { //Add your code here //CPU一直在这里循环的执行代码,一旦发生中断,就停下来去执行中断函数Isr_INT0() interrupt 0, //执行完成后,返回从断点处继续往下执行原来的代码。 } }

单片机实验之定时器计数器应用实验二

一、实验目的 1、掌握定时器/计数器计数功能的使用方法。 2、掌握定时器/计数器的中断、查询使用方法。 3、掌握Proteus软件与Keil软件的使用方法。 4、掌握单片机系统的硬件和软件设计方法。 二、设计要求 1、用Proteus软件画出电路原理图,单片机的定时器/计数器以查询方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数,每计满100个脉冲,则取反P1.0口线状态,在P 1.0口线上接示波器观察波形。 2、用Proteus软件画出电路原理图,单片机的定时器/计数器以中断方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数,每计满200个脉冲,则取反P1.0口线状态,在P 1.0口线上接示波器观察波形。 三、电路原理图 六、实验总结 通过本实验弄清楚了定时/计数器计数功能的初始化设定(TMOD,初值的计算,被计数信号的输入点等等),掌握了查询和中断工作方式的应用。 七、思考题 1、利用定时器0,在P1.0口线上产生周期为200微秒的连续方波,利用定时器1,对 P1.0口线上波形进行计数,满50个,则取反P1.1口线状态,在P 1.1口线上接示波器观察波形。 答:程序见程序清单。

四、实验程序流程框图和程序清单。 1、定时器/计数器以查询方式工作,对外部连续周期性脉冲信号进行计数, 每计满100个脉冲,则取反P1.0口线状态。 汇编程序: START: LJMP MAIN ORG 0100H MAIN: MOV IE, #00H MOV TMOD, #60H MOV TH1, #9CH MOV TL1, #9CH SETB TR1 LOOP: JNB TF1, LOOP CLR TF1 CPL P1.0 AJMP LOOP END C语言程序: #include sbit Y=P1^0; void main() { EA=0; ET1=0; TMOD=0x60; TH1=0x9C; TL1=0x9C; while(1) { TR1=1; while(!TF1); TF1=0; Y=!Y; } }

51单片机定时器与中断

例1:查询方式 ORG 0000H AJMP START ORG 30H START: MOV P1,#0FFH ;关所灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB TR0 ;定时/计数器0开始运行 LOOP:JBC TF0,NEXT ;如果TF0等于1,则清TF0并转NEXT处 AJMP LOOP ;不然跳转到LOOP处运行 NEXT:CPL P1.0 MOV TH0,#15H MOV TL0,#9FH;重置定时/计数器的初值 AJMP LOOP END AJMP LOOP END 键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用JBC呢?TF0是定时/计数器0的溢出标记位,当定时器产生溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标记位清0,以便下一次定时是间到时该位由0变1,所以用了JBC指令,该指位在判1转移的同时,还将该位清0。 以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不,不对,我们能在LOOP:……和AJMP LOOP指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代DJNZ吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。 程序2:用中断实现 ORG 0000H ,https://www.360docs.net/doc/b411443861.html, AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 LOOP: AJMP LOOP ;真正工作时,这里可写任意程序 TIME0: ;定时器0的中断处理程序

相关文档
最新文档