单片机80C196KC的T2溢出中断怎么用来定时

作者&投稿:杨冒 (若有异议请与网页底部的电邮联系)
单片机中使用中断定时器完成一小时定时程序~

这个很容易的。比如你的时钟频率f = 1MHz,计数器为16bit
1h = 60*60 = 3600s,而一个周期为1us
那么你要计数为3600*10^6us = 50000*1200*6000
那么你可以定义两个int型变量,分别为cnt1,cnt2
计数器设定计数值为50000,每次进入中断以后,cnt1+1
如果cnt1 = 6000,cnt2 + 1
直到cnt2 = 1200即可。

根据题目看 这里溢出中断只是为了达到能让人眼分辨出来的效果。 效果就像延时,但绝不等同延时。不管灯同亮同暗还是向左移动 都是采用一种不断值行定时器2溢出中断!也就是。一开始在main语句里 让定时器2值行了溢出中断,然后在中断函数里值行相应的事情(如灯同亮同暗 向左移动)值行完后 他又给TCNT 这个值赋了相同的值,就他再值行一次中断。

将AT89C52用作多功能外围器件使用
发布时间:2004年12月25日 点击次数:874
来源:单片机及嵌入式系统应用 作者:过幼南

摘要:介绍利用AT89C52单片机作为多功能可编程接口的方法。该接口具有1个键盘/显示接口,2个16位定时/计数器和1个全双工异步串行通信口。其模块化的设计,可以给用户使用带来许多方便。

关键词:多功能接口 串行通信 软件译码

AT89C52(简称89C52)的广泛使用,使单片机的价格大大下降。目前,89C52的市场零售价已经低于8255、8279、8253、8250等专用接口芯片中的任何一种;而89C52的功能实际上远远超过以上芯片。因此,如把89C52作为接口芯片使用,在经济上是合算的。在本人设计的系统中,将89C52设计为多功能可编程接口,其相关程序固化在片内的Flash ROM中。该芯片(以下简称多功能接口)具有如下功能:①有1个专用的键盘/显示接口;②有1个全双工异步串行通信接口;③有2个16位定时/计数器。这样,1个89C52芯片,承担了3个专用接口芯片的工作;不仅使成本大大下降,而且优化了硬件结构和软件设计,给用户带来许多方便。

1 硬件结构

把89C52当作接口使用,接口自身必须尽可能地少占用硬件资源,与主系统之间的连接线也应尽可能少,这样才能少占主机引脚,把更多的资源留给系统。本设计中,主机与多功能接口之间采用串行通信。主机与多功能接口之间有四根连接线:CE、CLK、DAT、INTR。CE用于作片选信号输入端。此引脚为低电平时,主机能与多功能接口进行数据传送。CLK为时钟输入端,当主机向多功能接口发送指令时,此引脚电平上升表示数据有效。DAT为串行数据输入/输出端。INTR为多功能接口输出端。当多功能接口内的数据准备好时,由INTR向主机发低电平,通知主机,数据已准备就绪,可以进行读操作。该信号可供主机查询,也可用作发向主机的中断请求信号。

89C52的P0、P1、P2口用作键盘/显示接口。用程序扫描的方法进行键盘输入和显示输出。P0口作为字段口,P1口作为键盘的列输入口,P2作为显示器的字位口以及键盘的行扫描输出口。由于显示器字位口电流较大,P2口需进行电流驱动。该多功能接口最多可连接8个LED显示器和1个8×8链盘矩阵。其硬件原理如图1所示。

P3.2、P3.3、P3.6、P3.7分别用作CE、CLK、DAT和INTR信号;而P3.0、P3.1用作异步串行通信数据线RXD和TXD;P3.4、P3.5分别是OUT0/T0和OUT1/T1信号线。该引脚在定时器工作于连续脉冲方式时,可输出通断比与频率可编程的连续脉冲;工作在计数器方式时,该引脚作为外部计数脉冲输入端输入计数脉冲。

图1

2 通信协议

实现多功能接口的关键是主机和多功能接口之间的通信。在本设计中,采用主从方式进行通信,所有的操作都由主机发出操作指令。多功能接口在收到主机发来的操作指令后,对操作码进行软件译码。根据操作码的内容转入相应的工作通道,并从操作数部分获取所需要的数据。

多功能接口采用串行方式与主机通信。串行数据从DAT引脚送入芯片,并由CLK端同步。当片选信号CE变低后,DAT引脚上的数据在CLK引脚的上升沿被写入多功能接口的寄存器中。

