学习笔记 51单片机通用软件延时方法

news/2025/3/16 5:50:36/

对于STC51单片机来说,延时函数,想必都不陌生。而用的最多的延时基本都是通过软件方法实现的,但由于STC51不同系列的芯片所采用的指令集不同,各指令执行所用机器周期不同。例如STC12Cx的一个振荡周期=一个机器周期,相对STC89Cx的(12个振荡周期=一个机器周期)运行速度快了近10倍有余,就不能用同一个延时函数。

1. STC指令集(版本)

STC_Y1 :
STC89Cx/STC90Cx
STC89LEx/STC90LEx
STC_Y3 :
STC12Cx/STC12LEx
STC11Fx/STC11Lx/ STC10Fx/STC10Lx
STC15F104E/ STC15L104E(A版)
STC15F204EA/ STC15L204EA(A版)
STC_Y5 :
STC15Fxx/STC15Lxx
其中不包含:STC15F104E/STC15L104E (A版) 和 STC15F204EA/STC15L204EA(A版)
STC_Y6 :
STC8F/ STC8A/ STC8G/ STC8H
不同指令集下部分指令的时钟周期对比
通过STC官方提供的 软件STC-ISP可见,不同指令集版本下同一条指令执行所用时钟周期是不同的。因此可能你编写的软件延时函数就不能通用。

2. STC-ISP 软件生成延时函数

在这里插入图片描述
可以看到,这种方法还是比较可靠的,也是软件延时比较精确的一种,但是呢我比较喜欢那种想延时多久,给个参数就完了的不专业方法,于是呢就在这个软件生成的基础上进行了点小操作,让它具有通用性,不管是Y1,Y3还是Y5一个函数搞定。

2. STC-Y1/ Y3/ Y5 通用软件延时

首先为了做指令集区分,delay.h写法如下:其中包括了一些常用数据类型的定义,后续为了做通用库函数开发用。

// delay.h 文件
//       根据芯片型号 选择对应指令集 用于软件延时 区分
/* ==========================================================*     STC_Y1 : STC89Cx/STC90Cx  STC89LEx/STC90LEx *    *     STC_Y3 : STC12Cx/STC12LEx STC11Fx/STC11Lx/STC10Fx/STC10Lx *     			STC15F104E/STC15L104E(A版) *    			STC15F204EA/STC15L204EA(A版)*    *     STC_Y5: STC15Fxx/STC15Lxx *    	不包含:STC15F104E/STC15L104E (A版) *             和 STC15F204EA/STC15L204EA(A版)* ==========================================================*/
//#define _STC_Y1     
#define _STC_Y3    //测试芯片型号 : STC12C5A60S2
//#define _STC_Y5#include "intrins.h"  //包含移位运算和空指令头文件#ifndef _TYPE_H
#define _TYPE_Htypedef   signed char		   s8;          
typedef   unsigned char		   u8;        
typedef  signed   int          s16; 	      
typedef  unsigned int          u16;	     
typedef  signed   long int     s32;   
typedef  unsigned long int     u32;	
#endif

接下来是delay.c文件的写法,这里我主要使用C语言预编译指令的方法:

