找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1722|回复: 4
打印 上一主题 下一主题
收起左侧

单片机流水灯错误出在哪里?个位大神,请帮我看一下

[复制链接]
跳转到指定楼层
楼主
问题描述:流水灯只依次循环点亮一遍。我想让它一直在循环点亮。
题目:如图8-3所示,P1口外接8个LED灯,要求编程实现循环流水灯功能,时间间隔0.5s,单片机外接晶振12MHz。

(所用实现方法:用定时器T0实现精确定时0.5s,将0.5s分解为100个5000us,用定时器T0的方式0实现。)



#include < reg51.h>
unsigned char count=0,i=0;
unsigned char s=0xfe;

//主函数
main (  )
   {
     P1=0xfe;
     TMOD=0x00;
     TH0=0x63;
     TL0=0x18;
     ET0=1;
     EA=1;
     TR0=1;
     while(1);
   }

//服务函数
void  Timer0_int( )  interrupt 1
    {                  
      count++;
      if (count==100)
        {
          count=0;
          i++;
           if(i<8)
             {
               s=s<<1;
               s=s^0x01;
               P1=s;
             }   
           else
           i=0;
        }
               
       TH0=0x63;
       TL0=0x18;
    }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:215958 发表于 2017-6-29 23:58 | 只看该作者
你中斷裡頭的i數到7的時候你的變數S是0x7F,也就是0111 1111(二進制),當你的i來到8的時候,你將你的i設為0,但是你的s是停留在0111 1111,所以下一次進中斷時,你的i會加1,你的s會先變成1111 1110,然後執行s=s^0x01,之後就變成了1111 1111,再下一次進中斷還是先變成1111 1110, 再執行行s=s^0x01,之後就變成了1111 1111,到這裡你就看的懂了吧!在else中除了將i歸0後,再補一個s=0xfe;的敘述看看吧!

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:215958 发表于 2017-6-30 00:01 | 只看该作者
在中斷的else敘述中多增加一個S=0xfe;
回复

使用道具 举报

地板
ID:216117 发表于 2017-6-30 15:27 | 只看该作者
中断内部有问题,自己推力一遍试试
回复

使用道具 举报

5#
ID:213173 发表于 2017-6-30 18:40 | 只看该作者
本帖最后由 wulin 于 2017-6-30 21:10 编辑

两个方法可以解决你的问题
方法1.
#include < reg51.h>
#include <intrins.h>
unsigned char count=0,i=0;
unsigned char s=0xfe;

//主函数
main (  )
   {
     P1=0xfe;
     TMOD=0x00;
     TH0=0x63;
     TL0=0x18;
     ET0=1;
     EA=1;
     TR0=1;
     while(1);
   }

//服务函数
void  Timer0_int( )  interrupt 1
{                  
        count++;
        if (count>=100)
        {
                count=0;
                P1=_crol_(P1,1);//P1循环左移一位
//                P1=_cror_(P1,1);//P1循环右移一位


/*                i++;
                if(i<8)
                {
                        s=s<<1;
                        s=s^0x01;
                        P1=s;
                }   
                else
                i=0;*/
        }        
        TH0=0x63;
        TL0=0x18;
}
方法2;#include < reg51.h>
#include <intrins.h>
unsigned char count=0,i=0;
unsigned char s=0xfe;

//主函数
main (  )
   {
     P1=0xfe;
     TMOD=0x00;
     TH0=0x63;
     TL0=0x18;
     ET0=1;
     EA=1;
     TR0=1;
     while(1);
   }

//服务函数
void  Timer0_int( )  interrupt 1
{                  
        count++;
        if (count>=100)
        {
                count=0;
                i++;
                s=s<<1;
                s=s^0x01;
                P1=s;  
                if(i>=8)
                {
                        i=0;
                        P1=s=0xfe;
                }

        }       
        TH0=0x63;
        TL0=0x18;
}



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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