串行接口的时序如图2所示。

图2

由于多功能接口接收指令的工作用软件进行,因此,图中的t1、t2、t3、t4、t5时间较长,要求t1-t4时间在10μs~1000μs。指令有两类:一类写指令,一类是读指令。写指令中不管是操作码还是操作数,其数据传送方向均为从主机到多功能接口;而对读指令来讲,操作码部分的数据方向是从主机到多功能接口,而操作数部分的数据方向是从多功能接口到主机。

t5是读指令中操作码与操作数之间需要的时间间隔,t5应在30μs~1000μs的范围。在读操作时,CLK时钟的上升沿来到时,多功能接口将数据送到DAT引脚上。

3 指令编码

多功能接口共有13条指令。指令长度为1字节、2字节、3字节和4字节不等。

(1)复位指令

机器码为00H。当多功能接口收到复位指令后,所有字符消隐,所有定时器清零,定时中断和串行中断关闭。其状态与系统上电复位的情况相似。

(2)显示数据指令

该指令向多功能接口的显示缓冲器中发送显示数据。这是一个2字节指令,其指令编码如下:

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 0 0 0 0
D7 D6 D5 D4 D3 D2 D1 D0
dip 0 0 0 d3 d2 d1 d0

其中dip为小数点控制位,a2、a1、a0为位地址,d3、d2、d1、d0为待显示的字符,其格式如表1、2所列。

(3)闪烁指令

该指令控制各个数码管的闪烁属性。d7~d0分别对应数码管1~8,1为闪烁,0为不闪烁。

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 0 0 0 0
D7 D6 D5 D4 D3 D2 D1 D0
d7 d6 d5 d4 d3 d2 d1 d0

(4)循环左移指令

指令码为11H。该指令将所有显示从左向右移动1位。

表1

a2 a1 a0 显示位
0 0 0 1
0 0 1 2
0 1 0 3
0 1 1 4
1 0 0 5
1 0 1 6
1 1 0 7
1 1 1 8

表2

d3 d2 d1 d0 显示字符
0 0 0 0 0
0 0 0 1 1
0 0 1 0 2
0 0 1 1 3
0 1 0 0 4
0 1 0 1 5
0 1 1 0 6
0 1 1 1 7
1 0 0 0 8
1 0 0 1 9
1 0 1 0 -
1 0 1 1 H
1 1 0 0 L
1 1 0 1 P
1 1 1 0 E
1 1 1 1 空

(5)循环右移指令

指令码为12H。该指令将所有显示从右向左移动1位。

(6)读键盘指令

指令为2字节指令,操作数为读到的键值。各键盘的键值如图1所示。该指令格式如下:

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 0 0 1 1
D7 D6 D5 D4 D3 D2 D1 D0
d7 d6 d5 d4 d3 d2 d1 d0

(7)连续脉冲输出指令

该指令对定时器进行编程。使OUT0/OUT1输出连续脉冲,脉冲的通断比和频率可以通过编程设定。其指令为4,格式如下:

第1字节

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 0 0 1 1/0

第2字节

D7 D6 D5 D4 D3 D2 D1 D0
M3 M2 M1 M0 N3 N2 N1 N0

第3字节

D7 D6 D5 D4 D3 D2 D1 D0
f15 f14 f13 f12 f11 f10 f9 F8

第4字节

D7 D6 D5 D4 D3 D2 D1 D0
f7 f6 f5 f4 f3 f2 f1 f0

其中M:N是脉冲的通断比,M或N的设置范围是1~10。f15~f0是频率设置,其设置范围是1~9999Hz。采用BCD码设置。指令操作码中,D0设置定时器0或定时器1工作。

(8)定时器方式指令

该指令为3字节指令。操作码为22H、23H,其中D0位确定对定时器0还是定时器1进行操作。第2、第3字节为定时时间。

(9)计数器方式指令

该指令为3字节指令。操作码为24H、25H,其中D0位确定对定时器0还是定时器1进行操作。第2、第3字节为计数初值。

(10)读计数器指令

为3字节指令。操作码为26H、27H,第2、第3字节为从计数器读到的计数值。操作码的D0位确定对计数器0还是计数器1进行操作。通过该指令读以16位计数器的当前计数值。

(11)串行发送指令

该指令对异步串行通信进行初始化,其指令格式如下:

第1字节

D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 1 0 a2 a1 a0

表2字节

