单片机C语言编程空指令产生短延时怎么办

时间:2023-03-08作者:佚名
标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。
  在keil C51中,直接调用库函数:
  #include // 声明了void _nop_(void);
  _nop_(); // 产生一条NOP指令
  作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。
  在选择C51中循环语句时,要注意以下几个问题
  第一、定义的C51中循环变量,尽量采用无符号字符型变量。
  第二、在FOR循环语句中,尽量采用变量减减来做循环。
  第三、在do…while,while语句中,循环体内变量也采用减减方法。
  这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。
  下面举例说明:
  unsigned char i;
  for(i=0;i<255;i );
  unsigned char i;
  for(i=255;i>0;i--);
  其中,第二个循环语句C51编译后,就用DJNZ指令来完成,相当于如下指令:
  MOV 09H,#0FFH
  LOOP: DJNZ 09H,LOOP
  指令相当简洁,也很好计算精确的延时时间。
  同样对do…while,while循环语句中,也是如此
  例:
  unsigned char n;
  n=255;
  do{n--}
  while(n);
  或
  n=255;
  while(n)
  {n--};
  这两个循环语句经过C51编译之后,形成DJNZ来完成的方法,
  故其精确时间的计算也很方便。
  其三:对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。
  unsigned char i,j
  for(i=255;i>0;i--)
  for(j=255;j>0;j--);
  或
  unsigned char i,j
  i=255;
  do{j=255;
  do{j--}
  while(j);
  i--;
  }
  while(i);
  或
  unsigned char i,j
  i=255;
  while(i)
  {j=255;
  while(j)
  {j--};
  i--;
  }
  这三种方法都是用DJNZ指令嵌套实现循环的,由C51编译器用下面的指令组合来完成的
  MOV R7,#0FFH
  LOOP2: MOV R6,#0FFH
  LOOP1: DJNZ R6,LOOP1
  DJNZ R7,LOOP2
  这些指令的组合在汇编语言中采用DJNZ指令来做延时用,因此它的时间精确计算也是很简单,假上面变量i的初值为m,变量j的初值为n,则总延时时 间为:m×(n×T T),其中T为DJNZ指令执行时间(DJNZ指令为双周期指令)。这里的 T为MOV这条指令所使用的时间。同样对于更长时间的延 时,可以采用多重循环来完成。
  只要在程序设计循环语句时注意以上几个问题。
  下面给出有关在C51中延时子程序设计时要注意的问题
  1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。
  2、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。
  3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。
  unsigned char delay(unsigned char i,unsigned char j,unsigned char k)
  {unsigned char b,c;
  b="j";
  c="k";
  do{
  do{
  do{k--};
  while(k);
  k="c";
  j--;};
  while(j);
  j=b;
  i--;};
  while(i);
  }
  这精确延时子程序就被C51编译为有下面的指令组合完成
  delay延时子程序如下:
  MOV R6,05H
  MOV R4,03H
  C0012: DJNZ R3, C0012
  MOV R3,04H
  DJNZ R5, C0012
  MOV R5,06H
  DJNZ R7, C0012
  RET
  假设参数变量i的初值为m,参数变量j的初值为n,参数变量k的初值为l,则总延时时间为:l×(n×(m×T 2T) 2T) 3T,其中T为 DJNZ和MOV指令执行的时间。当m=n=l时,精确延时为9T,最短;当m=n=l=256时,精确延时到16908803T,最长。

相关阅读

你家停电,可能是隔壁老王引起的!原来如此!

“家保”,家用漏电保护器,是对家里漏电后进行保护的一个装置。经过多年的推广使用,大部分家庭都已安装。 那么“家保”有什么作用呢? 供电抢修人员说 “家保“退出运行的情况...
2023-06-11
你家停电,可能是隔壁老王引起的!原来如此!

施工现场临时用电的常见问题,总结防范!

来自施工现场临时用电的错误实例 看一看问题出在哪里 ▼ 总结施工现场临时用电常见问题 ▼ 1. 临时用电施工组织设计的编制质量普遍较差,内容不全,方案编制者基本上不是专业电...
2023-06-11

家用漏电开关为何会频繁跳闸?主要有这10大原因

家庭都装有漏电开关,时常发生跳闸现象,如果一天跳几次,找不到原因,就让人实在很烦恼!有的是属漏电引起的正常跳闸,有的并非是漏电引起的跳闸。为什么会频繁跳闸?主要有以...
2023-06-11
家用漏电开关为何会频繁跳闸?主要有这10大原因

闲时嫌电工费钱,忙时嫌电工不够用,电工和企业的这杆秤如何能端平?

除了专业的电厂,在很多企业,电工一直是个辅助岗位,其他部门有固定的工作时间,每天都有具体连续的工作任务, 而电工除了机器损坏,设备故障时忙的焦头烂额,其他时间的巡检...
2023-06-27
闲时嫌电工费钱,忙时嫌电工不够用,电工和企业的这杆秤如何能端平?

MLCC在EV无线充电系统中的应用指南

随着材料技术和积层技术的不断进步,MLCC(积层陶瓷贴片电容器)在小型化和大容量化方面取得了显著进展。近年来,温度补偿用的MLCC(种类1)在耐电压和电容量方面也有了显著的扩...
2023-08-09
MLCC在EV无线充电系统中的应用指南

热销商品

硅胶垫片/硅胶垫/硅胶垫片圆形/硅胶垫圈/橡胶垫片/氟胶垫片

硅胶垫片(又称硅胶垫、硅胶垫圈)是一种由硅橡胶制成的密封材料,具有优异的耐高低温(-60℃~230℃)、耐老化、绝缘和环保无毒特性,广泛用于食品、医疗、电子及家电等领域...
1

三色变光led筒灯2.5寸3W5瓦开孔6 7.5 8公分家用客厅嵌入式天花灯

三色变光LED筒灯,2.5寸精巧设计,功率可选3W/5W,适用于开孔直径6.7–8公分的家用嵌入式安装。采用高亮LED光源,支持暖光、自然光、白光三色切换,满足不同场景氛围需求。...
7.2

安全帽工地施工建筑电力abs劳保国标透气加厚头盔防护帽定制印字

本款安全帽专为工地施工、建筑及电力作业设计,采用高强度ABS工程塑料制成,符合国家标准(GB 2811-2019),具备优异的抗冲击、耐穿刺性能。帽壳加厚处理,内衬透气缓冲结构,...
9.5

公牛官方旗舰店开关插座空调16A插座五孔10A面板暗装多孔G12白灰

公牛官方旗舰店提供一系列高质量的开关插座和空调配件。这款16A插座五孔面板采用暗装设计,适用于多种安装环境,如墙面、天花板等。它具有10A的电流容量,可以满足家庭...
5.91

耐磨耐油丁腈耐高温氟胶防水环保级硅胶包覆聚四氟橡胶O型密封圈

本款O型密封圈采用多层复合结构设计,外层为环保级硅胶,具备优异的防水、耐候与生物相容性;中间层采用耐磨耐油的丁腈橡胶(NBR),确保在油污环境中长期稳定运行;内层则选用...
1

网站栏目