51c语言延时程序怎么编写,C51中延时程序的编写
众所周知,在编程时很难掌握程序运行的时间,所以编写时很难做到很精确,解决的方式有插入汇编语句,但总觉得汇编用起来不是那么顺手,还可以用定时器来做,但只是一个很小的延时程序而已,不必小题大作。其实办法还是有的,下面介绍一下常用的几种延时程序。
1、us级延时程序
常用的一个函数如下:
void delayus(unsigned char x)
{ while(--x) ;
}
生成的汇编代码为:
C:0x001C 7F0A MOV R7,#0x0A //2us
C:0x001E 12003E LCALL delayus(C:003E) // 2us
C:0x003E DFFE DJNZ R7,delayus(C:003E) //2x us
C:0x0040 22 RET // 1us
所以调用一次函数延时时间为 ( 2x+5 )us ,可以用来延时大于5us的时间。
注意的是x要是unsigned char 类型,且 --x 不能写成x-- ,否则汇编代码会有一大串:C:0x001C 7F02 MOV R7,#0x02
C:0x001E 120032 LCALL delayus(C:0032)
C:0x0032 AE07 MOV R6,0x07
C:0x0034 1F DEC R7
C:0x0035 EE MOV A,R6
C:0x0036 70FA JNZ delayus(C:0032)
C:0x0038 22 RET
因为汇编中的DJNZ 语句是先减一再判断的,和-xx的算法一致,所以--x和x--相差了很多。上述函数只适合x的范围是0-255,如果需要延时大于255*2+5us,则可以连续调用几次函数。
2、ms的延时程序
常用的一个函数:
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i=0;i<125;i++){;}
}
}
我们来看一下它的精度如何
x us
1 1024
5 5076
10 10141
50 50661
100 101311
可见,精度不“精”,随着x值的增大,延时误差越大,只适合在延时不要求很准确的地方使用。于是想到对程序进行一些修改,想到125是不是取的太大了,假如把它变为可变,不同的x值取值不同,就可以对延时时间进行一些修正,把程序改为如下:
void delayms(unsigned int x,unsigned char y)
{
unsigned char j;
while(x--)
{
for(j=0;j
}
}
对不同的延时时间取不同的y值,发现一个“怪”现象,当取y=123时,延时时间的误差是一个固定值:
x us
1 1017
2 2016
5 5016
10 10016
50 50016
100 100016
除了x=1外,其余的误差都为16us, 即不管x为多大都只有16us的误差,精度大幅度提高,可以满足大多数的需要!
51c语言延时程序怎么编写,C51中延时程序的编写相关推荐
- 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1 使用定时器/计数器实现精确延时 ...
- c语言实数的存放形式,C51中float定义的实数存放形式
C51中的浮点数采用IEEE-754标准来表示,存储长度为4个字节,其中包含3个位域:数符,阶码和尾数. (1)1位数符位:D31 (2)8位阶码:D30----D23(补码形式存放),其中D30是符 ...
- 怎么让程序后台运行_CPU中的程序是怎么运行起来的?
1CPU的硬件最小原子 计算机从上世纪四十年代发展到现在有八十多年了,我们现在开发应用以及很少会涉及到底层的部分,硬件设计的电子专业在学校里面会学习模电数电这两门课,今天的第一部分就从这里说起. 一般 ...
- 在JAVA中 以下程序_在Java中,以下程序的输出结果是()_学小易找答案
[单选题]运行以下Java代码,说法正确的是( ). [单选题]在Java中,以下程序的输出结果是() [单选题]利用"出声"的方式向学生展示教师分析问题的过程与方法的教学方法是_ ...
- c语言程序如何在keil中运行,keil c51中C程序的启动过程
汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接.下面看看它和main()函数是 ...
- C语言软件怎么运行C51文件,keil c51中C程序的启动过程
函数的入口地址,如何调用汇编函数,c和汇编的混合编程 /*******************************************************************/ c函数 ...
- 去除程序名称 去除程序属性详细信息中的程序名称 创建时间等信息
文件右键属性 想去掉下图中的信息 开始操作 再次查看发现已经删除掉了 程序名称 教程至此结束
- 计算机运行命令如何关闭应用程序,如何禁止电脑中某些程序的运行
windows并没有一个简单的软件,能禁止那些不想让别人使用的程序,但是它本身有这个功能的,要做到也不难.那就是启用"不要运行指定的Windows应用程序"策略 .在组策略中有一条 ...
- c51语言 延时程序值怎么算,C51的延时计算
C语言的延时计算 今天碰到这个问题,想想大家也可能用得上,就转过来了,希望对大家有用 C51中精确的延时与计算的实现 C51由于其可读性和可移植性很强,在单片机中得到广泛的应用, 但在某些时候由于C5 ...
- 51c语言延时作用,51单片机C语言延时函数怎么定义和使用
描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...
最新文章
- JSP获得客服端MAC地址
- Linux 内核中的 Device Mapper 机制
- 娱乐社交,玩票大的!2021网易云信“融合通信开发者大赛”决赛名单公布!
- 世界上最遥远的距离(泰戈尔)
- MATLAB中BP神经网络用于回归拟合算法实现(另附GRNN代码)
- ASP.NET MVC中如何在客户端进行必要的判断
- Spring Boot 永远滴神!10分钟快速入门
- 区块链 以太坊 solidity 如何比较2个字符串相等
- 2.4GHz频段天线的选择
- 趣学Python 教孩子学编程pdf
- 英媒:俄黑客靠窃密跻身“成功企业家” 被捕时昏迷
- 华为手机文档里的html,华为手机如何扫描文件变成文档 这扫描功能简直太好用了...
- IGraphicsContain 删除元素
- linux下的串口编程
- JavaScript-网页特效
- ufs2.2 协议扫盲(十一)
- html导航页面转换,纯CSS实现导航栏Tab切换效果
- ANSYS Workbench18.0有限元仿真分析视频教程
- WPF设备无关单位(DIU)
- 中英文维基百科语料上的Word2Vec实验
热门文章
- 配置华为防火墙接口IP地址和区域
- Linux数据恢复的研究
- Citrix PVS架构和工作原理
- 云南开放大学《机械制造基础-形考作业1-6(主观题)》
- 深度体验中国长城2020版笔记本电脑有感
- 世界那么大,如何去看看?进入新世界的框架和脉络
- Sending the email to the following server failed.IOException while sending message问题解决
- APP Bomb Lab
- JavaScript 各种事件、方法、参数详解示例及常见问题等(全)
- Gary Marcus:因果熵理论的荒诞和认知科学带给AI的11个启示 | 文末赠书