正文

【023】定时器和软计数器中断方式实现1个LED隔1s闪一次2007-05-02 12:35:00

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

分享到:

;**************************************************************************    ; 标题: 定时器和软计数器中断方式实现1个LED隔1s闪一次(汇编)    ; 作者: wentao     http://blog.liuwentao.net    ;                  http://wentao.programfan.com    ; 参考: 《单片机轻松入门》 周坚    ; 日期: 2007.2.21    ; 软件: Keil A51 V8.00     ; 芯片: AT89X51    ; 说明: 实验板实测通过    ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!     ;**************************************************************************              org  0000h          ajmp start           org  000bh           ;定时器0的中断入口地址           ajmp time0           ;跳到定时器0的中断服务程序处           org  0030h   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    lop:   ajmp lop             ;执行主程序,等待中断       time0:                      ;定时器0的中断服务程序           push acc             ;acc入栈保护           push psw             ;psw入栈保护           inc  30h             ;软件计数器加1           mov  a,30h          cjne a,#10,next      ;30h单元中的值是否到10了           cpl  p1.0            ;到了,则取反p1.0           mov  30h,#0          ;清软件计数器    next:  mov  th0,#0x3c       ;重置定时常数           mov  tl0,#0xb0                       pop  psw             ;psw出栈           pop  acc             ;acc出栈           reti   end /**************************************************************************   * 标题: 定时器和软计数器中断方式实现1个LED隔1s闪一次(C51用位变量)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>       sbit P10 = P1^0;         // 位变量P10为P1.0    unsigned char count = 0; // 软计数器       main()    {      P10 = 0;        // 初始置LED亮      TMOD = 0x01;    // 定时/计数器0工作于方式1      TH0 = 0x3c;     // 装载定时常数      TL0 = 0xb0;      EA = 1;         // 开总中断      ET0 = 1;        // 定时/计数器0允许中断      TR0 = 1;        // 启动定时/计数器0      while(1);       // 执行主程序,等待中断    }    void time0_int(void) interrupt 1    {      count++;        // 软计数器加1            if (count == 10)      {        P10 = !P10; // 取反LED        count = 0;      }       TH0 = 0x3c;     // 重新装载定时常数      TL0 = 0xb0;    }          /*****************************************************   LED取反部分还可用库函数_testbit_()   需包含头文件intrins.h   将P10 = !P10;一句换成:           if(_testbit_(P10))           P10 = 0;       else         P10 = 1;    *****************************************************/ /**************************************************************************   * 标题: 定时器和软计数器中断方式实现1个LED隔1s闪一次(C51用位变量)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过, 定时器初值在程序中计算得到   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>       #define uchar unsigned char    #define uint unsigned int       #define fosc 11.0592  // 晶振频率    #define time0 50000   // 欲定时50ms(50000us)       sbit P10 = P1^0;      // 位变量P10为P1.0       uchar count = 0;      // 软计数器    uchar data time0_h;   // 为TH0赋值    uchar data time0_l;   // 为TL0赋值    uint idata time0_tmp; // 预置定时常数       main()    {      P10 = 0;        // 初始置LED亮      TMOD = 0x01;    // 定时/计数器0工作于方式1            time0_tmp = 65536 - time0 * fosc / 12;      time0_h = (time0_tmp / 256);      time0_l = (time0_tmp % 256);            TH0 = time0_h;  // 装载定时常数      TL0 = time0_l;      EA = 1;         // 开总中断      ET0 = 1;        // 定时/计数器0允许中断      TR0 = 1;        // 启动定时/计数器0      while(1);       // 执行主程序,等待中断    }    void time0_int(void) interrupt 1    {      count++;        // 软计数器加1            if (count == 10)      {        P10 = !P10;        count = 0;      }       TH0 = time0_h;  // 重新装载定时常数      TL0 = time0_l;    } /**************************************************************************   * 标题: 定时器和软计数器中断方式实现1个LED隔1s闪一次(C51不用位变量)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>       #define led_off P1 |= (1<<0)  // 置位P1.0,LED灭    #define led_on  P1 &= ~(1<<0) // 清零P1.0,LED亮       unsigned char count = 0;  // 软计数器    unsigned char flag = 1;   // LED亮灭标记,初始亮       main()    {      led_on;         // 初始置LED亮      TMOD = 0x01;    // 定时/计数器0工作于方式1      TH0 = 0x3c;     // 预置定时常数15536(3cb0)      TL0 = 0xb0;      EA = 1;         // 开总中断      ET0 = 1;        // 定时/计数器0允许中断      TR0 = 1;        // 启动定时/计数器0      while(1);       // 执行主程序,等待中断    }    void time0(void) interrupt 1    {      count++;        // 软计数器加1            if (count == 10)      {          if(flag)    // 取反LED            led_off, flag = 0;        else         led_on, flag = 1;        count = 0;  // 软计数器清零      }      TH0 = 0x3c;     // 重新装载定时常数      TL0 = 0xb0;    }

阅读(4612) | 评论(0)


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

评论

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