社区导航

 

搜索
查看: 460|回复: 9

[求助] 单片机中delay的问题

[复制链接]

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-3-10 14:54 | 显示全部楼层 |阅读模式

本人单片机小白一名,之前在写程序的时候,老师提到,我程序中的delay太多,无法放到实际中去运用。给我推荐了vt_time的方式,采用定时器去做计时。

我这边写了段亮灯程序

void main()

{

        system_init();

        while(1)

        {

                led_display();                                      //灯翻转程序

                vtimer_set(&vt_led, 2000);                //设定间隔时间
                while (!vtimer_expired(&vt_led));      //判断是否到时间

        }

}

 

请问这么写可以么,我感觉我写的思路和delay是一样的没区别,单片机在处理的时候会有什么不一样的地方么?单片机在处理该段定时的时候,仍处于空转的状态吧?

此帖出自51单片机论坛

回复

使用道具 举报

9960

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2020-3-10 15:23 | 显示全部楼层

delay采用单片机循环等待方式,是一种阻塞机制,系统在delay状态下不能处理其它任务,所以效率低。

 

使用RTOS或者定时器,只有在达到设定时间,才执行对应任务,就可以分时执行多个任务了。

点评

那我这么写是不是还是就等于用的delay啊。灯亮了,等待时间,等时间到了才去执行下一步,灯翻转。。  详情 回复 发表于 2020-3-10 15:29

回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2020-3-10 15:29 | 显示全部楼层
dcexpert 发表于 2020-3-10 15:23 delay采用单片机循环等待方式,是一种阻塞机制,系统在delay状态下不能处理其它任务,所以效率低。 &nbs ...

那我这么写是不是还是就等于用的delay啊。灯亮了,等待时间,等时间到了才去执行下一步,灯翻转。。

点评

没错,实际上跟delay区别不大  详情 回复 发表于 2020-3-10 17:10

回复

使用道具 举报

1419

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2020-3-10 17:10 | 显示全部楼层
o景天o 发表于 2020-3-10 15:29 那我这么写是不是还是就等于用的delay啊。灯亮了,等待时间,等时间到了才去执行下一步,灯翻转。。

没错,实际上跟delay区别不大

点评

那想请教一下,像是按键检测里面,那个delay'(消抖)该怎么去掉呢。怎么去写呢。还有这个led我这样写是否会好一点? if ((vtimer_expired(&vt_led))        &nbs  详情 回复 发表于 2020-3-10 17:37

回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2020-3-10 17:37 | 显示全部楼层
sint27 发表于 2020-3-10 17:10 没错,实际上跟delay区别不大

那想请教一下,像是按键检测里面,那个delay'(消抖)该怎么去掉呢。怎么去写呢。还有这个led我这样写是否会好一点?
if ((vtimer_expired(&vt_led))                 //超时返回1

{

       led_display();                                      //灯翻转程序

       vtimer_set(&vt_led, 2000);                //设定间隔时间

}

点评

可以用定时器,时间片的框架去做,比如每隔5ms检测一次按键,连续几次之后确认按键有效  详情 回复 发表于 2020-3-11 07:59
这个可以  详情 回复 发表于 2020-3-10 21:13

回复

使用道具 举报

1万

TA的帖子

143

TA的资源

版主

Rank: 6Rank: 6

技术导师勋章

发表于 2020-3-10 18:54 | 显示全部楼层

Delay指令是用于很短的延时,较长、很长的延时应该用定时器做,这样MCU还可以去处理其它任务或进入低功耗状态。

上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

使用道具 举报

3574

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2020-3-10 21:13 | 显示全部楼层
o景天o 发表于 2020-3-10 17:37 那想请教一下,像是按键检测里面,那个delay'(消抖)该怎么去掉呢。怎么去写呢。还有这个led我这样 ...

这个可以


回复

使用道具 举报

1419

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2020-3-11 07:59 | 显示全部楼层
o景天o 发表于 2020-3-10 17:37 那想请教一下,像是按键检测里面,那个delay'(消抖)该怎么去掉呢。怎么去写呢。还有这个led我这样 ...

可以用定时器,时间片的框架去做,比如每隔5ms检测一次按键,连续几次之后确认按键有效

点评

一般我超过10个us就不用延时  详情 回复 发表于 2020-3-11 08:11

回复

使用道具 举报

1656

TA的帖子

4

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

荣誉会员勋章

发表于 2020-3-11 08:11 | 显示全部楼层
sint27 发表于 2020-3-11 07:59 可以用定时器,时间片的框架去做,比如每隔5ms检测一次按键,连续几次之后确认按键有效

一般我超过10个us就不用延时


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-3-25 13:01 | 显示全部楼层
o景天o 发表于 2020-3-10 17:37 那想请教一下,像是按键检测里面,那个delay'(消抖)该怎么去掉呢。怎么去写呢。还有这个led我这样 ...

能说下方法嘛

 

image-20200325130055-1.png

回复

使用道具 举报

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

关闭

站长推荐上一条 1/6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-3-30 00:04 , Processed in 0.304807 second(s), 20 queries , Gzip On, MemCache On.

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