首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

定时与中断实验

定时与中断实验

一 计数器实验一 程序如下
ORG 0000H ; AJMP START ; ORG 0030H ;
START:MOV SP,#5FH ;
MOV
TMOD,#40H
;定时/计数器 1 作计数用
T0 不用全置
0

SETB
TR1
;启动 T1 开始运行



LOOP:MOV A,TL0 ; MOV P1,A ; AJMP LOOP ; END
运行这个程序 看到了什么 随着 LED 的闪烁 实验板上的 8 个 LED 也在不断地变化 注意观
察 是不是按二进制 00000000 00000001 00000010 00000011 这样的顺序在变呢 对了 这 就是 TL0 中的数据 不过这个实验还看不出什么名堂 接着做第二个实验
二 计数器实验二 程序如下
ORG 0000H ; AJMP START ; ORG 001BH ;
AJMP TIMER1 ;定时器 1 的中断处理
ORG 0030H ; START:MOV SP,#5FH ;
MOV TMOD,#40H ;定时/计数器 1 作计数用 工作方式 1 T0 不用置 0
MOV
TH1,#0FFH
;


MOV
TL1,#0FAH
;预置值
每计到 6 个脉冲即为一个事件

SETB
EA
;


SETB
ET1
;开总中断和定时器 1 中断允许


SETB
TR1
;启动定时/计数器 1 开始运行


AJMP
$
;





TIMER1USH ACC ;
78


----------------

PUSH PSW ;
CPL P1.0 ;计数值到 即取反 P1.0
MOV
TH1,#0FFH
;

MOV
TL1,#0FAH
;重置计数初值


POP PSW ;
POP ACC ; RETI ; END
这段程序完成的工作其实很简单 就是每 6 个计数脉冲到来后取反一次 P1.0 因此实验的结果应
当是 15 脚接的 LED 亮 灭 6 次 则 P1.0 口所接的 LED 就亮或灭一次 这就是我们对输入脉冲的计
数 也就是每 6 个计数产生一次中断 这段程序中有一个符号以前没见过 需要给大家解释一下 AJMP
$$ 我们称为标识符 它的作用是指这条指令的开始处 在这里 其实就是循环执行 AJMP $这条 指令 执行这么多次干什么 实际上它是在等待中断的产生
这两个实验需要附件 如果您觉得做起来不大方便 没关系 我们接着来做第三个实验 采用两 个定时/计数器合用 一个作为定时器用 一个作为计数器用 来实现 P1.1 的延时 这可以直接在我们 的实验板上完成
三 两个定时/计数器合用的延时实验
采用两个定时/计数器 其中 T0 作为定时器用 工作方式为方式 1 T1 作为计数器用 计数次数
为 1000 次 T0 溢出时 产生一个间隔为 60mS 的方波也就是让 LED3 各亮灭 60mS然后把 P1.2
的输出作为 T1 的计数脉冲 T1 计数溢出时满 1000 次取反一次 P1.1 产生一个周期为 2 秒的方波
即 LED2 每 2 秒闪烁一次
程序如下
ORG 0000H ; AJMP MAIN ;
ORG 000BH ;定时器 T0 的中断入口
AJMP T_0 ;转 T0 中断服务程序 ORG 001BH ;定时器 T1 的中断入口 AJMP T_1 ;转 T1 中断服务程序 ORG 0030H ;
MAIN:MOV TMOD,#51H ;T1 为计数器方式 1 T0 为定时器方式 1
MOV
TH0,#15H
;设置 T0 初值

MOV
TL0,#0A0H
;


MOV TH1,#0FCH ;设置 T1 初值
MOV
TL1,#18H
;



MOV
IE,#8AH
;允许
T0
T1 中断

SETB
TR0
;启动定时器 T0


SETB
TR1
;启动定时器 T1




LL:SJMP LL ;循环
T_0:MOV TH0,#15H ;给 T0 重新赋值
MOV TL0,#0A0H ;





T_1:MOV TH1,#0FCH ;给 T1 重新赋值
MOV TL1,#18H ;
CPL P1.1 ;计数到 取反 P1.1

79

----------------

RETI ; END
把程序下载到单片机 看到什么 LED3 在不断的闪烁 这就是 T0 的作用 闪烁的周期是多少
请大家计算一下 接下来 把 P1.2也就是 3 脚和 P3.5也就是 T1的输入端相连接 是不是接在
P1.1 上的 LED2 每 2 秒闪烁一次 对了 这就是 T1 作计数器的结果
在这段程序里 有一点请大家注意 第四条—AJMP T_0,为什么要在 T 和 0 之间加上一条横线
而不直接用 T0 呢 原来在 MCS—51 系列单片机中 是不能用 T0 T1 INT RET IP PSW 等等内 部名称作为标号的 如果这样做的话 编译软件会出错 这点我们好象很早以前曾经提到过 接下来我 们再来做一个外部中断的实验
四 外部中断实验 程序如下
ORG 0000H ; AJMP START ;
ORG 0003H ;外部中断 0 地址入口
AJMP INTO ; ORG 30H ;
START: MOV SP,#5FH ;
MOV
P1,#0FFH
;灯全灭

MOV
P3,#0FFH
3 口置高电平

SETB
EA
;

SETB
EX0
;


AJMP $ ;
INTOUSH ACC ; PUSH PSW ; CPL P1.0 ;
POP
PSW
;

POP
ACC
;


RETI ;
END
本程序的功能就是按一次按键 S1接在 P3.2 引脚上的就引发一次外部中断INT0=0取反 一次 P1.0 因此理论上按一下灯亮 再按一下灯灭 有点象我们工程应用中的自锁开关 不过这段程
序在实际的实验中 可能会发觉有时不很 灵按了它没反应 但在大部份时候还是对的 这是怎么 回事呢 其实这是因为按键没有作 去抖动 处理 也就是说 理论上我们是按了一次键 但由于计算(本文转自:IC交易网
机的处理速度很快 计算机实际上却认为已经按了好多次了 如何来解决这个问题呢 这就需要我们对 按键作去抖动处理 什么是按键的去抖动处理 我们下一课讨论键盘接口时再作详细解释
好帖必回,顶一下
返回列表