定时器试验

1.设计目的
(1)熟练运用汇编语言编程,并且掌握键盘查表来运行相应的功能
〔2〕熟悉启东硬件仿真系统,熟练应用该系统调试软件
〔3〕熟悉单片机应用系统的组成,并能运用程序控制外部流水灯
2.设计任务的内容和要求
〔1〕初始化定时器,使之采用定时器0,方式2,定时100us时间
〔2〕通过设置中断,产生总时间为1秒
〔3〕1秒时间到,控制发光二极管点亮
3.设计原理
在实际的控制系统中常要求有外部实时时钟,以实现定时或延时控制;还要求有外部计
数器,以实现对外界事件进展计数。
MCS-51单片机由两个可编程定时/计数器(以下简称T/C)。T0,T1
T/C的核心是1个加1计数器,它的输入脉冲有两个来源:一个是外部脉冲源,另一个是系
统机器周期(时钟振荡器经12分频以后的脉冲信号)。T0,T1是2 个16位存放器。加1到满溢
出产生中断
T0〔TH0,TL0〕;8CH,8AH地址不连续
T1〔TH1,TL1〕;8DH,8BH
都具有定时或者计数功能。
图一
图一 有2个模拟的位开关,前者决定了T/C的工作状态:当开关处于上方时为定时状态,处于
下方时为计数状态。工作状态的选择由特殊功能存放器TMOD的C/T位来决定。 C/T=0表
示定时, C/T=1表示计数。
当T/C处于定时方式时,加1计数器在每个机器周期加1,因此,也可以把它看作在累计机器周
期。由于一个机器周期包含12个振荡周期,所以它的计数速率是振荡频率的1/12。
如果主频12M,机器周期为1us,每1us定时存放器完成1次加1操作。一旦振荡周期确定,机器
周期亦确定。
MCS-51单片机有2个特殊功能存放器TMOD和TCON:TMOD用于设置T/C的工作方
式;TCON用于控制定时器T0、T1的启动与停顿,并包含了定时器的状态。定时/计数器工作
方式 如下表所示
. z.
-
定时器/计数器由四种工作方式,所用的计数位数不同,因此,定时计数常数也就不同。
在编写中断效劳程序时,应该清楚中断响应过程:CPU 执行中断效劳程序之前,自动
将程序计数器 PC 内容〔即断点地址〕压入堆栈保护〔但不保护状态存放器 PSW,更不保
护 累加器 A 和其它存放器内容〕 然后将对应的中断矢量装入程序计数器 PC 使程序转
向该中断 , 矢量地址单元中以执行中断效劳程序。定时器 T0 和 T1 对应的中断矢量地
址分别为 000BH 和 001BH。 中断效劳程序从矢量地址开场执行,一直到返回指令
"RETI〞为止。 "RETI〞指令的操作一方面告诉中断系统该中断效劳程序已经执行完毕,
另一方面把原来压入堆栈保护的断点地址从栈顶弹出,装入到程序计数器 PC,使程序返
回到被到中断的程序断点处,以便继续执行。
本设计采用工作模式2
当T0M〔T1M〕=10时定时器设定为工作模式2,此时定时器0〔定时器1〕被设置为可
自动重载的8 位定时器。
TL0为8位加法计数器,
TH0为存放该8位加法计数器初值的存放器。
TH0、TL0的初值都由程序预置。
在工作模式2中,定时器的定时时间由下式确定
图二 方式 2 构造图
4.程序说明
此程序大体分为 3 局部
第一局部:开场局部
这一局部主要是指定了程序的起始地址,中断地址等初始化操作。
ORG 0000H
AJMP START
ORG 000BH ;定时器 0 的中断向量地址
AJMP TIME0 ;跳转到真正的定时器程序处
ORG 30H
这一局部主要是指定了程序的起始地址,中断地址等初始化操作。
第二局部:主程序
主程序是程序的主体。在本例中,主程序主要为定时计数器T0 实现了初始化以及中断
的开启。P1.1 为测试是否进入主程序的测试灯,实际运行时只会被点亮一次而不会再有动
作。P1.2 是进入中断程序前的指示灯,和P1.1 一样,只会被点亮一次而不会再有动作。
. z.
-
START: MOV P1,*0FFH ;关灯
CPL P1.1;测试 1
MOV 30H,*00H ;软件计数器预清 0
MOV TMOD,*0000010B ;定时/计数器 0 工作于方式 2
MOV TH0,*00H
MOV TL0,*09cH ;156
SETB EA ;开总中断允许
SETB ET0 ;开定时 0 允许
SETB TR0 ;定时 0 开场运行
CPL P1.2 ;测试 2
SJMP $
第三局部:中断子程序
该中断效劳子程序是程序的核心。由于本次试验的单片机周期为1 微秒,定时计数器
的周期为 100 微秒,故要想在 1 秒之后点亮 P1.0,则需要进入 10000 次中断子程序之后点
反转一次 P1.0 口。
为此,我设计了一个软件计数器。此计数器分为 2 局部。每一局部都可以计数到 100.当第
一个子计数器计数到 100 之后,就会转向第二个子计数器,使其加一。于是,两个计数器
的计数和为 100*100=10000,最终就是1 秒。在每一次计数完毕后,计数器清零,同时反转
P1.1.
TIME0: ;定时器 0 中断程序
INC 30H
MOV A,30H
CJNE A,*64h,T3 ;30H单元中的值到了 100 了吗"
以上局部是计数器的第一局部,由于存放器空间限制,单个存放器不能够计数到10000,
故使用 2 个 100 的计数器。CJNE A,*64h,T3 表示当值不相等时跳转,跳出中断。否则执行
计数器 2 。
. z.
-
MOV 30H,*0 ;清 0 软件计数器 1
inc 31H
MOV A,31H
CJNE A,*64h,T3
以上局部是计数器的第二局部,与计数器1 一样,是 100 的计数器。值得注意的是,
在计数器 1 计满之后,要将其清零。在计数器2 计满之后,顺序执行,点亮P1.0,并自身
清零。
CPL P1.0 ;到了,取反 P10
MOV 30H,*0 ;清 0 软件计数器 1
MOV 31H,*0 ;清 0 软件计数器 2
T3: MOV TH0,*00H
MOV TL0,*9cH ;重置定时常数
在每次中断之后,要重置定时器初值,让其在下一个100 微秒后进入中断。
RETI
END

你可能感兴趣的:(单片机,嵌入式硬件)