标题: 单片机for延时程序 大神问个初学问题 [打印本页]

作者: we199999    时间: 2023-8-22 18:46
标题: 单片机for延时程序 大神问个初学问题
51单片机void delay (void)
{uint i;
for(i=0;i<25530;i++;);
}
能一条条解释下吗?感谢!!

是什么意思
作者: IdeaMing    时间: 2023-8-22 21:26
for延时
上面的文章讲的很详细

作者: Hephaestus    时间: 2023-8-22 21:31
这已经是最最最基础的c语言问题,连这个都看不懂实在是没有讲解的必要了。
作者: we199999    时间: 2023-8-22 22:34
Hephaestus 发表于 2023-8-22 21:31
这已经是最最最基础的c语言问题,连这个都看不懂实在是没有讲解的必要了。

今天刚学哈哈
作者: cnfloatleaf    时间: 2023-8-22 23:24
void delay (void)    //定义一个子程序, void 没有返回值
{uint i;                  // 定义一个变量,无符号整形数
for(i=0;i<25530;i++;);//一个循环语句,i从0一直加到25530,结束循环
}
作者: we199999    时间: 2023-8-23 00:26
cnfloatleaf 发表于 2023-8-22 23:24
void delay (void)    //定义一个子程序, void 没有返回值
{uint i;                  // 定义一个变量, ...

多谢大佬

作者: we199999    时间: 2023-8-23 00:28
cnfloatleaf 发表于 2023-8-22 23:24
void delay (void)    //定义一个子程序, void 没有返回值
{uint i;                  // 定义一个变量, ...

还有这个麻烦您了。为啥写的这个流水灯只有一个灯亮?就在图片蓝色行delay那里就结束了。进行不了下一步了

IMG20230822235659.jpg (1.94 MB, 下载次数: 66)

IMG20230822235659.jpg

作者: mengzhixinheng    时间: 2023-8-23 07:21
n被不断被初始化了,你这样也不是流水灯的效果
作者: mengzhixinheng    时间: 2023-8-23 07:30
看错了,不好意思
作者: 4091    时间: 2023-8-23 08:26
猜测是delay()函数有问题,把delay函数贴出来看看吧
作者: 蚂蚁上树    时间: 2023-8-23 08:27
we199999 发表于 2023-8-23 00:28
还有这个麻烦您了。为啥写的这个流水灯只有一个灯亮?就在图片蓝色行delay那里就结束了。进行不了下一步 ...

你的delay函数里面都是空的没内容。
void   delay  (uint  ms)
{
unsigned char i, j,m;
   m=ms;
     while(m--)
      {
        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
    }
}
作者: 201936010427    时间: 2023-8-23 10:21
we199999 发表于 2023-8-23 00:28
还有这个麻烦您了。为啥写的这个流水灯只有一个灯亮?就在图片蓝色行delay那里就结束了。进行不了下一步 ...

延时函数有问题,延时函数就是为了让单片机在那里空运行,你现在只定义了一个延时函数,却没有定义延时函数中的循环内容,void delay (void)
{uint i;
for(i=0;i<25530;i++;);
}
作者: we199999    时间: 2023-8-23 11:42
201936010427 发表于 2023-8-23 10:21
延时函数有问题,延时函数就是为了让单片机在那里空运行,你现在只定义了一个延时函数,却没有定义延时函 ...

我看有的教程只有声明,没有定义是怎么做到实现效果呢
作者: we199999    时间: 2023-8-23 11:44
mengzhixinheng 发表于 2023-8-23 07:21
n被不断被初始化了,你这样也不是流水灯的效果

可以的,就是延时我换了个方法就出问题,之前是能实现效果
作者: 1437519750    时间: 2023-8-23 11:57
基本定义/主要内容:该代码段是一个名为"delay"的函数,它没有返回值(void)。函数中包含一个循环,使用一个无符号整数变量i进行计数,循环的次数为25530次。
作者: we199999    时间: 2023-8-23 18:16
蚂蚁上树 发表于 2023-8-23 08:27
你的delay函数里面都是空的没内容。
void   delay  (uint  ms)
{

有的只有声明没定义咋也能运行呢?也没看到宏定义

Screenshot_2023-08-23-00-40-43-63_149003a2d400f6adb210d7e357a3a646.jpg (494.67 KB, 下载次数: 69)

Screenshot_2023-08-23-00-40-43-63_149003a2d400f6adb210d7e357a3a646.jpg

Screenshot_2023-08-23-00-40-10-20_149003a2d400f6adb210d7e357a3a646.jpg (483.15 KB, 下载次数: 66)

Screenshot_2023-08-23-00-40-10-20_149003a2d400f6adb210d7e357a3a646.jpg

作者: 黄youhui    时间: 2023-8-24 09:04
cnfloatleaf 发表于 2023-8-22 23:24
void delay (void)    //定义一个子程序, void 没有返回值
{uint i;                  // 定义一个变量, ...

你就宠着她吧,符号都错了 ++   和 +  +能一样吗

51hei截图_20230824090326.png (17.92 KB, 下载次数: 52)

51hei截图_20230824090326.png

作者: sttt300    时间: 2023-8-24 09:23
we199999 发表于 2023-8-23 18:16
有的只有声明没定义咋也能运行呢?也没看到宏定义

这不可能,可能中间有这个delay函数,你再看看是不是看漏了
或者编译一下,有没有报错
我感觉你不是来问问题的,是来找老师的吧?这也太基础了吧,连入门都不算
作者: yxtao    时间: 2023-8-24 15:07
we199999 发表于 2023-8-23 00:28
还有这个麻烦您了。为啥写的这个流水灯只有一个灯亮?就在图片蓝色行delay那里就结束了。进行不了下一步 ...

第12行有问题,会影响后面的代码

作者: yxtao    时间: 2023-8-24 15:08
we199999 发表于 2023-8-23 11:42
我看有的教程只有声明,没有定义是怎么做到实现效果呢

这种也有延时效果的
作者: we199999    时间: 2023-8-24 17:13
sttt300 发表于 2023-8-24 09:23
这不可能,可能中间有这个delay函数,你再看看是不是看漏了
或者编译一下,有没有报错
我感觉你不是来 ...

刚学,我看了是进行宏定义了
作者: TTQ001    时间: 2023-8-25 07:03
延时的for循环就是对设定的计数进行计数,直到计数完毕。
作者: joyb    时间: 2023-8-25 14:32
51单片机利用for语句嵌套实现简单的延时1s功能

名词解释:

(1)时钟周期。定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟周期大约就是1/12μs。

(2)机器周期。单片机的基本操作周期,STC89C51系列的单片机来说,一个机器周期由12个时钟周期组成,也就是1μs。

(3)指令周期。指的是单片机执行一条指令需要的时间,一个指令周期需要1~4个机器周期。一个for循环需要8个指令周期。

假设单片机采用了12MHz的时钟频率,利用for语句嵌套实现简单的延时1s功能。

unsigned int i;

Unsigned char j; //定义两个循环变量i、j

for (i = 1000; i > 0; i--) //外层循环1000次

for (j = 124; j > 0; j--) ; //内层循环124次

内层循环代码含义:

在12MHz的时钟频率下,for循环124次所消耗的时间ntime是:

ntime= 124次 × 8个指令周期 × 1μs = 992μs

也就是内循环延时大概为1ms。

那么,全部执行完成花费的总时间T大约是:

T = 1000 × ( ntime + 8 × 1 ) = 1000 ms=1s,基本上达到延时1s的功能。这个延时程序中外层循环的变量是多少,整个for嵌套语句就延时大约多少毫秒,在以后的应用当中,会经常用到这个程序进行不需要精确时间的延时。

比如,要实现4s的延时,就把i=1000修改为i=4000就可以了。
作者: deer233    时间: 2023-8-27 21:34
定义1个无符号的整型变量i,
作者: deer233    时间: 2023-8-27 21:35
// 使用for循环来实现延迟 for(i=0; i<25530; i++) // 循环次数为25530次 {     // 空循环,不执行任何操作 }
作者: liucan2020    时间: 2023-8-28 16:34
还是买个开发板  我看看教程

作者: Snowmaker    时间: 2023-8-30 10:28
we199999 发表于 2023-8-23 00:28
还有这个麻烦您了。为啥写的这个流水灯只有一个灯亮?就在图片蓝色行delay那里就结束了。进行不了下一步 ...

这个可能是delay函数出问题了吧
作者: sj820224    时间: 2023-8-30 15:13

延时的for循环就是对设定的计数进行计数,直到计数完毕。
作者: rayin    时间: 2023-8-31 07:18
for(i=0;i<25530;i++;) ;这条语句里i++;多了一个;




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