找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3078|回复: 9
收起左侧

MCU应该如何实现一个毫秒级的延时函数?

[复制链接]
ID:836364 发表于 2020-11-3 20:21 | 显示全部楼层 |阅读模式
大佬们,就是特别想知道你们是咋样弄出一个毫秒级的函数,通过while或者是for循环得到的,能否写的明白一点
回复

使用道具 举报

ID:743654 发表于 2020-11-4 08:48 | 显示全部楼层
延时时间跟晶振有关,
void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        i = 2;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
}

要精确延时需用到定时器
回复

使用道具 举报

ID:420836 发表于 2020-11-4 09:06 | 显示全部楼层
通常可以使用单片机库的delay子例程。
回复

使用道具 举报

ID:743654 发表于 2020-11-4 09:13 | 显示全部楼层
cheney03 发表于 2020-11-4 08:48
延时时间跟晶振有关,
void Delay1ms()                //@11.0592MHz
{

for 循环实现:
void MainDelayMs(unsigned int ms)          //@11.0592MHz
{
        unsigned int  i,j;
        for(i=ms;i>0;i--)
    {
            for(j=500;j>0;j--){}
    }               
}
回复

使用道具 举报

ID:401564 发表于 2020-11-4 11:51 | 显示全部楼层
只要是循环,都是一样的
毫秒级随便就可以的了
如果是STC单片机,直接在下载器那复制就可以了,不同型号的单片机要有不同的选择想要微秒级的,就用汇编
51hei截图20201104115001.jpg

回复

使用道具 举报

ID:514901 发表于 2020-11-4 12:50 | 显示全部楼层
用STC官方的ISP下载器,可以根据你的单片机型号和晶振生成任意延时时间的函数程序
回复

使用道具 举报

ID:836364 发表于 2020-11-4 15:45 | 显示全部楼层
哦,谢谢大佬们了
回复

使用道具 举报

ID:137736 发表于 2020-11-4 17:30 | 显示全部楼层
循环嵌套就行,但不建议用。定时器加标志变量更好。
回复

使用道具 举报

ID:836364 发表于 2020-11-5 08:44 | 显示全部楼层
那定时器不够用咋办??定时器就那么几个,有限的很
回复

使用道具 举报

ID:401564 发表于 2020-11-5 09:18 | 显示全部楼层
123456czst 发表于 2020-11-5 08:44
那定时器不够用咋办??定时器就那么几个,有限的很

在很多情况下,定时器虽然叫""定时"",但很少是用定时器来延时的,它的作用是定时器中断,这才是它的核心
也就是说每过一个时间要做一件事,而且这件事的等级是最高的(可以设定),不管单片机在做什么,都会先停下来,进入中断
或者是外部触发事件之类的,像是测量一个脉冲的长度,这个脉冲随时会来的那种,这就要用到定时器中断,严格叫捕捉,你学到了就会知道了
至于延时,函数就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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