找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1197|回复: 33
收起左侧

流水灯代码哪里有误

  [复制链接]
ID:1146126 发表于 2025-3-23 16:57 | 显示全部楼层 |阅读模式
各位大佬,普中51开发板,led共阳极,流水灯代码这样写为什么不对,效果是全灭
联想截图_20250323165612.png
回复

使用道具 举报

ID:707558 发表于 2025-3-30 11:42 | 显示全部楼层
12楼说得好,在第23行的for开始中已经重新给i赋值为0了,所以第29行的i=0是多余的,且n应该重新赋值才能让for循环中语句正常工作,所以把第29行改为n=1就可以实现流水灯了。
回复

使用道具 举报

ID:819175 发表于 2025-3-28 08:22 | 显示全部楼层
你还是弄个豆包AI编程吧,要快很多
回复

使用道具 举报

ID:879809 发表于 2025-3-27 17:18 | 显示全部楼层

默认就是data,加不加效果一样,并不是错的。
回复

使用道具 举报

ID:831024 发表于 2025-3-27 11:43 | 显示全部楼层
为何是乱亮?
回复

使用道具 举报

ID:1109793 发表于 2025-3-27 10:36 | 显示全部楼层
keemee 发表于 2025-3-27 01:56
溢出并不影响亮灯,乱亮而已,关键问题不对

为何是乱亮?
回复

使用道具 举报

ID:1109793 发表于 2025-3-27 10:36 | 显示全部楼层
keemee 发表于 2025-3-27 01:49
溢出了影响流水灯依次亮,也能乱亮

有没有可能*2就是被编译为左移了,事实上8次后就永远都是0了。就是全都灭的状态了。楼主并没有说这个流水灯只流一次还是一直流。
回复

使用道具 举报

ID:1109793 发表于 2025-3-27 10:33 | 显示全部楼层
sunwind001 发表于 2025-3-26 20:20
没有警告,我是想在最开头声明nTime,延时函数直接用我声明的nTime,这样不可以吗

还是要看看书的,当然也可以自己试试看,全局的变量和参数是不是一个,以及各自的作用范围
回复

使用道具 举报

ID:1110477 发表于 2025-3-27 02:01 | 显示全部楼层
data是错的
回复

使用道具 举报

ID:1110477 发表于 2025-3-27 01:56 | 显示全部楼层
sgq657785 发表于 2025-3-24 11:58
主要是8次循环后n没有重新置1,后面就溢出了

溢出并不影响亮灯,乱亮而已,关键问题不对
回复

使用道具 举报

ID:1110477 发表于 2025-3-27 01:53 | 显示全部楼层
188610329 发表于 2025-3-24 09:46
n = 0,   n*2 依然 = 0,   n*2*2*2*2……  也依然是 0

从头到尾 n = 0,   从头得尾 P2 = 0xff

他前面定义时n=1呀
回复

使用道具 举报

ID:1110477 发表于 2025-3-27 01:51 | 显示全部楼层
普中的板子,不太懂,不知有没有LED流水灯的总开关,或者控制芯片
回复

使用道具 举报

