内容正文:
电路门控位GATE的应用
电路门控位GATE的应用
GATE
C/T
M1
M0
控制T1
控制T0
TMOD
选方式1
选定时器方式
INT0为高时,T1开始计数
1 0 0 1
上页
下页
回目录
例5-5 用GATE 控制位,测量INT1(P3.3)引脚上
正脉冲的宽度(晶振为12MHz,正脉冲宽度小于65ms)
程序:
MOV TMOD,#6
MAIN: MOV P1.0,#0
MOV R5,#0
MOV R4,#0
MOV TH0,#9CH
MOV TL0,#9CH
SETB EA
SETB ET0
SETB TR0
SJMP $
ORG 000BH
LJMP COUNT
下页
;P1.0为低
;箱数计数器清“0”
;置T0工作方式
;计数初值送计数器
;
;T0开中断
;CPU开中断
;启动T0
;
;主程序
;T0中断入口
;转向中断服务
上页
回目录
ORG 0000H
LJMP MAIN
ORG 0030H
COUNT: MOV A,R4
ADD A,#1
MOV R4,A
MOV A,R5
ADDC A,#0
MOV R5,A
SETB P1.0
MOV R3,#100
DLY: NOP
DJNZ R3,DLY
CLR P1.0
RETI
中断服务:
;
;
;
;箱计数器加“1”
;
;
;启动外设包装
;给外设足够时间
;
;延时
;停止包装
;中断返回
上页
下页
回目录
END
没有保护现场
T1(P3.5)
GATE
TR1
INT1
震荡器
÷12
TL1
8位
TH1
8位
TF1
中断
K
C/T=0
C/T=1
控制
16位计数器
“+1”
1
INT1
INT1
为高时T1
开始计数
INT1
为低时T1停止计数
0
0
1
1
1
宽度≤65ms
计数值
即µs数
1
上页
下页
回目录
“+1”
“+1”
INT1
INT1
为高时T1
开始计数
INT1
为低时T1停止计数
上页
下页
回目录
MOV TMOD, #90H
MOV TL1, #0
MOV TH1, #0
JB P3.3, $
SETB TR1
JNB P3.3, $
JB P3.3, $
CLR TR1
:
.
编程:
;置T1方式控制字
;
;T1从0开始计数
;等INT1低电平
;T1允许计数
;等INT1高电平上升沿到来
;等INT1低电平到来
;停止计数
“与”
CLR TR1
定时器/计数器使用中应注意的问题:
1、不易实现长时间高精度定时;
2、长定时问题??
3、运行中读定时器值
有时需要在定时器运行中读出计数器的值
因为定时器不断运行,不可能在同一时刻读取THX和TLX值,如不注意便可能读错。
如先读(TLX),然后读(THX),由于定时器不断运行,读(THX)前,若恰好产生TLX溢出向THX进位情况,则读得的(TLX)值就完全不对了。
一种可能解决错读问题的方法是:
先读(THX),后读(TLX),再读(THX),若两次读得的(THX)没有发生变化,则可确定读出的内容是正确的。
RDTIMER: MOV A,TH0
MOV R0,TL0
CJNE A,TH0,RDTIMER
MOV R1,A
RET
比较两次读的(TH0)不等重复再读
;读(TH0)
;读(TL0)
4、定时器溢出同步问题
定时器溢出时,自动产生中断请求。但中断是否得到响应,取决于其它中断服务程序是否在运行,或取决于正在执行的是什么样的指令。所以定时中断请求得到响应的时间是不固定的。在一些对定时精度要求十分苛刻的场所对此误差进行补偿。
补偿方法:在定时中断请求得到响应的时候,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据该值,计算出到下一次中断时需要的时间,据此来重装载计数器初值和启动定时器。
例:定时周期为1MS的补偿程序。
CLR EA
CLR TR1
MOV A,#LOW(-1000+7)
ADD A,TL1
MOV TL1,A
MOV A,#HIGH(-1000+7)
ADDC A,TH1
MOV TH1,A
SETB TR1
;禁止所有中断