D7 D6 D5 D4 D3 D2 D1 D0
b1 b0 d5 d4 d3 d2 d1 d0

第3字节

D7 D6 D5 D4 D3 D2 D1 D0
d7 d6 d5 d4 d3 d2 d1 d0

第4字节

D7 D6 D5 D4 D3 D2 D1 D0
d7 d6 d5 d4 d3 d2 d1 d0

串行通信采用批传送的方法进行。每条指令传送1个数据帧。指令中,第1、第2字节用来进行串行通信初始化,第3字节以后是发送的各个数据。b1、b0用来确定奇校验、偶校验还是不校验。第2字节的操作数d5、d4、d3、d2、d1、d0用来设定该帧数据的个数,最多1帧可发送64个字符。a2、a1、a0设定串行通信的波特率。其波特率如表3所列。

表3

a2 a1 a0 波特率/baud
0 0 0 110
0 0 1 150
0 1 0 300
0 1 1 600
1 0 0 1200
1 0 1 2400
1 1 0 4800
1 1 1 9600

(12)串行接收指令

指令格式如下:

第1字节

D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 1 1 a2 a1 a0

第2字节

D7 D6 D5 D4 D3 D2 D1 D0
b1 b0 d5 d4 d3 d2 d1 d0

第3字节

D7 D6 D5 D4 D3 D2 D1 D0
d7 d6 d5 d4 d3 d2 d1 d0

第4字节

D7 D6 D5 D4 D3 D2 D1 D0
d7 d6 d5 d4 d3 d2 d1 d0

指令编码与串行发送送似,第3字节之后为接收到的数据。

(13)读状态指令

指令格式如下:

D7 D6 D5 D4 D3 D2 D1 D0
0 1 0 0 0 0 0 0
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 d4 d3 d2 d1 d0

在键盘输入、计数器回等或串行通信中断时,多功能接口将向INTR发出负脉冲,主机在响应后应发读状态指令,查询状态标志,确定是哪个状态标志动作。其中d0为键盘输入标志,d1为计数器0回零动作。d2为计数器1回零标志。d3为串行接收结束标志,d4为串行发送结束标志。

4 多功能接口的软件设计

在主程序中进行显示扫描和键盘扫描,如有键盘输入,则找出键盘矩阵的键号。键号存入键值寄存器,并置位状态标志,同时发出INTR负脉冲,通知主机来取键值。

主机通过指令对多功能接口进行操作。主机首先要将CE置0。该下降沿通过P3.2向多功能接口发出外部中断。在中断服务程序中,多功能接口进行取指和译码操作,并通过散转指令转入相应的处理通道。则中断返回。至此,一条指令的取指-译码-执行的过程才告结束。程序回到主循环继续进行显示扫描和键盘扫描。

所谓取指操作实际上就是多功能接口与主机进行通信的过程。由于采取软件进行通信,t1、t2、t3、t4、t5的宽度有一定的范围。

在接收到主机的操作指令后,多功能接口与外设的串行通信及有关定时器的操作采用中断方式进行。在中断结束时,置位状态标志,并向主机发INTR负脉冲。该负脉冲可供主机查询,也可作为向主机发出的中断请求信号。完成以上工作后,返回主程序。

89C52有三个定时器,其中T2在中串行通信时间来作为串行通信的波特率发生器。这样T0和T1就可以出借给用户作定时器内。T2在波特率发生器方式时,可置位T2CON寄存器中的TCLK位或RCLK位。在TH2、TL2中装入计数初值,使T2从这个初值开始计数,但并不置位FT2。RCAR2H和RCAP2L中的常数由软件设定后,T2的溢出率是严格不变的,因而使串行通信的波特率非常稳定。

5 应用实例