ID:1110477 发表于 2025-3-27 01:49 | 显示全部楼层
paladina 发表于 2025-3-24 08:59
用移位操作,你的n=n*2 会超出0XFF
while(1)
    {

溢出了影响流水灯依次亮,也能乱亮
回复

使用道具 举报

ID:1110477 发表于 2025-3-27 01:46 | 显示全部楼层
延时函数内部没有使用传进来的参数,变成了很短的定时函数
回复

使用道具 举报

ID:1110477 发表于 2025-3-27 01:43 | 显示全部楼层
mirvv 发表于 2025-3-24 09:40
你的unsigned char n = 1,是全局变量,不释放内存,你这一直循环的话,char类型最大256,多循环几次就cha ...

一次定义全局变量,多次使用并不会无限增加内存占用
回复

使用道具 举报

ID:1146126 发表于 2025-3-26 20:20 | 显示全部楼层
xiaobendan001 发表于 2025-3-24 10:23
代码原理大概没啥问题。但是你延时函数的参数没有使用。就是调用的时候的500没起作用。颜色400周期后退出, ...

没有警告,我是想在最开头声明nTime,延时函数直接用我声明的nTime,这样不可以吗
回复

使用道具 举报

ID:1146126 发表于 2025-3-26 20:18 | 显示全部楼层
mirvv 发表于 2025-3-24 09:40
你的unsigned char n = 1,是全局变量,不释放内存,你这一直循环的话,char类型最大256,多循环几次就cha ...

请问这应该怎么释放内存
回复

使用道具 举报

ID:1146126 发表于 2025-3-26 20:13 | 显示全部楼层
xiaobendan001 发表于 2025-3-24 10:23
代码原理大概没啥问题。但是你延时函数的参数没有使用。就是调用的时候的500没起作用。颜色400周期后退出, ...

我没考虑到char的范围,现在改一改,延时函数那边我已经改过了,把30行和29行换一个位置就都能流了,感谢
回复

使用道具 举报

ID:1146126 发表于 2025-3-26 20:11 | 显示全部楼层
CQ123 发表于 2025-3-26 14:12
把最后的i=0改成n=1;

好的,这样改就可以流水了
回复

使用道具 举报

ID:890708 发表于 2025-3-26 16:16 | 显示全部楼层
188610329 发表于 2025-3-24 09:46
n = 0,   n*2 依然 = 0,   n*2*2*2*2……  也依然是 0

从头到尾 n = 0,   从头得尾 P2 = 0xff

n = 1;啊
回复

使用道具 举报

ID:1146339 发表于 2025-3-26 14:12 | 显示全部楼层
把最后的i=0改成n=1;
回复

使用道具 举报

ID:879809 发表于 2025-3-26 13:47 | 显示全部楼层
第29行i=0无意义,改成n=1即可。
回复

使用道具 举报

ID:227393 发表于 2025-3-24 11:58 来自触屏版 | 显示全部楼层
主要是8次循环后n没有重新置1,后面就溢出了
回复

使用道具 举报

ID:36322 发表于 2025-3-24 10:24 | 显示全部楼层
把最后的i=0改成n=1;
回复

使用道具 举报

ID:1109793 发表于 2025-3-24 10:23 | 显示全部楼层
代码原理大概没啥问题。但是你延时函数的参数没有使用。就是调用的时候的500没起作用。颜色400周期后退出,400周期很快的,就是可能一瞬间就完成了8个LED的流水,你没看到。实际上是7个,因为你输出时是先N*2的。这样第一个实际上是没有亮过的。如5楼那样改下延时让参数起作用试试看。
而且你声明是全局的NTIME变量,然后在形参里面也用了NTIME,并且没有指明类型。这习惯不好,容易混淆。不指定类型的参数会是什么类型?另外这种编译时不会有警告吗?如果是你声明的CHAR类型那么你传给他一个500是超了范围的。
回复

使用道具 举报

ID:1057978 发表于 2025-3-24 10:22 | 显示全部楼层
你还是很有想象力的,不过要注意N的阶乘容易溢出
回复

使用道具 举报

ID:1109793 发表于 2025-3-24 10:05 | 显示全部楼层
188610329 发表于 2025-3-24 09:46
n = 0,   n*2 依然 = 0,   n*2*2*2*2……  也依然是 0

从头到尾 n = 0,   从头得尾 P2 = 0xff

人家N不是初始化=1了?
回复

使用道具 举报

ID:624769 发表于 2025-3-24 09:46 | 显示全部楼层
n = 0,   n*2 依然 = 0,   n*2*2*2*2……  也依然是 0

从头到尾 n = 0,   从头得尾 P2 = 0xff
你希望 怎么流水灯??
回复

使用道具 举报

ID:890708 发表于 2025-3-24 09:40 | 显示全部楼层
sunwind001 发表于 2025-3-23 16:59
把while(1)框架删除,是全亮而且板子一直响

你的unsigned char n = 1,是全局变量,不释放内存,你这一直循环的话,char类型最大256,多循环几次就char就溢出了就是这个变量n错了;
回复

使用道具 举报

ID:452475 发表于 2025-3-24 09:30 | 显示全部楼层
呃。我猜你是想表达是的P2 = 0XFF << 1 ?
回复

使用道具 举报

ID:583948 发表于 2025-3-24 09:30 | 显示全部楼层
#include <STC89C5xRC.H>

void DelayXms(unsigned int ms) {
    unsigned int i, j;
    for (i = ms; i > 0; i--)
        for (j = 110; j > 0; j--);
}

void main() {
    unsigned char i;
    while(1) {
        for(i=0; i<8; i++) {
            P2 = 0xFF - (0x01 << i); // 逐位点亮
            DelayXms(500);
        }
    }
}
1.查看一下你的LED端口是否为P2等等,确认硬件端口正确
2.参数类型确认
3.端口移位操作
回复

使用道具 举报

ID:796531 发表于 2025-3-24 08:59 | 显示全部楼层
用移位操作,你的n=n*2 会超出0XFF
while(1)
    {
        for(i = 0; i < 7; i++)
        {
            P2 = ~(0x01 << i);
            DelayXms(500);
        }
        
回复

使用道具 举报

ID:1146126 发表于 2025-3-23 17:03 | 显示全部楼层
延时函数那边已经修改过了
回复

使用道具 举报

ID:1146126 发表于 2025-3-23 16:59 | 显示全部楼层
把while(1)框架删除,是全亮而且板子一直响
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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