找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2073|回复: 5
收起左侧

关于51单片机定时中断的程序问题?

[复制链接]
ID:376199 发表于 2018-12-10 22:03 | 显示全部楼层 |阅读模式
我想使用单片机定时器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
回复

使用道具 举报

ID:410399 发表于 2018-12-11 09:28 | 显示全部楼层
P0 <<= 1;
        if (P0 != 0xff)
                P0 |= 1;
        else
                P0 = 0xfe;
P0到0xff的时候执行else P0 = 0xfe,然后下一个定时触发的时候又左移一位,变成0xff在这里重复了

_crol_();你有没有加头文件intrins.h的
回复

使用道具 举报

ID:164602 发表于 2018-12-11 10:36 | 显示全部楼层
我已经试验出这个结果:
你说:换成_crol_(P0, 1);后

这个应该是P0=_crcl_(P0,1),结果就是正确的
回复

使用道具 举报

ID:164602 发表于 2018-12-11 10:53 | 显示全部楼层
总算搞清楚了。
这样改就对了:
        P2 <<= 1;
             P2 |= 1;
        if(P2 == 0xff)
               P2 = 0xfe;
你自己想想流程吧,有点考人,呵呵
回复

使用道具 举报

ID:376199 发表于 2018-12-21 00:18 来自手机 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-12-11 10:36
我已经试验出这个结果:
你说:换成_crol_(P0, 1);后


谢谢指导
回复

使用道具 举报

ID:376199 发表于 2018-12-21 00:18 来自手机 | 显示全部楼层
mosqu 发表于 2018-12-11 09:28
P0

谢谢提醒
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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