找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2562|回复: 28
打印 上一主题 下一主题
收起左侧

单片机for延时程序 大神问个初学问题

  [复制链接]
跳转到指定楼层
楼主
ID:1091757 发表于 2023-8-22 18:46 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
51单片机void delay (void)
{uint i;
for(i=0;i<25530;i++;);
}
能一条条解释下吗?感谢!!

是什么意思
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:276663 发表于 2023-8-22 21:26 | 只看该作者
for延时
上面的文章讲的很详细
回复

使用道具 举报

板凳
ID:883242 发表于 2023-8-22 21:31 | 只看该作者
这已经是最最最基础的c语言问题,连这个都看不懂实在是没有讲解的必要了。
回复

使用道具 举报

地板
ID:1091757 发表于 2023-8-22 22:34 来自手机 | 只看该作者
Hephaestus 发表于 2023-8-22 21:31
这已经是最最最基础的c语言问题,连这个都看不懂实在是没有讲解的必要了。

今天刚学哈哈
回复

使用道具 举报

5#
ID:1085441 发表于 2023-8-22 23:24 | 只看该作者
void delay (void)    //定义一个子程序, void 没有返回值
{uint i;                  // 定义一个变量,无符号整形数
for(i=0;i<25530;i++;);//一个循环语句,i从0一直加到25530,结束循环
}
回复

使用道具 举报

6#
ID:1091757 发表于 2023-8-23 00:26 来自手机 | 只看该作者
cnfloatleaf 发表于 2023-8-22 23:24
void delay (void)    //定义一个子程序, void 没有返回值
{uint i;                  // 定义一个变量, ...

多谢大佬
回复

使用道具 举报

7#
ID:1091757 发表于 2023-8-23 00:28 来自手机 | 只看该作者
cnfloatleaf 发表于 2023-8-22 23:24
void delay (void)    //定义一个子程序, void 没有返回值
{uint i;                  // 定义一个变量, ...

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

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

IMG20230822235659.jpg
回复

使用道具 举报

8#
ID:89515 发表于 2023-8-23 07:21 来自手机 | 只看该作者
n被不断被初始化了,你这样也不是流水灯的效果
回复

使用道具 举报

9#
ID:89515 发表于 2023-8-23 07:30 来自手机 | 只看该作者
看错了,不好意思
回复

使用道具 举报

10#
ID:1061404 发表于 2023-8-23 08:26 | 只看该作者
猜测是delay()函数有问题,把delay函数贴出来看看吧
回复

使用道具 举报

11#
ID:899081 发表于 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);
    }
}
回复

使用道具 举报

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

延时函数有问题,延时函数就是为了让单片机在那里空运行,你现在只定义了一个延时函数,却没有定义延时函数中的循环内容,void delay (void)
{uint i;
for(i=0;i<25530;i++;);
}
回复

使用道具 举报

13#
ID:1091757 发表于 2023-8-23 11:42 来自手机 | 只看该作者
201936010427 发表于 2023-8-23 10:21
延时函数有问题,延时函数就是为了让单片机在那里空运行,你现在只定义了一个延时函数,却没有定义延时函 ...

我看有的教程只有声明,没有定义是怎么做到实现效果呢
回复

使用道具 举报

14#
ID:1091757 发表于 2023-8-23 11:44 来自手机 | 只看该作者
mengzhixinheng 发表于 2023-8-23 07:21
n被不断被初始化了,你这样也不是流水灯的效果

可以的,就是延时我换了个方法就出问题,之前是能实现效果
回复

使用道具 举报

15#
ID:1091796 发表于 2023-8-23 11:57 | 只看该作者
基本定义/主要内容:该代码段是一个名为"delay"的函数,它没有返回值(void)。函数中包含一个循环,使用一个无符号整数变量i进行计数,循环的次数为25530次。
回复

使用道具 举报

16#
ID:1091757 发表于 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, 下载次数: 14)

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

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

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

使用道具 举报

17#
ID:592807 发表于 2023-8-24 09:04 | 只看该作者
cnfloatleaf 发表于 2023-8-22 23:24
void delay (void)    //定义一个子程序, void 没有返回值
{uint i;                  // 定义一个变量, ...

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

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

51hei截图_20230824090326.png
回复

使用道具 举报

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

这不可能,可能中间有这个delay函数,你再看看是不是看漏了
或者编译一下,有没有报错
我感觉你不是来问问题的,是来找老师的吧?这也太基础了吧,连入门都不算
回复

使用道具 举报

19#
ID:596109 发表于 2023-8-24 15:07 | 只看该作者
we199999 发表于 2023-8-23 00:28
还有这个麻烦您了。为啥写的这个流水灯只有一个灯亮?就在图片蓝色行delay那里就结束了。进行不了下一步 ...

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

使用道具 举报

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

这种也有延时效果的
回复

使用道具 举报

21#
ID:1091757 发表于 2023-8-24 17:13 来自手机 | 只看该作者
sttt300 发表于 2023-8-24 09:23
这不可能,可能中间有这个delay函数,你再看看是不是看漏了
或者编译一下,有没有报错
我感觉你不是来 ...

刚学,我看了是进行宏定义了
回复

使用道具 举报

22#
ID:420836 发表于 2023-8-25 07:03 | 只看该作者
延时的for循环就是对设定的计数进行计数,直到计数完毕。
回复

使用道具 举报

23#
ID:1064915 发表于 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就可以了。
回复

使用道具 举报

24#
ID:1092048 发表于 2023-8-27 21:34 | 只看该作者
定义1个无符号的整型变量i,
回复

使用道具 举报

25#
ID:1092048 发表于 2023-8-27 21:35 | 只看该作者
// 使用for循环来实现延迟 for(i=0; i<25530; i++) // 循环次数为25530次 {     // 空循环,不执行任何操作 }
回复

使用道具 举报

26#
ID:1040201 发表于 2023-8-28 16:34 | 只看该作者
还是买个开发板  我看看教程
回复

使用道具 举报

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

这个可能是delay函数出问题了吧
回复

使用道具 举报

28#
ID:1092275 发表于 2023-8-30 15:13 | 只看该作者

延时的for循环就是对设定的计数进行计数,直到计数完毕。
回复

使用道具 举报

29#
ID:517951 发表于 2023-8-31 07:18 | 只看该作者
for(i=0;i<25530;i++;) ;这条语句里i++;多了一个;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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