定时计时器
本文由cookey燕贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
定时/计时器 实验五 定时 计时器
一、 实验目的
1、 学习 8051 内部定时/计数器的工作原理及编程方法; 2、 掌握定时/计数器外扩中
断的方法。
二、 实验内容 1、 将定时器 T0 设置为定时方式,由 P1.0 输出高低电平之比为 1:1 的
500HZ 方波。
PROTEUS 原理图截图:
程序流程图 : 开始 允许定时中断 定时中断赋初值 启动中断 A 0 P1 A 中断入口 恢
复中断初值 A 取反 中断返回
汇编源程序: ORG 0000H AJMP START ORG 000BH AJMP T0INT ORG 0030H ;每次定时 1ms ;
每启动中断一次,电平就改变 START: MOV SP,#60H MOV TMOD,#01H MOV TL0,#18H MOV TH0,#0FCH ;1ms SETB ET0 SETB EA SETB TR0 ;T0 自启动 MOV A,#0H MOV P1,A LOOP: MOV P1,A AJMP LOOP T0INT: MOV TH0,#0FCH ;定时器重新赋值 MOV TL0,#18H CPL A ;取反改电平 RETI
END
C 语言源程序: #include #define TIMEINT 0x01 #define TIMEH 0xfc #define
TIMEL 0x18 extern unsigned char t_count; void timer0(void) interrupt 1 using 1
{ TH0=TIMEH; TL0=TIMEL; t_count++; //次数加 1
} main() { t_count=0; TMOD=TIMEINT; //开启中断 TH0=TIMEH; TL0=TIMEL; ET0=1; EA=1; TR0=1; //自启动 while(1) { if(t_count%2==0) //利用定时次数改变 P1 的值 P1=0; //
奇数低电平 else P1=1; //偶数高电平 } }
心得及调试结果: 1) 若示波器无象,旋转水平、垂直旋钮,调辉度、聚焦 2) 观察
高低电平是否 1:1,周期是否为 2ms.频率的计算要看选择的 TOMS 模式【详见附录】
2、 将定时器 T0 设置成对外脉冲计数方式,T0 引脚每来一次外部脉冲,计数加 1,计
数的结果以二进制格式显示在 8 个发光二极管上。 PROTEUS 原理图截图:
程序流程图 : 开始 中断入口 允许计数中断 设置中断初值 0 启动中断 A FFH P1 A A TL0 A 取反 P1 A
中断返回
汇编源程序: ORG 0000H AJMP START ORG 000BH AJMP T0INT ORG 0030H ;来一次脉冲
计数一次 START: MOV SP,#60H MOV TMOD,#05H MOV TL0,#0H MOV TH0,#0H
;改方式
SETB TR0 MOV A,#0FFH MOV P1,A LOOP: MOV A,TL0 CPL A MOV P1,A AJMP LOOP T0INT:
RETI END
;赋初值,灯全灭
;取反,显示计数值
C 语言源程序: #include #define TIMEINT 0x05 //选择计数器 #define
TIMEH 0x00 #define TIMEL 0x01 //有个问题,汇编时 TL0 赋值 0 就可以,C 语言中 TL0 要
赋值 01 出来效果才跟 汇编一致 //0 无原反补码,-1 为 FF extern unsigned char t_count; void timer0(void) interrupt 1 using 1 { //只要有脉冲就自动计数 } main()
{ TMOD=TIMEINT; TH0=TIMEH; TL0=TIMEL; ET0=1; EA=1; TR0=1; P1=0xff; //赋初值,灯全
灭 while(1) { P1=-TL0; //TL0 赋给 P1,并把 P1 取反 } }
心得及调试结果: 1) 检查脉冲有无输出(用拨动脉冲) 2) 3) 看发光二极管显示
是否与脉冲数同步 出错要检查 TMOD 以及中断相关值,再检查逻辑
4) 发光二极管显示脉冲数
3、 使用 T0、T1 两个定时器分别控制从 P1.0 输出波形的高、低电平的宽度。
PROTEUS 原理图截图:
程序流程图 : 开始 设置定时中断 0、1 中断 0、1 赋不同初值 启动定时中断 0 A 0 P1 A P1 A 中断返回 中断返回 中断 0 入口 关闭中断 0 恢复中断 0 初值 A 1 启动中断 1 中断 1 入口 关闭中断 1 恢复中断 1 初值 A 0 启动中断 0
汇编源程序: ORG 0000H AJMP START ORG 000BH ;中断入口地址 AJMP T0INT ORG 001BH AJMP T1INT ORG 0030H ;定时器 T0 开时,定时器 T1 要关掉,两者之间只能开一个 ;两者的定时状况都在方式 1 START: MOV SP,#60H MOV TMOD,#11H ;开定时器 T0、T1 MOV TL0,#30H MOV TH0,#0F8H ;T0 ,2ms SETB ET0 SETB EA SETB TR0 ;T0 自启动 MOV TL1,#18H MOV TH1,#0FCH SETB ET1 SETB EA MOV A,#0H MOV P1,A LOOP: MOV P1,A AJMP LOOP T0INT: CLR TR0 MOV
TH0,#0F8H MOV TL0,#30H MOV A,#01H SETB TR1 RETI T1INT: CLR TR1
;T1 ,1ms
;赋初值
;关自身中断 T0
;P1 赋值改变电平 ;开中断 T1
;关自中断
MOV TH1,#0FCH MOV TL1,#18H MOV A,#0H SETB TR0 RETI END
;改电平 ;开另一个中断
C 语言源程序: #include #define TIMEINT 0x11
//选择 T0、T1 定时器
void timer0(void) interrupt 1 using 1 { TR0=0; //关中断 T0 P1=0; //低电平 TH0=0xfc; TL0=0x18; //时间 1ms TR1=1; //开中断 T1 } void timer1(void) interrupt 3 using 1 { TR1=0; //关自身中断 P1=1; //高电平 TH1=0xf8; TL1=0x30; //时间 2ms TR0=1; //开另一个中断 } main() { TMOD=TIMEINT; //开启中断 TH0=0xfc; TL0=0x18; TH1=0xf8; TL1=0x30; ET0=1; ET1=1; EA=1; TR0=1; //T0 自启动
while(1) { ; } }
心得及调试结果: 1) 要点 TMOD 要开对 、2)两个中断不能同时开,一个开另一个要闭 2) 高低电平宽度之比为 2:1
附录:
一、定时/计数器的结构 定时 计数器的结构 定时/计数器的实质是加 计数器( ,由高 位两个寄存器组成。 定时 计数器的实质是加 1 计数器(16 位) 由高 8 位和低 8 位两个寄存器组成。TMOD 是 , 定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制 T0、T1 定时 计数器的工作方式寄存器,确定工作方式和功能; 是控制寄存器, 、 计数器的工作方式寄存器 的启动和停止及设置溢出标志。 的启动和停止及设置溢出标志 TMOD 用于设置其工作方式;TCON 用于控制其启动和中断申请。 用于设置其工作方式; 用于控制其启动和中断申请。 一、工作方式寄存器
TMOD
用于设置定时/计数器的工作方式 计数器的工作方式, 工作方式寄存器 TMOD 用于设置定时 计数器的工作方式,低四位用于 T0,高四位 , 用于 T1。其格式如下: 。其格式如下:
GATE:门控位。GATE,0 时,只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时 :门控位。 , ,就可以启动定时/ 计数器工作; GATA,1 时, 同时外部中断引脚或也为高电平时, 计数器工作; , 要用软件使 TR0 或 TR1 为 1, , 同时外部中断引脚或
也为高电平时, 才能启动定时/计数器工作 即此时定时器的启动多了一条件。 计数器工作。 才能启动定时 计数器工作。即此时定时器的启动多了一条件。 C/T:定时 计数模式选择位。 定时/计数模式选择位 为定时模式; =1 为计数模式。 计数模式。 定时 计数模式选择位。 ,0 为定时模式; M1M0:工作方式设置位。定时 计数器有四种工作方式,由 M1M0 进行设置。 计数器有四种工作方式, 进行设置。 :工作方式设置位。定时/计数器有四种工作方式
TCON 的低 4 位用于控制外部中断 已在前面介绍。 位用于控制外部中断,已在前面介绍 TCON 的高 4 位用于控制定时 计数器的启 已在前面介绍。 位用于控制定时/计数器的启 动和中断申请。其格式如下: 动和中断申请。其格式如下:
TF1 TCON.7) T1 溢出中断请求标志位。 计数溢出时由硬件自动置 TF1 为 1。 ( T1 CPU ) : 溢出中断请求标志位。 。 的状态。所以, 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的状态。所以, 。 工作时, TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬件置 1 或清 0 的效 可用作查询测试的标志 标志。 , 果一样。 果一样。 TR1(TCON.6) :T1 运行控制位。 开始工作; ( ) : 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时,T1 停止 工作。 计数器的启动与停止。 工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时 计数器的启动与停止。 。所以,用软件可控制定时/计数器的启动与停止 TF0(TCON.5) :T0 溢出中断请求标志位, 类同。 ( ) : 溢出中断请求标志位,其功能与 TF1 类同。 TR0(TCON.4) :T0 运行控制位, 类同。 ( ) : 运行控制位,其功能与 TR1 类同。
定时/计数器应用举例 定时 计数器应用举例
初始化程序应完成如下工作: 初始化程序应完成如下工作:
赋值, 的工作方式。 对 TMOD 赋值,以确定 T0 和 T1 的工作方式。 计算初值,并将其写入 计算初值 并将其写入 TH0、TL0 或 TH1、TL1。 、 、 。 中断方式时, 赋值,开放中断。 中断方式时,则对 IE 赋值,开放中断。 置位,启动定时/计数器定时或计数 计数器定时或计数。 使 TR0 或 TR1 置位,启动定时 计数器定时或计数。
二、中断请求标志
1、TCON 的中断标志 、
IT0(TCON.0) 外部中断 0 触发方式控制位。 ( ,外部中断 触发方式控制位。 ) , 为电平触发方式。 当 IT0=0 时,为电平触发方式。 为边沿触发方式(下降沿有效) 当 IT0=1 时,为边沿触发方式(下降沿有效) 。 IE0(TCON.1) 外部中断 0 中断请求标志位。 ,外部中断 中断请求标志位。 ( ) ,
IT1(TCON.2) 外部中断 1 触发方式控制位。 ( ,外部中断 触发方式控制位。 ) , IE1(TCON.3) 外部中断 1 中断请求标志位。 ,外部中断 中断请求标志位。 ( ) , TF0(TCON.5) 定时 计数器 T0 溢出中断请求标志位。 ,定时 ( ) 定时/计数器 溢出中断请求标志位。 , TF1(TCON.7) 定时 计数器 T1 溢出中断请求标志位。 ,定时 ( ) 定时/计数器 溢出中断请求标志位。 , 一、中断允许控制 CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE 控 制的。 制的。
EX0(IE.0),外部中断 0 允许位; , 允许位; ET0(IE.1),定时 计数器 T0 中断允许位; ,定时/计数器 中断允许位; EX1(IE.2),外部中断 0 允许位; 允许位; , ET1(IE.3),定时 计数器 T1 中断允许位; ,定时/计数器 中断允许位; ES(IE.4),串行口中断允许位; ( ,串行口中断允许位; EA (IE.7), CPU 中断允许(总允许)位。 中断允许(总允许) ,
中断响应条件和时间
中断响应条件 中断源有中断请求; 中断源有中断请求; 此中断源的中断允许位为 1; ;
CPU 开中断(即 EA=1) 开中断( ) 。 以上三条同时满足时, 才有可能响应中断。 以上
三条同时满足时,CPU 才有可能响应中断。
本TXT由“文库宝”下载: