找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3199|回复: 12
收起左侧

麻烦高手看下我这个简单的小程序,运行出问题了

[复制链接]
ID:53239 发表于 2013-8-21 23:41 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include <intrins.h>
#define  uint unsigned int
#define  uchar unsigned char
uchar temp;
void delay()
{
        uint x,y;
        for(x=100;x>0;x--)
                for(y=100;y>0;y--);
}
void main()
{        uint i;
        temp=0xfe;
        P1=temp;
        for(i=8;i>=0;i--)    //此处想让流水灯就流一趟停止,可是实际是一直运行,用Keil测试显示,i=2、1、0、之后就等于65536、65535...这是怎么情                                                                                                                                                                                                                                                       请大神帮个忙,谢谢啦
        {       
           temp=_crol_(temp,1);       
          delay();
          P1=temp;
        }                
}

回复

使用道具 举报

ID:7485 发表于 2013-8-22 08:27 | 显示全部楼层
想一直循环就如下:
#include <reg52.h>
#include <intrins.h>
#define  uint unsigned int
#define  uchar unsigned char
unsigned char temp;
void delay()
{
        unsigned int x,y;
        for(x=100;x>0;x--)
                for(y=100;y>0;y--);
}
void main()
{        unsigned int i;
        temp=0xfe;
        P1=temp;
       while(1) {
        for(i=8;i>0;i--)    //注意和原来的区别 for(i=8;i>=0;i--) 
        {        
          temp=_crol_(temp,1);        
         delay();
         P1=temp;
        }   
}

}

如果想循环一次就如下:
#include <reg52.h>
#include <intrins.h>
#define  uint unsigned int
#define  uchar unsigned char
unsigned char temp;
void delay()
{
        unsigned int x,y;
        for(x=100;x>0;x--)
                for(y=100;y>0;y--);
}
void main()
{        unsigned int i;
        temp=0xfe;
        P1=temp;

        for(i=8;i>0;i--)    //注意和原来的区别 for(i=8;i>=0;i--)
        {        
          temp=_crol_(temp,1);        
         delay();
         P1=temp;
      
}
       while(1);   
}
回复

使用道具 举报

ID:32572 发表于 2013-8-22 22:59 | 显示全部楼层
换一下吧for(i=0;i<8;i++)

评分

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

查看全部评分

回复

使用道具 举报

ID:32572 发表于 2013-8-22 23:00 | 显示全部楼层
或者uint i改成 int i
回复

使用道具 举报

ID:32572 发表于 2013-8-22 23:00 | 显示全部楼层
或者uint i改成 int i

评分

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

查看全部评分

回复

使用道具 举报

ID:53239 发表于 2013-8-24 00:02 | 显示全部楼层
ahshmj 发表于 2013-8-22 08:27
想一直循环就如下:
#include
#include

谢谢哥们!顺便再问一下,为什么我让这小灯就循环一次,for的循环里面 i必须要>0呢,我试了下>=0就无限循环了,这个是咋回事啊???谢谢啦~~~
回复

使用道具 举报

ID:53239 发表于 2013-8-24 00:03 | 显示全部楼层
何必919 发表于 2013-8-22 23:00
或者uint i改成 int i

谢谢哥们啊
回复

使用道具 举报

ID:7485 发表于 2013-8-24 13:22 | 显示全部楼层
Always_Fighting 发表于 2013-8-24 00:02
谢谢哥们!顺便再问一下,为什么我让这小灯就循环一次,for的循环里面 i必须要>0呢,我试了下>=0就无限循 ...


unsigned int 类型(无符号整形)的范围是0~65535,65535+1=0 。  0-1=65535 。不能表示负数。

如果 =>0,就包括了全部集合,永远为“真”,所以无限循环。

上面有几位说得对,由于int类型可以表示负数,所以 “int i ”也可以。0-1=-1,就不再循环了。

但是有时也要考虑程序的合理性和可读性。
回复

使用道具 举报

ID:53239 发表于 2013-8-24 16:37 | 显示全部楼层
ahshmj 发表于 2013-8-24 13:22
unsigned int 类型(无符号整形)的范围是0~65535,65535+1=0 。  0-1=65535 。不能表示负数。

如果  ...

谢谢!明白了一些,还有个小问题啊 我上边宏定义 将 uint 代替 unsigned int 在主函数里直接就可以写 uint 了吧 我看你帮我改的程序是写成  unsigned int i 了

还有个 65535+1=0 这个是为啥?  谢谢帮忙啊!!!
回复

使用道具 举报

ID:7485 发表于 2013-8-24 20:40 | 显示全部楼层
Always_Fighting 发表于 2013-8-24 16:37
谢谢!明白了一些,还有个小问题啊 我上边宏定义 将 uint 代替 unsigned int 在主函数里直接就可以写 uint ...

你定义了以后 uint  就可以替代 unsigned int 了。
由于unsigned int 类型是16位二进制数,最大值是11111111 11111111B,再加1,就会向第17位进位,
变成1 00000000 00000000B,由于只有16位没有第17位,所以就变成 00000000 00000000B,也就是0 。注意中间的空格,是为了你能更方便的识别位数而加的。
你可以在电脑上的附件里面打开计算器, 在“查看”里面选择“科学型”,就可以进行16进制、2进制、8进制计算了。试验一下上面所说的。
回复

使用道具 举报

ID:53239 发表于 2013-8-24 22:07 | 显示全部楼层
ahshmj 发表于 2013-8-24 20:40
你定义了以后 uint  就可以替代 unsigned int 了。
由于unsigned int 类型是16位二进制数,最大值是1111 ...

谢谢版主,用计算机试了试和您说的一样,谢谢这几次的回复,作为学机械的单片机新手,以后请多多指教啊~~~谢谢!
回复

使用道具 举报

ID:8222 发表于 2013-9-9 20:09 | 显示全部楼层
各们高手解释的不错。

评分

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

查看全部评分

回复

使用道具 举报

ID:116886 发表于 2016-5-8 12:49 | 显示全部楼层
在main()里面加一个while(1)函数                                                                                                                                                                                                                                          请大神帮个忙,谢谢啦         {                    temp=_crol_(temp,1);                   delay();           P1=temp;         }                  }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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