找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11447|回复: 31
收起左侧

为什么单片机流水灯这样写,只能亮4个LED。我要亮8个灯

  [复制链接]
ID:427818 发表于 2018-11-16 16:55 | 显示全部楼层 |阅读模式
        while(1)
        {
           led = 0x01;
           delay(50000);
           led = 0x02;
           delay(50000);
           led = 0x03;
           delay(50000);
           led = 0x04;
           delay(50000);
           led = 0x11;
           delay(50000);
           led = 0x12;
           delay(50000);
           led = 0x13;
           delay(50000);
           led = 0x14;
           delay(50000);
回复

使用道具 举报

ID:155507 发表于 2018-11-16 17:07 | 显示全部楼层
给你改了一下试试。

        while(1)
        {
           led = 0x01;
           delay(50000);
           led = 0x02;
           delay(50000);
           led = 0x04;
           delay(50000);
           led = 0x08;
           delay(50000);
           led = 0x10;
           delay(50000);
           led = 0x20;
           delay(50000);
           led = 0x40;
           delay(50000);
           led = 0x80;
           delay(50000);



回复

使用道具 举报

无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
ID:427831 发表于 2018-11-16 17:14 | 显示全部楼层
led是8位IO口吗?没太看懂你的代码
回复

使用道具 举报

ID:295874 发表于 2018-11-16 17:22 | 显示全部楼层
你目前的位操作就只操作到了四个IO口,所以。。。。。。
回复

使用道具 举报

ID:379730 发表于 2018-11-16 17:29 | 显示全部楼层
本帖最后由 MMU_FS 于 2018-11-16 17:37 编辑

这样是不对的,要按十六进制来,假设led映射的P0,应该这样写uint8_t temp = 0x01 , i = 0;
led = temp;

while(1)
{      temp = 0x01;
    for(i = 0 ; i < 8 ;  i ++)
    {
        led =(temp << 1) | temp;
        delay(50000);
    }
    temp = 0x7F;
    for(i = 0 ; i < 8 ;  i ++)
    {
l        ed =(temp >> 1) & temp;
        delay(50000);
    }

}
         


回复

使用道具 举报

ID:427839 发表于 2018-11-16 17:42 | 显示全部楼层
你的数值都不对,一个是8421,8421.
回复

使用道具 举报

ID:423511 发表于 2018-11-16 17:49 | 显示全部楼层
把led后边的数改为:0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80。试一下。
回复

使用道具 举报

10#
无效楼层,该帖已经被删除
ID:389298 发表于 2018-11-16 18:10 | 显示全部楼层
有没有图
回复

使用道具 举报

ID:63351 发表于 2018-11-16 18:48 | 显示全部楼层
你是要做流水灯呢还是,让8个常亮呢?  我默认你的led是低电平有效的, 如果是8个灯常亮,led = 0x00;  如果要依次点亮8个灯,你可以采用循环语句 led=0xff ;for(i=0;i<8; i++){led &= (0xfe<<i);  delay(50000); }
回复

使用道具 举报

13#
无效楼层,该帖已经被删除
ID:427818 发表于 2018-11-16 22:10 | 显示全部楼层
我就是想用最原始的方法试试,才开始学不久。各位大神的我都试试再说哈
回复

使用道具 举报

ID:427818 发表于 2018-11-16 22:17 | 显示全部楼层
angmall 发表于 2018-11-16 17:07
给你改了一下试试。

        while(1)

大神,我的为什么程序出现了什么问题呢?
回复

使用道具 举报

ID:427818 发表于 2018-11-16 22:18 | 显示全部楼层
kr123crg 发表于 2018-11-16 17:14
led是8位IO口吗?没太看懂你的代码

是8位的IO
回复

使用道具 举报

ID:427818 发表于 2018-11-16 22:18 | 显示全部楼层
liyongan_1985 发表于 2018-11-16 17:22
你目前的位操作就只操作到了四个IO口,所以。。。。。。

的确是这样,为什么呢?出错在那呢?
回复

使用道具 举报

ID:410399 发表于 2018-11-17 08:32 | 显示全部楼层
0x01  ->  0000 0001
0x02  ->  0000 0010
0x03  ->  0000 0011
0x04  ->  0000 0100
0x11  ->  0000 1011
0x12  ->  0000 1100
0x13  ->  0000 1101
0x14  ->  0000 1110
你的是低电平有效还是高电平有效,怎么流水灯法,没明白。
你程序对应2进制是这样,对应输出,最多就控制了4位LED
回复

使用道具 举报

ID:427818 发表于 2018-11-17 16:14 | 显示全部楼层
mosqu 发表于 2018-11-17 08:32
0x01  ->  0000 0001
0x02  ->  0000 0010
0x03  ->  0000 0011

噢噢,明白了
回复

使用道具 举报

ID:392042 发表于 2018-11-17 17:43 | 显示全部楼层
这个和iIO的定义有关系
回复

使用道具 举报

21#
无效楼层,该帖已经被删除
ID:428347 发表于 2018-11-17 19:05 | 显示全部楼层
十六进制有abcdef的才能控制到高4位,肯定不能控制8个
回复

使用道具 举报

ID:300347 发表于 2018-11-17 23:08 | 显示全部楼层
你可以使用51里的移位函数,只要让一个IO口的灯亮,接下来对这个IO口进行位移
回复

使用道具 举报

ID:428719 发表于 2018-11-18 15:44 | 显示全部楼层
改成0xff试试
回复

使用道具 举报

ID:428557 发表于 2018-11-18 20:24 | 显示全部楼层
如果楼主的LED灯共阴的话
回复

使用道具 举报

ID:428557 发表于 2018-11-18 20:27 | 显示全部楼层
如果楼主LED共阴的话while(1)         {            led = 0x01;            delay(50000);            led = 0x02;            delay(50000);            led = 0x04;            delay(50000);            led = 0x08;            delay(50000);            led = 0x10;            delay(50000);            led = 0x20;            delay(50000);            led = 0x40;            delay(50000);            led = 0x80;            delay(50000);如果共阳的话while(1)         {            led = 0x01;            delay(50000);            led = 0x02;            delay(50000);            led = 0x04;            delay(50000);            led = 0x08;            delay(50000);            led = 0xfe;            delay(50000);            led = 0xfd;            delay(50000);            led = 0xfb;            delay(50000);            led = 0xf7;            delay(50000);
回复

使用道具 举报

ID:422467 发表于 2018-11-19 16:15 | 显示全部楼层
8421,8421
回复

使用道具 举报

ID:407083 发表于 2018-11-19 18:38 | 显示全部楼层
你LED赋值不对,当然不能亮8个啊
回复

使用道具 举报

ID:429435 发表于 2018-11-19 19:50 | 显示全部楼层
#include<reg52.h> #define uint unsigned int #define uchar unsigned char uint i,j,z,; uchar a; void main(){ a=0xfe; for(z=0;z<8;z++){ P1=a; a=~a; a=a<<1; a=~a; for(i=150;i>0;i--) for(j=110;j>0;j--);  } }这样也可以
回复

使用道具 举报

ID:255398 发表于 2018-11-20 09:28 | 显示全部楼层
你的电路图?是高电平,还是 低电平点亮?把你的赋值写成16进制,就明白为何只亮四个灯了。
回复

使用道具 举报

ID:255398 发表于 2018-11-20 09:49 | 显示全部楼层
先弄清楚16进制与二进制的关系,你知道只亮四个灯了
回复

使用道具 举报

ID:168851 发表于 2018-11-20 10:55 | 显示全部楼层
你的程序只是动作了4个IO口,具体的可以看看这个哈,你需要将十六进制转换为二进制,转换后如下(8421转换哈)
0x01 --> 0000 0001 --->只亮最后1个灯珠
0x02 --> 0000 0010 --->只亮倒数第2个灯珠
0x03 --> 0000 0011 --->只亮最后2个灯珠
0x04 --> 0000 0100 --->只亮倒数第3个灯珠
0x11 --> 0001 0001 --->只亮第4个和第8个灯珠
0x12 --> 0001 0010 --->只亮第4个和第7个灯珠
0x13 --> 0001 0011 --->只亮第4个、第7个和第8个灯珠
0x14 --> 0001 0100 --->只亮第4个和第6个灯珠
你仔细观察哈,其中1就是你变换的位,所以你整个过程总共就只变换了4位,即4个LED灯点亮(主要是第4颗、第6颗、第7颗、第8颗,这几颗灯珠),所以你应该是高电平点亮LED灯珠。
最后给你个建议,可以看看郭天祥的单片机视频教程,讲得比较好,听了就懂了哈
回复

使用道具 举报

ID:429759 发表于 2018-11-20 11:07 | 显示全部楼层
需要控制到高4位
回复

使用道具 举报

ID:429813 发表于 2018-11-20 12:46 | 显示全部楼层

十六进制有abcdef的才能控制到高4位,肯定不能控制8个
回复

使用道具 举报

ID:432415 发表于 2018-11-24 16:04 | 显示全部楼层
你这个管脚是不是定义的有问题
回复

使用道具 举报

ID:910589 发表于 2021-4-22 22:46 | 显示全部楼层
xqj777 发表于 2018-11-16 18:48
你是要做流水灯呢还是,让8个常亮呢?  我默认你的led是低电平有效的, 如果是8个灯常亮,led = 0x00;  如 ...

你好,试了一下你的流水灯的程序,只有前7个LED会工作,最后一个一直不亮。还有用了几个其他的流水灯的实验也是这样的情况。不知道是为什么?请问您知道吗?求解答
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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