已参加过一次蓝桥杯,在此分享经验且再次进步。
一 ,打开STC-ISP软件---找到软件延时计算器,按照以下我给参数进行修改。
注意哦!这个在考场上是可以直接使用的。
二 ,优化延时函数
void Delay1ms(void) //@11.0592MHz
{
unsigned char data i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
生成的代码具有局限性
上面是我从软件中生成复制的代码,软件已经自动生成了一个函数供我们调用,短短几步就做好了一个延时函数,确实不错。
但这个函数在调用时只能延时 1ms ,如果说我想延时 2ms、3ms、4ms... 难道要不停的调用函数吗?或者再去软件中生成新的延时函数?那岂不是很麻烦。
其实不必这样,我们只需简单的优化一下代码,就可以实现我们想要的功能。
一步使代码变万能
软件所生成的函数是延时 1ms,就是说单片机执行这个函数的程序体时用时为 1ms,那么首先我们用 while 循环把程序体框住,然后每执行一次让控制 while 循环结束的变量减一,这个变量我们通过形参传递到函数中。
注意:当使用 _nop_() 函数(可理解为软件延时)时,必须在开头添加头文件 #include <intrins.h>。
优化后的代码如下:
void Delay1ms(unsigned int _ms) //@11.0592MHz
{
unsigned char data 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 单片机的延时函数就编写完成啦, 快去试着生成一个延时函数,将它应用到你的项目当中吧。