单片机学习(四) 定时/计数器

51单片机有2个独立的定时/计数器T0、T1,52有3个(T2),它们都有定时或计数的功能,可以用于定时控制、延时、对外部事件计数和检测等场合。

一.定时/计数器相关寄存器

以51为例:

TCON

D7D6D5D4D3D2D1D0
TF1TR1TF0TR0IE1IT1IE0IT0

 

前文介绍过外部中断0、1的启动,TR1、(TR0)则是定时器T1、(T0)的启动(运行控制位),TF1、(TF0)则是定时器T1、(T0)的溢出标志位,当用作查询时,要用软件清0,中断则不用。

TMOD

D7D6D5D4D3D2D1D0
GATEC/gif.latex?%5Coverline%7BT%7DM1M0GATEC/gif.latex?%5Coverline%7BT%7DM1M0

 GATE:当GATE=1时,只有在gif.latex?%5Coverline%7BINT0%7Dgif.latex?%5Coverline%7BINT1%7D引脚位高电平时,且由软件使TR0或TR1置1,才能启动定时器T0或T1,可以实现对脉宽的测量

当GATE=0时,只需使用软件将TR0或TR1置1,就能启动定时器T0或T1,所以一般GATE取为0

C/gif.latex?%5Coverline%7BT%7D:为1时,C有效,作为计数器,为0时,gif.latex?%5Coverline%7BT%7D有效,作为定时器

M1M0:定时/计数器的工作方式

M1M0工作方式说明
00方式013位计数器
01方式116位计数器
10方式28位自动重装计数器(初值自动装入,不要重新赋初值)
11方式3

定时器0:2个独立8位计数器

定时器1:对外停止计数

 

二.汇编例子

定时器初值计算:

例如:10ms的方波(晶振位6MHz)

高低电平则各位5ms,1个脉冲周期位2us,则低电平需要2500个脉冲周期,利用预定值的负数表示,则为-2500,再利用伪指令HIGH提取-2500(0xF6H)的高八位,LOW提取-2500的低八位

 

 用T1方式1定时,要求在P1.0引脚上输出周期位10ms的方波,单片机晶振位6MHz

查询方式:

		ORG 0000H
		AJMP MAIN
MAIN:	LCALL CSH			//初始化设置定时器初值、TMOD、启动定时器
		LCALL LOOP
CSH:	SETB P1.0			
		MOV TMOD,#10H		//定时器T1工作在方式1定时
		MOV TH1,#HIGH(-2500)
		MOV TL1,#LOW(-2500)
		SETB TR1
		RET
LOOP:	JNB TF1,$			//等待T1溢出
		CLR TR1				//关闭定时器1
		CLR TF1				//由于是查询方式,TF1软件清0
		CPL P1.0			//开始方波的低电平
		MOV TH1,#HIGH(-2500)
		MOV TL1,#LOW(-2500)
		SETB TR1			//启动定时器1
		JMP LOOP		
		END

 中断方式:

		ORG 0000H
		AJMP MAIN
		ORG 001BH			//定时器T1的中断入口地址
		AJMP CL
MAIN:	LCALL CSH			//初始化设置定时器初值、TMOD、启动定时器
		JMP $
CSH:	SETB P1.0			
		MOV TMOD,#10H		//定时器T1工作在方式1定时
		MOV TH1,#HIGH(-2500)
		MOV TL1,#LOW(-2500)
		SETB TR1			//打开定时器T1
		SETB ET1			//打开定时器T1的中断允许
		SETB EA				//中断总允许
		RET
CL:		CLR TR1				//关闭定时器1		
		CPL P1.0			//开始方波的低电平
		MOV TH1,#HIGH(-2500)
		MOV TL1,#LOW(-2500)
		SETB TR1			//启动定时器1
		RETI		
		END

从P1.0引脚输出一个脉冲波形,高电平持续时间5ms,低电平持续时间12ms,晶振12MHz,用工作方式1编程

查询方法:

		ORG 0000H
		AJMP MAIN
MAIN:	LCALL CSH			//初始化设置定时器初值、TMOD、启动定时器
		LCALL LOOP
CSH:	SETB P1.0			
		MOV TMOD,#01H		//定时器T0工作在方式1定时
		MOV TH0,#HIGH(-5000)
		MOV TL0,#LOW(-5000)
		SETB TR0
		RET
LOOP:	JNB TF0,$			//等待T0溢出
		CLR TR0				//关闭定时器0
		CLR TF0				//由于是查询方式,TF0软件清0
		CPL P1.0			//开始方波的低电平
		MOV TH0,#HIGH(-12000)
		MOV TL0,#LOW(-12000)
		SETB TR0			//启动定时器0
		JNB TF0,$			
		CLR TR0				
		CLR TF0				
		CPL P1.0			
		MOV TH0,#HIGH(-5000)
		MOV TL0,#LOW(-5000)
		SETB TR0			//启动定时器0
		JMP LOOP		
		END

中断方法:

		ORG 0000H
		AJMP MAIN
		ORG 001BH			
		AJMP CL
MAIN:	LCALL CSH			
		JMP $
CSH:	MOV R0, #1
		SETB P1.0			
		MOV TMOD,#10H		
		MOV TH1,#HIGH(-5000)
		MOV TL1,#LOW(-5000)
		SETB TR1			
		SETB ET1			
		SETB EA				
		RET
CL:		CJNE R0,#0,CL1
		CLR TR1					
		SETB P1.0			
		MOV TH1,#HIGH(-5000)
		MOV TL1,#LOW(-5000)
		SETB TR1			
		MOV R0,#1
		RETI
CL1:	CLR TR1
		CLR P1.0 
		MOV TH1,#HIGH(-12000)
		MOV TL1,#LOW(-12000)
		SETB TR1
		MOV R0,#0
		RETI
		END

 

 

 

 

 

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

️梅花十三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值