找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7217|回复: 1
打印 上一主题 下一主题
收起左侧

求中断定时器源程序

[复制链接]
跳转到指定楼层
楼主
ID:8765 发表于 2009-3-26 23:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

请教各位大侠,定时器基时0.1S在中断内实现,主程序中需要用到0~99秒可调的时间,主程序发出请求后定时器开始工作,我现在在做一个实验
主程序中的按键去抖动,显示部分动态扫描的间隔还有其它地方要用到定时器,试过几种方法效果都不太理想,各位帮帮忙给上传个汇编源程序,先谢谢了.

 

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:6481 发表于 2009-4-1 00:01 | 只看该作者

12M晶震
0.1s =100ms =100000US
因为51单片机T0 T1作为16位定时器最大65535
那么
我们用一个16位的T0或者T1 定时50000US 既是50ms
65535-50000=13335
换成16进制3CAF
那么定时器的高字节和低字节位
TH0=3CH
TL0=0AFH
这样T0的溢出时间就是50MS
那么在程序中 我们要用到1S的时间怎么办呢?
我们定义一个延时中间变量 MS
在T0中段程序中
检测MS的值
比如 我们要延时1S 那么
1S/50MS=20
则在主程序中定义 MS值为20

在T0的中断程序中

DJNZ MS exit
检测 MS是否运行了20次 也就是是否延时了1S
没有到1S 就退出
到了1S 了 就干其他事情
 以此类推 要延时 1-99S比如 20S
那么 MS 的值为 400
即400X50MS=20000MS=20S
下面是 示例代码 

;----------------------------------------------
;名称:用定时计器T0实现任意秒数延时程序
;主频 12M晶震  51系列单片机
;入口参数 MS T0溢出中断定义为 50MS  程序中要用到延时时 开T0中断 并且给MS
;附值 MS=20 时 为1S  以此类推  延时完成后 关T0中断
;编译环境:keil c51编译通过
;WWW.51HEI.COM 原创 可以任意修改和作为学习测试用途
;备注 :在T0的中断程序中 指令的执行也占用了时间 因此 此程序的定时 并不精确
;2009-3-31
;---------------------------------------------

;内存分配定义
T0CZG   EQU     3CH     ;定时器0初值高字节
T0CZD   EQU     0AFH     ;定时器0初值低字节
ms      EQU      59H
yszt    bit     7fh     ;延时状态
;--------------------------------------------

        ORG    0000H
        aJMP   MAIN
        org    0003h
        ;lJMP   in0zd
        org    000bh
        lJMP   t0zd
        org    0013h
        ;lJMP   in1zd
        org    001bh
       ; ljmp   t1zd
        org    0030h
;----------------------------
MAIN:   
           setb yszt     
           clr tr0   ;关T0
           setb ea   ;CPU开中断
           ;----------------
           ;程序段
           ;------------------
           mov ms, #20
           setb tr0        ; 这里运行了指令 延时时间应该+1
           jb yszt, $ ;原地踏步 等待延时完成  YSZT 延时状态标志位 在T0的中断程序里面控制 为1则没有延时完 为0则表示延时完毕
           CLR TR0  ;延时完毕 关T0
            ;  ------------------------------------
           ; 延时完毕 ,要放的程序段
           ;
           ;-------------------------------
           ;---------------------
           ;程序段
           ;-------------------
            ajmp main
   
;-------------------------------------------------
;定时器T0中断服务子程序
;入口参数 MS
;出口参数 YSZT 延时状态标志位
;-------------------------------------------------
t0zd:

        MOV    TH0, #T0CZG          ;重装初始值
        MOV    TL0, #T0CZD
        PUSH   ACC  
        PUSH   PSW
        DJNZ   ms, exit     ;   MS未到0 退出      
        clr   yszt   ; 延时完成 MS里面的值已经剪到0 清延时状态标志位 退出
exit:   POP    PSW
        POP    ACC
        RETI
END








 代码写完了  不过在T0的中断程序的执行中 判断是否延时时间到的过程中 其实也占用了时间 
LZ  如果只是 去抖动 或者是 显示部分动态扫描要用到延时的话
完全可以用标准的 
2重循环 就够了
比如  延时1MS
 DELAY1ms:
                MOV R0,#2
      Y1:     MOV R1,#250
                DJNZ R1,$
                DJNZ R0,Y1
                RET  




[此贴子已经被作者于2009-4-2 13:42:25编辑过]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表