正文

【024】定时器和硬计数器实现1个LED隔1s闪一次2007-05-02 12:38:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/25460.html

分享到:

;**************************************************************************    ; 标题: 定时器和硬计数器实现1个LED隔1s闪一次(汇编)    ; 作者: wentao     http://blog.liuwentao.net    ;                  http://wentao.programfan.com    ; 日期: 2007.2.21    ; 软件: Keil A51 V8.00     ; 芯片: AT89X51    ; 说明: 定时器0产生50ms脉冲,每次使P1.1口产生一下降沿,P1.1口与计数器1相接,    ;       计满10即0.5s取反一次P1.0口,实验板实测通过。    ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!     ;**************************************************************************              org  0000h          ajmp start           org  000bh           ;定时器0的中断入口地址           ajmp time0           ;跳到定时器0的中断服务程序处           org  001bh           ;计数器1的中断入口地址           ajmp cout1           ;跳到计数器1的中断服务程序处           org  0030h   start: clr  p1.0            ;P1.0口置低电平,灯亮           mov  tmod,#01100001b ;C/T0方式1定时,C/T1方式2计数           mov  th0,#0x3c       ;预置定时常数15536(3cb0)           mov  tl0,#0xb0          mov  th1,#0xf6       ;预置计数常数246(f6)           mov  tl1,#0xf6          mov  ip,#00001000b   ;设置C/T1为高优先级           setb ea              ;开总中断           setb et0             ;定时/计数器0允许中断           setb et1             ;C/T0允许中断           setb tr0             ;启动定时/计数器0           setb tr1             ;启动C/T1    lop:   ajmp lop             ;执行主程序,等待中断       time0:                      ;定时器0的中断服务程序           push acc             ;acc入栈保护           push psw             ;psw入栈保护           setb p1.1            ;使P1.1口产生一个下降沿脉冲           clr  p1.1           mov  th0,#0x3c       ;重置定时常数           mov  tl0,#0xb0                      pop  psw             ;psw出栈           pop  acc             ;acc出栈           reti              cout1:                      ;计数器1的中断服务程序           push acc             ;保护acc           push psw             ;保护psw           cpl  p1.0            ;计数到预定值则取反P1.0           pop  psw          pop  acc          reti   end   /**************************************************************************   * 标题: 定时器和硬计数器实现1个LED隔1s闪一次(C51)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.14   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 定时器0产生50ms脉冲,每次使P1.1口产生一下降沿,P1.1口与计数器1相接,           计满10即0.5s取反一次P1.0口,实验板实测通过。   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>       sbit P10 = P1^0;         // 位变量P10为P1.0    sbit P11 = P1^1;         // 位变量P11为P1.1       main()    {      P10 = 0;        // 初始置LED亮      TMOD = 0x61;    // C/T0方式1定时,C/T1方式2计数      TH0 = 0x3c;     // 装载定时常数15536(3cb0)      TL0 = 0xb0;      TH1 = 0xf6;     // 预置计数常数246(f6)      TL1 = 0xf6;      IP = 0x08;      // 设置C/T1为高优先级      EA = 1;         // 开总中断      ET0 = 1;        // C/T0允许中断      ET1 = 1;        // C/T1允许中断      TR0 = 1;        // 启动定时器0      TR1 = 1;        // 启动计数器1      while(1);       // 执行主程序,等待中断    }    void time0_int(void) interrupt 1    {      P11 = 1;        // P1.1口产生一个下降沿脉冲      P11 = 0;      TH0 = 0x3c;     // 重新装载定时常数      TL0 = 0xb0;    }    void count1_int(void) interrupt 3    {      P10 = !P10;     // 取反LED    }

阅读(3938) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册