7

只需两步便可生成 51 单片机最精准的延时函数 - main工作室

 1 year ago
source link: https://www.cnblogs.com/main-studio/p/17059320.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

我们在学习 51 单片机的过程中会用到延时,比如一个简单的流水灯就需要延时来控制依次点亮的时间,或者一些模块在单片机发出读数据指令后,需要延时几十微秒才可以读出数据等等,这些都离不开延时,所以我们需要一个精准的延时函数来满足我们的需求。

本篇介绍一个最简单并且延时最精准的 51 单片机延时函数的生成方法。

STC-ISP

我们说学习 51 单片机,大部分学习的都是国产的 STC89C51 单片机,我就是从这款单片机入门的。

STC89C51 是 STC 这家公司研发生产的,同时 STC 提供了一个下载编程烧录软件——STC-ISP,这款软件可是一个好东西,不会有朋友只用它来下载程序吧?

它有好多强大且实用的功能,本篇介绍一下它的软件延时计算器功能。

进入 STC 官网,将页面向下就可以找到下载链接啦。

STC 官网 >> 点击跳转

dqTLODSHQUcevYj.png

打开软件,找到“ 软件延时计算器 ”,设置参数后,点击生成代码后复制即可。

注意:设置的参数一定要和使用的单片机参数相匹配。

9yLWoHq2AIBeUmT.png
void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

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

上面是我从软件中生成复制的代码,软件已经自动生成了一个函数供我们调用,短短几步就做好了一个延时函数,确实不错。

但这个函数在调用时只能延时 1ms ,如果说我想延时 2ms、3ms、4ms... 难道要不停的调用函数吗?或者再去软件中生成新的延时函数?那岂不是很麻烦。

其实不必这样,我们只需简单的优化一下代码,就可以实现我们想要的功能。

更改思路如下:

软件所生成的函数是延时 1ms,就是说单片机执行这个函数的程序体时用时为 1ms

理解这个以后,我们便可以优化程序啦。

首先我们用 while 循环把程序体框住,然后每执行一次让控制 while 循环结束的变量减一,这个变量我们通过形参传递到函数中。

注意:当使用 _nop_() 函数(可理解为软件延时)时,必须在开头添加头文件 #include <intrins.h>

_nop_() 函数相当于一个空操作(可以理解为 NOP 空操作指令),而 _nop_() 函数的空操作产生的时间与晶振有关,所以在上文中设置参数要与使用的单片机参数相匹配。

优化后的代码如下:

#include <intrins.h>

void Delay1ms(unsigned int _ms)		//@11.0592MHz
{
    unsigned char i, j;

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

经过我们优化后的延时函数在调用时极其简单,只需在调用函数的语句中放入实参就好啦。

调用演示代码如下:

#include <reg52.h>
#include <intrins.h>

void Delay1ms(unsigned int _ms);        /* 声明延时函数 */

void main()
{
    Delay1ms(1);        /* 实参为 1,则延时 1ms */

    Delay1ms(20);       /* 实参为 20,则延时 20ms */

    Delay1ms(500);      /* 实参为 500,则延时 500ms */

    /* ...... */
}


void Delay1ms(unsigned int _ms)		//@11.0592MHz
{
    unsigned char i, j;

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

至此,51 单片机的延时函数就编写完成啦, 快去试着生成一个延时函数,将它应用到你的项目当中吧。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK