51单片机C语言us级延时函数
转载自:https://blog.csdn.net/shawsun/article/details/24560255
Shawsun 2014-04-26 23:34:21
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。
一. 500ms延时子程序
程序:
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
计算分析:
程序共有三层循环
一层循环n:R5*2 = 81*2 = 162us DJNZ 2us
二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us
三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us
循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us
延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5
二. 200ms延时子程序
程序:
void delay200ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
三. 10ms延时子程序
程序:
void delay10ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
四. 1s延时子程序
程序:
void delay1s(void)
{
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
共有三条延时函数说明如下:
函数调用分两级:一级是小于10US的延时,二级是大于10US的延时
//====================小于10US的【用1US级延时】====================
//----------微秒级延时---------
for(i=X;i>X;i--) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255)
//================大于10US<小于21.9955Ms的可用【10US级延时函数】===========
void Delay10us(uchar Ms)
{
uchar data i;
for(;Ms>0;Ms--)
for(i=26;i>0;i--);
}
i=[(延时值-1.75)*12/Ms-15]/4
如想延时60US则 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;
如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--) 共延时64US
四. 1s延时子程序
程序:
void delay1s(void)
{
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
共有三条延时函数说明如下:
函数调用分两级:一级是小于10US的延时,二级是大于10US的延时
//====================小于10US的【用1US级延时】====================
//----------微秒级延时---------
for(i=X;i>X;i--) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255)
//================大于10US<小于21.9955Ms的可用【10US级延时函数】===========
void Delay10us(uchar Ms)
{
uchar data i;
for(;Ms>0;Ms--)
for(i=26;i>0;i--);
}
i=[(延时值-1.75)*12/Ms-15]/4
如想延时60US则 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;
如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--) 共延时64US
————————————————
版权声明:本文为CSDN博主「Shawsun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shawsun/article/details/24560255
51单片机C语言us级延时函数相关推荐
- 51单片机:生成精准的软件延时函数——以STC8演示
目录 一.延时函数的基本结构 二.计算延时函数的变量 三.C11 代码实现 1.main.c 2.delay.c 3.delay.h 4.说明 四.代码下载--Github 毕业设计涉及IOT的内容, ...
- 51单片机应用定时器实现精准延时函数的封装
#include <STC89C5xRC.H>typedef unsigned char u8; typedef unsigned int u16; sbit led = P2^0; bi ...
- 51c语言延时作用,51单片机C语言延时函数怎么定义和使用
描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...
- 单片机独立式按键c语言程序,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询)...
(原创)51单片机C语言程序设计--速学教程实例(入门篇)之独立按键(查询) /************************************************************ ...
- 51单片机c语言编程100,51单片机C语言编程100例.doc
51单片机C语言编程100例.doc 目 录实例3用单片机控制第一个灯亮3实例4用单片机控制一个灯闪烁认识单片机的工作频率3实例5将 P1口状态分别送入P0.P2.P3口认识I/O口的引脚功能4实例6 ...
- 矩阵键盘逐行扫描C语言,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf...
(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf /***************************************************** ...
- 51单片机c语言试题及答案,单片机考试复习题及答案
<单片机考试复习题及答案>由会员分享,可在线阅读,更多相关<单片机考试复习题及答案(14页珍藏版)>请在人人文库网上搜索. 1.选择题1.主频为12MHz的单片机他的机器周期为 ...
- 51单片机蜂鸣器演奏《小苹果》C语言程序,51单片机C语言蜂鸣器发声生日快乐播放程序...
<51单片机C语言蜂鸣器发声生日快乐播放程序>由会员分享,可在线阅读,更多相关<51单片机C语言蜂鸣器发声生日快乐播放程序(4页珍藏版)>请在人人文库网上搜索. 1.按键发音/ ...
- 单片机c语言100例 的案例,51单片机C语言100个实例 [推荐下载】
51单片机c语言100例 ,墙裂推荐下载 附上目录 ************************************************************函数的使用和熟悉****** ...
- 51单片机C语言程序100例分析(1)IO+C语言+头文件
51单片机C语言程序100例分析(1)IO+C语言+头文件 \\\插播一条:文章末尾有惊喜哟~/// P1=0xfe;//P1=11111110B,即P1.0输出低电平} 分析:通过这短短的几行代码 ...
最新文章
- java EE map
- 探索 dotnet core 为何在 Windows7 系统需要补丁的原因
- 在windows上使用go编译dll文件,供C++调用
- 方法超出 android,Android工程方法数超过64k,The number of method references in a .dex file cannot exceed 64K....
- 基于JAVA+SpringMVC+Mybatis+MYSQL的企业费用信息管理系统
- Gsoap在QT工程里如何调用
- DFX 9.303 for QQMusic 2010
- 「JavaScript面向对象编程指南」闭包
- vc++播放wav声音
- MATLAB 简单神经网络案例
- Newton形式的Hermite插值多项式
- froala 的使用
- 进度类计算_PERT
- 3-Coloring(奇偶涂色)
- Windows开发:鼠标操作
- 《途客圈创业记:不疯魔,不成活》一一2.4 与iWeekend再续前缘
- JQuery简单使用
- 教你使用Python从零开始搭建一个区块链项目!
- Java项目框架搭建系列(Java学习路线)-博客提纲 (转自一位技术大佬)
- 笔记摘抄div+css
热门文章
- 三步生活法:土豆(Todo),优势,庆祝
- 获取网站icon图标
- 【校内互侧】ZYF loves qaq (找规律+递推)
- 无线网卡插到服务器 没有反应,无线网卡插上没反应怎么办
- mat java_使用MAT分析Java内存
- 计算机CPU风扇的功能及作用,CPU和风扇之间涂的是什么东西
- 嵌入式设计 | 基于51单片机的tea5767收音机设计实操教程
- python二手房数据分析_使用python抓取分析链家网二手房数据
- 求解Catalan数,(大数相乘,大数相除,大数相加)
- Linux 基础之基础网络ss命令