找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机走马灯程序问题求解

[复制链接]
ID:384762 发表于 2018-8-9 20:32 | 显示全部楼层 |阅读模式
#include "reg52.h"
#define LED P0
void main()
{
unsigned int i=0;
unsigned int j=0;
while(1)
{
for(i=0;i<8;i++)
{
LED=(0x01<<i);
for(j=0;j<20000;j++);
}
for(i=0;i<8;i++)
{
LED=(0x08>>i);/*将0x08改成LED为什么效果不一样,此处的LED不也是等于0x08吗*/
for(j=0;j<20000;j++);
}
}
}

回复

使用道具 举报

ID:384762 发表于 2018-8-9 20:34 | 显示全部楼层
注释的地方改成0x08可以正常运行,但是换成LED则回到PO.1对应的灯的时候回来就不亮,去的时候没问题
回复

使用道具 举报

ID:135253 发表于 2018-8-9 22:29 | 显示全部楼层
#define LED P0,这句话看看
回复

使用道具 举报

ID:213173 发表于 2018-8-10 10:34 | 显示全部楼层
fandongyang 发表于 2018-8-9 20:34
注释的地方改成0x08可以正常运行,但是换成LED则回到PO.1对应的灯的时候回来就不亮,去的时候没问题

此处的LED不是等于0x08,是0x80。
回复

使用道具 举报

ID:384901 发表于 2018-8-10 10:53 | 显示全部楼层
define是直接替换的,所以你这程序里的LED就是P0,不是P0的值。
多写代码,多理解。
回复

使用道具 举报

ID:384902 发表于 2018-8-10 13:38 | 显示全部楼层
从高到低位   
回复

使用道具 举报

ID:279667 发表于 2018-8-10 14:21 | 显示全部楼层

#include "reg52.h"
#define LED P0
void main()
{
unsigned int i=0;
unsigned int j=0;
while(1)
{
for(i=0;i<8;i++)
{
LED=(0x01<<i);  //这句话的意思是让1向左偏移i位,二进制结果为:0000 0001,0000 0010,0000 0100,0000 1000,0001 0000,0010 0000,0100 0000,1000 0000
for(j=0;j<20000;j++);
}
for(i=0;i<8;i++)
{
LED=(0x08>>i);//这里的数值应该是0x80吧?  等于是把上面的二进制数慢慢的再退回来。
for(j=0;j<20000;j++);
}
}
}
回复

使用道具 举报

ID:384762 发表于 2018-8-10 19:50 | 显示全部楼层
mrhan1992 发表于 2018-8-10 14:21
#include "reg52.h"
#define LED P0
void main()

如果我把
LED=(0x08>>i);//这里的数值应该是0x80吧?  等于是把上面的二进制数慢慢的再退回来。
这句话的0x08用LED替换就是这样,
LED=(LED>>i);灯在回来的时候就不会亮了,就是0000 0001对应的灯不亮了
回复

使用道具 举报

ID:284969 发表于 2018-8-11 09:27 | 显示全部楼层
其实这个问题不复杂,你改成LED也可以的,但是你必须先要对LED初始化一下,就是赋初值,就可以这么写了,你直接将0x08换成LED,系统并不知道LED具体代表的是什么数,理解了吗?
回复

使用道具 举报

ID:384717 发表于 2018-8-11 10:58 | 显示全部楼层
#define LED P0 改为led=P0
回复

使用道具 举报

ID:384762 发表于 2018-8-11 11:19 | 显示全部楼层
zwwstar 发表于 2018-8-11 09:27
其实这个问题不复杂,你改成LED也可以的,但是你必须先要对LED初始化一下,就是赋初值,就可以这么写了,你 ...

可是那时候我将LED换成0x08的地方,LED的值不也就是0x08吗
回复

使用道具 举报

ID:385283 发表于 2018-8-11 16:01 | 显示全部楼层
#include "reg52.h" #define LED P0 void main() { unsigned int i=0;  unsigned int j=0; while(1) { for(i=0;i<8;i++) { LED=(0x01<<i);  //这句话的意思是让1向左偏移i位,二进制结果为:0000 0001,0000 0010,0000 0100,0000 1000,0001 0000,0010 0000,0100 0000,1000 0000 for(j=0;j<20000;j++); } for(i=0;i<8;i++) { LED=(0x08>>i);//这里的数值应该是0x80吧?  等于是把上面的二进制数慢慢的再退回来。 for(j=0;j<20000;j++); } } }
回复

使用道具 举报

ID:213173 发表于 2018-8-11 16:54 | 显示全部楼层
//如果写成LED=LED<<i,初次循环i=0,LED值不变=0x01,下次循环i=1,LED值=0x02,再次循环i=2,LED值=0x08。
//第4次循环LED值=0x40,到第5次循环就溢出了。第二个for循环错误的道理是一样的。改成如下这样才合理。
#include "reg52.h"
#define LED P0
void main()
{
        unsigned int i=0;
        unsigned int j=0;
        LED=0x01;//赋初值
        for(j=0;j<20000;j++);//延时
        while(1)
        {
                for(i=0;i<7;i++)
                {
                        LED=LED<<1;
                        for(j=0;j<20000;j++);
                }
                for(i=0;i<7;i++)
                {
                        LED=LED>>1;
                        for(j=0;j<20000;j++);
                }
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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