找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1822|回复: 15
收起左侧

关于单片机呼吸灯程序,为什么不用加while(1)也能闪烁,请问是哪里陷入了死循环

[复制链接]
ID:1055423 发表于 2022-12-12 16:05 | 显示全部楼层 |阅读模式
各位大佬求助 单片机源程序如下:
#include <STC12C5A60S2.H>

void Delay10ms(unsigned char i)                //@12.000MHz
{
        unsigned char j;

        j = 113;
        do
        {
                while (--j);
        } while (--i);
}

void main()
{
          unsigned char i,j;
                P0M0=0x00;//io模式的配置
                P0M1=0x00;
                P0=0x00;//将所有led全部灭掉,赋值为低电平
        //呼吸灯
                        for(i=0;i<10;i++)
                        {
                                P00=1;
                                Delay10ms(i);
                                P00=0;
                                Delay10ms(10-i);
                                Delay10ms(5);
                        }
                         for(j=0;j<10;j++)
                        {
                                P00=0;
                                Delay10ms(j);
                                P00=1;
                                Delay10ms(10-j);
                                Delay10ms(5);
                        }
}
为什么他的亮灭肉眼可见,明明我的占空比已经很小了
回复

使用道具 举报

ID:213173 发表于 2022-12-12 17:27 | 显示全部楼层
主函数不加while(1)约束,程序跑飞了。你看到的闪烁不是呼吸效果,是重复进入main函数初始化P0的反映。
回复

使用道具 举报

ID:883242 发表于 2022-12-12 17:31 | 显示全部楼层
很显然是死机了,然后自动重启,才会闪烁,而时间远超你的设定值。
回复

使用道具 举报

ID:1055423 发表于 2022-12-12 17:56 | 显示全部楼层
wulin 发表于 2022-12-12 17:27
主函数不加while(1)约束,程序跑飞了。你看到的闪烁不是呼吸效果,是重复进入main函数初始化P0的反映。

谢谢你的回答,可是加了while(1)也达不到效果,
回复

使用道具 举报

ID:213173 发表于 2022-12-12 19:07 | 显示全部楼层
小白大佬轻点喷 发表于 2022-12-12 17:56
谢谢你的回答,可是加了while(1)也达不到效果,

加了while(1)也达不到效果是因为这个代码根本做不到呼吸灯功能
回复

使用道具 举报

ID:1056573 发表于 2022-12-12 19:19 | 显示全部楼层
应该与Delay10ms(i)及while (--i)有关,i初值赋值i=0,到while (--i)这变为while(-1)了,永远到不了while(0)终止,这样就死循环了,改为while (i--)看看。
回复

使用道具 举报

ID:883242 发表于 2022-12-12 19:53 | 显示全部楼层
ytchfp163 发表于 2022-12-12 19:19
应该与Delay10ms(i)及while (--i)有关,i初值赋值i=0,到while (--i)这变为while(-1)了,永远到不了whil ...

i=1难道就不能终止了吗?还是你觉得i=-1无法递减到i=1?
回复

使用道具 举报

ID:1055423 发表于 2022-12-12 21:48 | 显示全部楼层
wulin 发表于 2022-12-12 19:07
加了while(1)也达不到效果是因为这个代码根本做不到呼吸灯功能

好吧,感谢大佬回答,呼吸灯是不是的用定时器才可以,我看到网上用我这样子也行呀
回复

使用道具 举报

ID:1055423 发表于 2022-12-12 21:50 | 显示全部楼层
ytchfp163 发表于 2022-12-12 19:19
应该与Delay10ms(i)及while (--i)有关,i初值赋值i=0,到while (--i)这变为while(-1)了,永远到不了whil ...

好像有道理,感谢。
回复

使用道具 举报

ID:1055423 发表于 2022-12-12 21:51 | 显示全部楼层
ytchfp163 发表于 2022-12-12 19:19
应该与Delay10ms(i)及while (--i)有关,i初值赋值i=0,到while (--i)这变为while(-1)了,永远到不了whil ...

可是i是无符号,0-1不应该还是0吗
回复

使用道具 举报

ID:77589 发表于 2022-12-13 10:41 | 显示全部楼层
小白大佬轻点喷 发表于 2022-12-12 21:51
可是i是无符号,0-1不应该还是0吗

兄弟,unsigned char i = 0; 那么 i - 1 应该等于255。
回复

使用道具 举报

ID:158391 发表于 2022-12-13 20:05 | 显示全部楼层
Longan.Wang 发表于 2022-12-13 10:41
兄弟,unsigned char i = 0; 那么 i - 1 应该等于255。

对地,昨天刚学到,超出表示范围的数会从头记起
回复

使用道具 举报

ID:1034262 发表于 2022-12-13 20:30 | 显示全部楼层
主函数没有大循环,跑完那两个for循环后,继续往后跑,一般程序区空的地方,要么是FF,要么是00,跑到程序最后,又回卷,从头开始跑。00对应命令NOP,FF对应命令MOV A, R7,都是一周期,STC12C5A60S2是60K字节,跑12MHz,则只需要60*1024/12=5120us,即,只需要5.12ms,就能跑完空余的ROM再到开头。
回复

使用道具 举报

ID:1055423 发表于 2022-12-13 22:15 | 显示全部楼层
Longan.Wang 发表于 2022-12-13 10:41
兄弟,unsigned char i = 0; 那么 i - 1 应该等于255。

上次刚学有记错了。。感谢你的指出
回复

使用道具 举报

ID:1055423 发表于 2022-12-13 22:16 | 显示全部楼层
coody_sz 发表于 2022-12-13 20:30
主函数没有大循环,跑完那两个for循环后,继续往后跑,一般程序区空的地方,要么是FF,要么是00,跑到程序 ...

感谢你太高级了,有些东西看不懂。。
回复

使用道具 举报

ID:1049152 发表于 2023-1-12 14:43 | 显示全部楼层
程序跑飞了,不断初始化。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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