标题: 关于51单片机定时中断的程序问题? [打印本页]

作者: xunuo    时间: 2018-12-10 22:03
标题: 关于51单片机定时中断的程序问题?
我想使用单片机定时器T0产生的中断制作跑马灯

单片机程序源码:
  1. #include<reg51.h>

  2. void main(void)
  3. {
  4.         EA = 1;
  5.         ET0 = 1;
  6.         TMOD = 0x01;
  7.         TH0 = 15536 / 256;
  8.         TL0 = 15536 % 256;
  9.         TR0 = 1;
  10.         P0 = 0xfe;
  11.         while(1)
  12.                 ;
  13. }

  14. void Time0(void) interrupt 1 using 0
  15. {
  16.         P0 <<= 1;
  17.         if (P0 != 0xff)
  18.                 P0 |= 1;
  19.         else
  20.                 P0 = 0xfe;         
  21.         TH0 = 15536 / 256;
  22.         TL0 = 15536 % 256;
  23. }
复制代码
这样的话八个led只会执行一次循环后无反应
而将P0 <<= 1;if (P0 != 0xff)
P0 |= 1;
else
P0 = 0xfe; 换成_crol_(P0, 1);后,
效果如图:
希望各位解答一下这两种情况的原因


QQ截图20181206232137.png (120.4 KB, 下载次数: 18)

QQ截图20181206232137.png

作者: mosqu    时间: 2018-12-11 09:28
P0 <<= 1;
        if (P0 != 0xff)
                P0 |= 1;
        else
                P0 = 0xfe;
P0到0xff的时候执行else P0 = 0xfe,然后下一个定时触发的时候又左移一位,变成0xff在这里重复了

_crol_();你有没有加头文件intrins.h的
作者: HC6800-ES-V2.0    时间: 2018-12-11 10:36
我已经试验出这个结果:
你说:换成_crol_(P0, 1);后

这个应该是P0=_crcl_(P0,1),结果就是正确的
作者: HC6800-ES-V2.0    时间: 2018-12-11 10:53
总算搞清楚了。
这样改就对了:
        P2 <<= 1;
             P2 |= 1;
        if(P2 == 0xff)
               P2 = 0xfe;
你自己想想流程吧,有点考人,呵呵
作者: xunuo    时间: 2018-12-21 00:18
HC6800-ES-V2.0 发表于 2018-12-11 10:36
我已经试验出这个结果:
你说:换成_crol_(P0, 1);后


谢谢指导
作者: xunuo    时间: 2018-12-21 00:18
mosqu 发表于 2018-12-11 09:28
P0

谢谢提醒




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1