定时中断程序的设计
定时中断的内部结构前面我讲到,希望初学者要认真掌握,在此我们谨简单的列出与定时有关的寄存器,以便大家参考:
寄存器TMOD:
T1 |
T0 |
||||||
GATE |
C/T |
M1 |
M0 |
GATE |
C/T |
M1 |
M0 |
门控位 |
|
方式 |
方式 |
门控位 |
|
方式 |
方式 |
TMOD被分成两部份,T1和T0每部份4位.分别用于控制T1和T0, TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我们暂不管).而TF1(0)我们上节课已提到了,当计数溢出后TF1(0)就由0变为1.原来TF1(0)在这儿!那幺TR0、TR1又是什幺呢?
寄存器TCON:
TF1 |
TR1 |
TF0 |
TR0 |
|
|
|
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
TR0/TR1:为T0/T1的运行控制位,是中断的第二级开关,一级开关是EA;
TF0/TF1:为T0/T1的溢出标识位,在中断查询中用得较多;它由硬件直接清0.
对入定时的4种定式方式,希望大家了解一下即可,要用的时候再查资料也可以.
下面我们有定时器T0模式0设计一个程序,让P1.0端口的LED亮1秒,灭1秒; 执行方法如下:
定时参数T为:1C18H
定时时间 X 晶体频率
T= 8192 -
12
因为模式0只有13位,定时参数为:E018H
我们先让定时器T0定时1毫秒,中断1000次为1秒,此时P1.0端口的LED亮1秒,在中断1000次为1秒,此时P1.0端口的LED灭1秒,周而复始,程序如下: (程序编号为TTT0.ASM)
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TTT00
ORG 0050H
MAIN:
MOV SP,#60H ;指针初始化
MOV TMOD,#00H ;设置定时寄存器
MOV TCON,#00H ;
MOV TL0,#18H ;设置定时参数
MOV TH0,#0E0H ;
MOV 50H,#00H ;清定时中断次数
MOV 51H,#00H ;
SETB TR0 ;开定时中断
SETB ET0 ;容许T0中断
SETB EA ;开中断
LOOP:
AJMP LOOP ;
TTT00:
MOV TL0,#18H ;重设置定时参数
MOV TH0,#0E0H ;
INC 50H ;中断次数加1
MOV A,50H ;
CJNE A,#0FFH,RN00 ;中断255次吗?
MOV 50H,#00H ;是,清0
INC 51H ;
MOV A,51H ;
CJNE A,#04H,RN00 ;中断1000次吗?
MOV 51H,#00H ;是
CPL P1.0 ;P1.0状态取反
RN00:
RETI
END
下面我们通过外部终端来触发T0,P1.0端口的LED灭1秒,周而复始执行,T0定义为模式2计数方式,初始值为:FFH,当T0(P3.4)有负跳变时,计数器溢出,单片机产生中断,此时T1(模式0)产生1毫秒定时,1000次后,P1.0端口状态发生翻转,程序设计如下:
(程序编号为TTT1.ASM)
ONGTOGLLE EQU 60H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TTT00
ORG 001BH
LJMP TTT111
ORG 0050H
MAIN:
MOV SP,#60H ;指针初始化
MOV TMOD,#06H ;设置定时寄存器
MOV TCON,#00H ;
MOV TL0,#0FFH ;设置计数参数
MOV TH0,#0FFH ;
MOV 50H,#00H ;清定时中断次数
MOV 51H,#00H ;
SETB TR0 ;开定时中断
SETB ET0 ;容许T0中断
MOV TL1,#18H ;设置定时参数
MOV TH1,#0E0H ;
MOV ONGTOGLLE,#00H; SETB EA ;开中断
LOOP:
MOV A, ONGTOGLLE
CJNE A,#01H,LOOP ;有中断触发吗?
SETB TR1 ;有,开定时器T1
SETB ET1
LOOP0:
AJMP LOOP0 ;
TTT00:
CLR TR0 ;关计数器T0
MOV ONGTOGLLE,#01H ;设置中断触发标识
RETI
TTT111:
MOV TL1,#18H ;重设置定时参数
MOV TH1,#0E0H ;
INC 50H ;中断次数加1
MOV A,50H ;
CJNE A,#0FFH,RN00 ;中断255次吗?
MOV 50H,#00H ;是,清0
INC 51H ;
MOV A,51H ;
CJNE A,#03H,RN00 ;中断1000次吗?
MOV 51H,#00H ;是
CPL P1.0 ;P1.0状态取反
RN00:
RETI
END
上面的程序中,我们第一次用到了标志位ONGTOGLLE,其实我们在设计上面的程序时,还是将它定义为一个数,原因是便于大家好理解,在许多大项目设计中,设置标志是非常有用的,当某种事情发生时,如果我不急着去处理此事,就设置一个标志,等到该处理此事时,只要判断此标志位即可,在用到标志位时特别要小心,如果此功能完全用完后,一定要将标志位还原,否则,程序再次执行到此处时又会执行一遍,周而复始。
讲了这幺多,那幺中断到底有什幺用呢?
中断的作用主要有: 当主程序在执行时,忽然来了一个外部事件要处理,这个外部事件就是中断,主程序马上停下来(当然要执行完最后一条完整的指令),处理中断事务,比如说:当你和同事在处理一个事情,忽然老板有急事找你,插入几句话,你必须停止下来和老板谈完后,又回到先前的事情中继续去做,这样做,才不会漏掉中间的某些事情,因而中断的作用非常明显,他通常在按键扫描,紧急事务处理中表现非常出色,下面我们用中断查询的方式来做一个低频频率计,大多频率计多是在此基础上开发出来的,只是这些产品在硬件上加了一些复杂的硬件电路和数字处理电路,所用的单片机也不一样,程序设计如下: (此程序用到定时T1中断,后面的程序我们会见到).
VCC
输入信号 P3.2
DISBUF EQU 50H ;50---53H显示缓冲区
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV SP,#60H ;指针初始化
MOV TMOD,#90H ;定时器1设置
MOV TL1,#00H ;定时器初值清0
MOV TH1,#00H ;
NEXT0:
JB P3.2,NEXT0 ;查询信号输入
SETB TR0 ;有信号,开T0中断
NEXT1:
JNB P3.2,NEXT1 ;信号为高电平吗?
NEXT2:
JB P3.2,NEXT2 ;信号为低电平吗?
CLR TR0 ;是,关定时,测试完一个信号周期
MOV A,TL1 ;读低位定时值
MOV R0,# DISBUF ;显示缓冲器送R0
XCHD A,@R0 ;低位定时值送50H
SWAP A ;
INC R0 ;指向下一个显示缓冲区
XCHD A,@R0 ;低位定时值送51H
MOV A,#TH1 ;读搞位定时值
INC R0
XCHD A,@R0 ;低位定时值送52H
SWAP A ;
INC A
XCHD A,@R0 ;低位定时值送53H
NEXT3:
LCALL DISPLAY ;调显示程序
AJMP NEXT3 ;
以上程序只是示范程序,,没有太多的意义,显示器显示的只是信号的16进制周期值,并且只是捕捉到的一次值,如果有兴趣的同学可以进行硬件和软件的改进,在此不再累述。
- 作者:ziqintian | 发布:2013年10月29日
- 分类:IT类别
- 标签:单片机课程设计,定时中断程序,设计
- 转载文章请注明:单片机课程设计之 定时中断程序的设计 | 太极博弈原理官方站|紫欽天|融通百科为我所用|生活全智慧|生活智慧之书
文章是怎么写出来的?
好吧,我承认我想多了
大师受教了,缘来如此。。。
...也许网络安全产业以后会是
此法确实可靠吗?
hello!,I like y
I was suggested
Thanks , I've j