正文

【022】定时器和软计数器查询方式实现1个LED隔1s闪一次2007-05-02 11:15:00

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

分享到:

;**************************************************************************    ;标题: 定时器和软计数器查询方式实现1个LED隔1s闪一次(汇编)    ;作者: wentao     http://blog.liuwentao.net    ;                 http://wentao.programfan.com    ;日期: 2007.2.21    ;软件: Keil A51 V8.00     ;芯片: AT89X51    ;说明: 实验板实测通过,注意中断发生后要对tf0进行软件清零    ;声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!     ;**************************************************************************              org  0000h          ajmp start    start: clr  p1.0            ;p1.0口置低电平,灯亮           mov  30h,#0x00       ;30h单元作为软件计数器,初始清零           mov  tmod,#00000001b ;定时/计数器0工作于方式1           mov  th0,#0x3c            mov  tl0,#0xb0       ;预置定时常数15536(3cb0)           setb ea              ;开总中断           setb et0             ;定时/计数器0允许中断           setb tr0             ;启动定时/计数器0    check: jnb  tf0, $          ;循环等待直到中断发生使tf0为1           inc  30h             ;软计数器加1           mov  a,30h          cjne a,#10,next      ;30h单元如未到10则继续计时           cpl  p1.0            ;定时时间到则取反LED           mov  30h,#0          ;清软件计数器    next:  mov  th0,#0x3c       ;重置定时常数           mov  tl0,#0xb0          clr  tf0             ;tf0需软件清0           jmp  check           ;循环       end用jbc指令则不需软件清零 ;**************************************************************************    ;标题: 定时器和软计数器查询方式实现1个LED隔1s闪一次(汇编)    ;作者: wentao     http://blog.liuwentao.net    ;                 http://wentao.programfan.com    ;日期: 2007.2.21    ;软件: Keil A51 V8.00     ;芯片: AT89X51    ;说明: 实验板实测通过。用jbc指令,硬件会自动清零该位(这里是tf0)    ;声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!     ;**************************************************************************              org  0000h          ajmp start    start: clr  p1.0            ;p1.0口置低电平,灯亮           mov  30h,#0x00       ;30h单元作为软件计数器,初始清零           mov  tmod,#00000001b ;定时/计数器0工作于方式1           mov  th0,#0x3c          mov  tl0,#0xb0       ;预置定时常数15536(3cb0)           setb ea              ;开总中断           setb et0             ;定时/计数器0允许中断           setb tr0             ;启动定时/计数器0    check: jbc  tf0, goon       ;循环等待直到中断发生使tf0为1           ajmp check           ;tf0为0则继续查询    goon:  inc  30h             ;软计数器加1           mov  a,30h          cjne a,#10,next      ;30h单元如未到10则继续计时           cpl  p1.0            ;定时时间到则取反LED           mov  30h,#0          ;清软件计数器    next:  mov  th0,#0x3c       ;重置定时常数           mov  tl0,#0xb0          jmp  check           ;循环       end /**************************************************************************   * 标题: 定时器和软计数器查询方式实现1个LED隔1s闪一次(C51)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 参考: 单片机的C语言应用程序设计(修订版) 马忠梅   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过,   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>       unsigned char count = 0; // 软计数器    sbit P10 = P1^0;         // 位变量P10为P1.0       main()    {      P10 = 0;        // 初始置LED亮      TMOD = 0x01;    // 定时/计数器0工作于方式1      EA = 1;         // 开总中断      ET0 = 1;        // 定时/计数器0允许中断      TR0 = 1;        // 启动定时/计数器0        while(1)        {          TH0 = 0x3c;     // 装载定时常数          TL0 = 0xb0;          while(!TF0);    // 查询等待定时中断使TF0为1          count++;        // 软计数器加1          if(count == 10)          {            P10 = !P10; // 取反LED            count = 0;  // 软计数器清零          }          TF0 = 0;        // TF0需软件清零      }    }

阅读(3825) | 评论(0)


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

评论

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