标题: 51单片机 里while(1)最多可以运行多长时间的命令? [打印本页]

作者: 鬼推磨    时间: 2021-7-18 19:18
标题: 51单片机 里while(1)最多可以运行多长时间的命令?
51单片机 里while(1)最多可以运行多长时间的命令?
我做个小玩具,里面有很多步骤,通过实验,程序并没有全部运行完,
就返回第一条,每次都是这样,一分钟时间都不到,但我的程序步骤太多,运行完也得5分钟样子,,
这是为什么?
有没有办法把我的程序全部运行完。用的是89C52单片机。

感觉这是单片机短板,比如做一个无序灯光闪烁类,比如坐一首歌曲指挥动作控制类,时间太长,代码太多,就完不成任务功能。。。

例子:

sbit LED1=P2^0;

sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;

void delay_ms(uint n)//11.0592M的晶振 delay_ms(1000);//1000ms毫秒=1s秒
{
uint i,j;
for(i=n;i>0;i--)
{
for(j=114;j>0;j--);
}
}



void main()
{
while(1)
{

LED1=1;
delay_ms(1000);
LED1=0;

LED2=1;
delay_ms(1000);
LED2=0;

LED3=1;
delay_ms(1000);
LED3=0;


LED4=1;
delay_ms(1000);
LED4=0;


LED5=1;
delay_ms(1000);
LED5=0;


LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
delay_ms(2000);
LED1=0;
LED2=0;
LED3=0;
LED4=0;
LED5=0;


LED1=1;
LED2=1;

delay_ms(2000);
LED1=0;
LED2=0;


LED3=1;
LED4=1;
LED5=1;

delay_ms(2000);
LED3=0;
LED4=0;
LED5=0;


暂写这么多,
后面还有好几百条命令,
无序无规律,
全部运行完,
估计得5分钟样子
........
........

}
}
















作者: MOVEORDIE    时间: 2021-7-18 21:55
按理说能烧录进去就可以运行完的,除非你的程序有问题。还有,如果实际的代码长延时也是像你的例子一样的话,就要改了,应该用定时器做个时间基准,用一个变量或者标记在这个基准上计数/延时
作者: wulin    时间: 2021-7-18 22:01
主循环while(1)运行周期多长时间没有限制,“程序并没有全部运行完,就返回第一条,每次都是这样,一分钟时间都不到” 那是因为你程序写得太烂。单片机处理一条指令就几微秒。难道你有上千万条代码?单片机也装不下啊。
作者: lkc8210    时间: 2021-7-18 22:48
wulin 发表于 2021-7-18 22:01
主循环while(1)运行周期多长时间没有限制,“程序并没有全部运行完,就返回第一条,每次都是这样,一分钟时 ...

赞成!
程序写得太烂+单片机装不下
作者: 菜鸟yc    时间: 2021-7-19 08:22
可以检查一下是不是看门狗、复位引脚、复位软指令、电源等导致系统复位了,然后程序看起来像“程序并没有全部运行完,就返回第一条指令执行”了
还有,建议程序的延时不要写成这样。。。
作者: wufa1986    时间: 2021-7-19 08:27
不用担心,可以运行几百年
作者: 适得府君书    时间: 2021-7-19 09:14
厉害一点的玩家已经不用delay去延时了。while(1)里面延时越多越浪费单片机资源。你这样的写法只是增加了代码行数。
作者: yzwzfyz    时间: 2021-7-19 13:46
编程序是需要智商的。
架构程序远比写代码重要。
一看见【delay_ms(2000)】就知道程序很蠢,优化的空间很大。
另外:while(1)是没有运行时间限制的!!!


作者: lum0s    时间: 2021-7-19 20:11
没有限制的

作者: dwb123    时间: 2021-7-20 11:53
死循环,没有break不出来
作者: 1686216939    时间: 2021-7-20 11:54
while不是看括号里面是否为真运行的吗,为1就欧克了啊,如果程序问题那就另说了
作者: robinsonlin    时间: 2021-7-20 15:24
dwb123 发表于 2021-7-20 11:53
死循环,没有break不出来

break出来之后呢? 去哪里,重新引导启动么?
作者: 名字不是重点    时间: 2021-7-20 17:47
如要可以,会一直运行到地球毁灭。
作者: rong666    时间: 2021-7-21 00:02
只要你不断电,一直都运行的
作者: 潇潇来了    时间: 2021-7-21 17:38
while是死循环,出不来的,好好检查一下你的程序,是不是哪个地方有bug
作者: wojiaoguogai    时间: 2021-7-22 14:56
你还是看下看门狗吧,理论来说,可以运行到mcu硬件损坏的
作者: jizi    时间: 2021-7-23 11:21
这样的程序建议换成数组去执行
作者: jizi    时间: 2021-7-23 11:22
一来容易修改 和 查看
作者: jizi    时间: 2021-7-23 11:22
而来程序的可观性大大增强
作者: child955    时间: 2021-7-23 11:47
while(1)是没有运行时间限制的
作者: Leoon_Miss    时间: 2021-7-23 14:55
while循环里面是没有时间限制的,应该程序跑飞或者是被中途打断,重启导致的,可以在线调试查找问题。
作者: wfqxgw    时间: 2021-7-24 12:13
楼主.说句真话,别不开心.很久没有看到这么牛的代码了.
风凉话就不多说.目测楼主C语言明显最最基础都还没过关.真的应该重新学一个C语言再玩单片机.不然再玩下去,就是从入门到放弃地.要多看别人的例程.按你这个写法.一看就是人民币玩家.豪!!!
题外话:单片机本身资源就少,要形成了跟它抠资源的习惯.按字节计.能省一点算一点.偶尔用点DELAY(1000)不伤大雅,尽最大可能复用函数.....云云.....


作者: 6620680    时间: 2021-7-24 12:34
加几个变量,运行能快几亿倍!
作者: 00云梦泽00    时间: 2021-7-25 09:41
代码一看,比较整齐 赏心悦目  52 的资源不是很多  多检查一下程序吧 按你的说法程序的问题
作者: 88096599    时间: 2021-7-25 09:52
按理说是可以全部运行的,但while(1)里面的内容不要放太多
作者: hhdsdy    时间: 2021-7-25 10:08
编程思想的问题,单片机编程要学会“投机取巧”,不能死死板板的。
你这个程序是想编写流水灯之类的?你可以看看别人做的流水灯可以跑多久才一个循环?再去看看直接让单片机I/O驱动蜂鸣器播放音乐的程序,一首曲子有多长你也清楚,他们是怎么编写的?
作者: isyido    时间: 2021-7-25 10:24
没有时间限制。估计是很新的新手啊,别气馁,一步步来,会发现编程中提高性能和可靠性的方法的。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1