/**************************************************** 文件说明:STC51单片机通用软件延时函数* 本程序适用于STC除8以外系列外的单片机* 作 者:Guard_Byte* 时 间:2022-05-08**************************************************/
#include "delay.h" #ifdef _STC_Y1
/******************************************************************* 函数名:delay_ms(unsigned int m)* 说  明: ms 延时函数初始化* 晶 振 :@11.0592MHz*****************************************************************/
void delay_ms(u16 m)
{ unsigned char i, j;for(m; m>0; m--){	i = 2;j = 199;do{while (--j);} while (--i);}
}
#endif   /*  条件 _STC_Y1  完 */#ifdef _STC_Y3
/******************************************************************* 函数名:delay_ms(unsigned int k)* 说  明: ms 延时函数初始化* 晶 振 :@11.0592MHz*****************************************************************/
void delay_ms(u16 m)
{ unsigned char i, j;for(m; m>0; m--){	_nop_(); //1usi = 11,j = 190;do	//1ms延时{while (--j);} while (--i);}
}/******************************************************************* 函数名:delay_us(unsigned int k)* 说  明:u us 延时函数初始化* 晶 振 :@11.0592MHz*****************************************************************/
void delay_us(u16 u)
{ for(u;(u-1)>0;u--){	_nop_();	//1us延时,  大约1us 由于循环赋值耗时,值越大 误差越大}
}
#endif   /*  条件 _STC_Y3 完 */#ifdef _STC_Y5
/******************************************************************* 函数名:delay_ms(unsigned int m)* 说  明: ms 延时函数初始化* 晶 振 :@11.0592MHz*****************************************************************/
void delay_ms(u16 m)
{ unsigned char i, j;for(m; m>0; m--){	_nop_();_nop_();
//		_nop_(); //考虑循环耗时i = 11;j = 190;do{while (--j);} while (--i);}
}/******************************************************************* 函数名:delay_us(unsigned int u)* 说  明:u us 延时函数初始化* 晶 振 :@11.0592MHz*****************************************************************/
void delay_us(u16 u)
{ for(u;u>0;u--){	_nop_();	//1us延时_nop_();
//	_nop_();}
}
#endif   /*  条件 _STC_Y5 完 */

总结:

这种软件延时的方法基本可以满足不同型号STC51单片机,但是由于没有经过精确计算函数调用和循环等一些指令的时间,如果延时参数过大 可能存在us到ms的误差,但是对于,对时间没有太高要求的任务,或者学习使用是没有问题的。经过简单测试,在STC89C52RC和STC12C5A60S2S上,500ms延时误差在几十微秒,还算可以接受。学习笔记 经供参考,大家有更精确的软件延时办法还望指正!


http://www.ppmy.cn/news/433729.html

相关文章

还原永恒之蓝下载器PS脚本混淆

注意:以下代码为真实永恒之蓝木马下载器恶意ps代码,请不要在真实机运行、测试以及调试!!! 下面代码取自该病毒设置的计划任务 powershell.exe -nop -ep bypass -e SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUA…

蓝桥杯单片机学习(三)——动态数码管

一.还是上原理,主要讲动态数码管。 数码管这一块都在图纸的一个地方,真棒。迎面而来最左边的呢,就是Y6C和Y7C,是不是很眼熟。对,和前面的Y4C,Y5C一样,都是由老朋友HC138译码器控制的&#xff0…

mac-python包安装错误 [Errno 1] Operation not permitted: '/var/folders/5n/vbm997m56xg3kw67y6bccn2m0000gn/T

问题信息: [Errno 1] Operation not permitted: /var/folders/5n/vbm997m56xg3kw67y6bccn2m0000gn/T/pip-4tcBsd-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy-1.8.0rc1-py2.7.egg-info 这个问题在numpy、scipy以及…

android新建项目报错:Error Could not open proj remapped class cache for 8y6fc

报错提示:不能为(路径下的文件)打开项目重映射缓存类,试着删除该路径下的文件,rebuild还是不行。 解决办法:打开工程目录下的 gradle/wrapper/gradle-wrapper.properties/distributionUrlhttps://services.…

g54y6huj6yh

中国人工智能大会 CSDN学院 极客头条 AWS Swift 智能blog520pi硬件 移动游戏 推荐频道 

【MYD-Y6ULX试用体验】Linux开发从零到一

前言 作为一名初次体验到Linux开发板的小白,我将一步步探索学习这款基于NXP i.MX 6UL/6ULL嵌入式处理器的开发板,逐步的从硬件认识到系统了解,这里记录一下自己的开发过程。 硬件环境 一、硬件环境 1.1准备工作 12V 电源适配器 &#xf…

[附源码]计算机毕业设计Python+uniapp美容院客户预约微信小程序的设计与实现4y6te(程序+lw+远程部署)

[附源码]计算机毕业设计Pythonuniapp美容院客户预约微信小程序的设计与实现4y6te(程序lw远程部署) 该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行环境配置: Python3.7.7DjangoMysql5.7pip listHBuilderX(Vscode也行&…

Y6-4Cl|cas2447642-40-0|Y7, BTP-4Cl

Y6-4Cl|cas2447642-40-0 CAS号:2447642-40-0 英文名称:Y6-EH-4Cl 英文同义词:Y6-4Cl;Y6-EH-4Cl;Y7/BTP-4Cl;Y6-EH-4Cl,Y7 中文名称:Y6-EH-4Cl 中文同义词:Y6-4CLCBNumber:CB08066303 分子式:C82H86Cl4N8O2S5 Product No: LT-S9491 Product Name&#xff1a…