定时器Tl中断服务程序清单如下:
- INT1:CLR TR1 ;关计数器1
- PUSH ACC;ACC入栈
- PUSH 00H;R0入栈
- CLR C ;清零进位标志
- MOV A,TL1 ;计数值低8位→累加器
- ADD A,#23H ;计数器值+中断执行时间32us(12MHz晶振)+
- ;最小中断响应时间3-脉冲周期
- MOV R0,A ;低8位暂存R0
- MOV A,TH1
- ADDC A,#00H
- MOVX @DPTR,A ;脉冲周期高8位→@DPTR指向的RAM单元
- INC DPTR ;指向下一RAM单元
- MOV A,R0
- MOVX @DPTR,A ;脉冲周期低8位→DPTR指向的RAM单元
- INC DPTR
- INC R1 ;脉冲周期个数加一
- MOV TH1,#00H ;清零计数器1
- MOV TL1,#00H
- POP 00H
- POP ACC
- SETB TR1 ;重新启动计数
- RETI ;中断返回
该中断服务程序能采样的最小脉冲周期为32us,若去掉该程序中的现场保护和将计数值变为脉冲周期放在采样后进行,则可进一步减小能采样的脉冲周期。能采样的最大脉冲周期为65535us(12MHz晶振时),若大于该值,则用户对程序稍加修改即可,因此,实际上对最大周期可不加限制。设对脉冲信号采样100个周期,采样值存于50H开始的外部RAM中,则主程序如下:
- MAIN:
- PUSH TMOD ;专用寄存器TMOD TCON IE入栈
- PUSH TCON
- PUSH IE
- MOV THI,#00H ;清零计数器
- MOV TL1,#00H
- MOV TMOD.10H;计数器1工作方式1
- SETB EA ;允许中断
- SETB EX1 ;外部中断1
- SETB IT1 ;INT1负跳变触发中断
- MOV DPTR,#50H;存脉冲周期的RAM首地址
- MOV R1,#00H ;R1一控制采样周期个散
- SETB TR1 ;计数器1开始计时
- CJNE R1,#64H,$;等待100个周期采样结束
- CLR TR1 ;关计数器
- POP IE
- POP TCON
- POP TMOD
以上采样的第一脉冲周期不准,应在数据处理时丢掉,也可在中断服务程序中加判断语句自动丢掉。由以上可以看出,该方法无额外硬件,软件简明,能测量的脉冲周期范围大,但不能测得脉冲信号的第一个周期。