在本刊网络补充版(http://www.dpj.com.cn)中,给出主机为AT89C52时的应用实例。程序的功能为等待键盘输入,然后将所读到的键盘码转换成十进制后送LED数码管显示。


溧水县19563737502: 16位单片机彩灯控制实验,定时器2溢出中断问题!
离录药用: 根据题目看 这里溢出中断只是为了达到能让人眼分辨出来的效果. 效果就像延时,但绝不等同延时. 不管灯同亮同暗还是向左移动 都是采用一种不断值行定时器2溢出中断! 也就是.一开始在main语句里 让定时器2值行了溢出中断,然后在中断函数里值行相应的事情(如灯同亮同暗 向左移动)值行完后 他又给TCNT 这个值赋了相同的值,就他再值行一次中断. 如此反复下去.就有一种while(1) 的死循环效果. 而每一次中断都采用了分频 像64分频 或 256分频 来达到延时效果.其实不是延时 是单片机不工作了. 你可能会问:为什么不采用延时,而采用中断. 中断的好处就是降低了单片机压力. 就像让单片机休息后再干事.

溧水县19563737502: PIC单片机的WDT溢出后如何正确判断 -
离录药用: WDT溢出时程序就会自动复位,PC指针会跳到0x0000地址执行程序,并且复位所有特殊功能寄存器器.你确定一下WDT复位PC寄存器之后,如果TO是一个中断标志应该会在系统复位之后把所有寄存器都复位.如果没有猜错TO应该是让你用来喂狗的位.如果你在看门狗定时器计数结束之前不喂狗,系统就复位.所以这个TO应该是让你用软件来喂狗的吧.应该不是WDT产生中断的标志.寄存器在复位后的状态在芯的数据手册中关于寄存器说明中可以找到.

溧水县19563737502: 单片机溢出问题 -
离录药用: 对于单片机,不如先将两个操作数扩大一个类型,如原来是signed char 就扩成 signed short然后再运算,运算后再判断是否在signed char 下相加会溢出,即大于127.这个比相加后再判断要好一点.数据长度扩大后,肯定不会出现溢出了.

溧水县19563737502: 单片机 计数器溢出 -
离录药用: TH0=-(1000/256);TH0赋值为1000除以256的商的负值;TL0=-(1000%256);TL0赋值为1000除以256的余数的负值;TH0=-250;TH0赋值为-250;TH0是器T0的高8位初值 TL0是51单片机内部定时器T0的低8位初值 前两句的意思其实就是让T0的初值为-1000第三句值是简单的赋值

溧水县19563737502: 单片机堆栈溢出有哪些原因 -
离录药用: 单片机堆栈溢出后会根据其位置会对运行产生不同程度的影响,或者进入死循环,或者出现不可预料的结果,如果没有开看门狗的话,复位的可能性较小. 一、如果栈顶设置在低位,比如二FH,预想堆栈空间比如一陆个字节,如果溢出,那么如果四0H开始被用户在使用的话,可能改变用户寄存器的值,这个影响是双方面的,一是改变了用户的运行结果,二是,当堆栈保存的是子程序地址的话,将出现不可预料的结果,执行完后将回不去了. 二、如果栈顶设置在高位,比如陆FH,如果溢出的话,那么后面压入堆栈的值将保存在一个虚拟的空间中,也就是吧0H之后的RAM空间,这个RAM空间是不存在的,因此会造成结果不正确,保存的是地址的话,也会无法回到保存位置

溧水县19563737502: 关于51单片机长时间定时 -
离录药用: 使用T2定时器的16位重载方式,并且使用中断.当T2溢出时发生中断并进入中断程序.在中断程序中使用DPTR作为计数器,因此最大可以延时2的32次方个机器周期(2^32=4294967296)……够用了吧?当使用12MHz的晶振时,可以延时大约4295秒.

溧水县19563737502: 关于单片机定时器溢出值的设定 -
离录药用: 有些定时器是递减计数的,有些单片机的定时器则是递增计数的,还有可以设定计数方式的,51单片机的定时器就是递增的,所以它溢出的时间不是你设定的初值本身代表的机器周期数,而是初值与65536的差值,所以程序中使用了负号来对...

溧水县19563737502: 什么是单片机的溢出 -
离录药用: 说简单点就是内存不足啦,以前的电脑有时会在右下角那里出现什么内存溢出的,也是一样的,都是指内存不足.单片机也是,单片机的内存很小

溧水县19563737502: 单片机的定时器溢出后,程序如何执行? -
离录药用: 在定时器计数的这段时间里,程序是一步一步向下执行. 要执行定时器中断,要在程序开始就打开定时器中断.当产生溢出后,程序会直接跳到中断程序(不用加跳转指令).当中断程序执行完毕后,程序会跳回到执行中断程序前的程序处继续运行. 至于如何打开定时器中断,请参考资料.

溧水县19563737502: 单片机用定时溢出中断如何编程 -
离录药用: 以计时器1中断为例:开通T0中断(ET0=1) 设置T0初值(TH0=0 TL0=0) 开总中断(EA=1) 定时器开始计时(TR0=1) 定时器中断服务程序处理定时器溢出事件.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网