- 12
- 0
- 约7.61千字
- 约 8页
- 2021-12-11 发布于河北
- 举报
标准的 C 语言中没有空语句。但在单片机的 C 语言编程中,经常需要用几个空指令产生短
延时的效果。
这在汇编语言中很容易实现,写几个 nop 就行了。
在 keil C51 中,直接调用库函数:
#includeintrins.h // 声明了 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;i255;i++);
unsigned char I;
for(i=255;i0;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;i0;i--)
for(j=255;j0;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 这条指令所使用的时间。
同样对于更长时间的
您可能关注的文档
最近下载
- 雕塑维护方案养护.docx VIP
- 四川省成都市树德实验中学2024-2025学年七年级上学期期末考试道德与法治试题.docx VIP
- 对照不同光质补光对转色期葡萄品质和成分影响的初步探究.docx VIP
- 金属切削原理与刀具 配套课件.ppt
- T∕JNBDA 0009-2025 生殖医学高质量数据集建设规范.pdf VIP
- 上海高考:地理高频考点汇总.doc VIP
- 卫生部手术分级目录(2025年1月份修订).doc VIP
- DB11T 1087-2025公共建筑装饰装修工程质量验收标准.docx VIP
- 小学快乐体育教学活动的研究与实践课题研究报告.docx VIP
- 02S515 排水检查井图集建筑工程图集.docx VIP
原创力文档

文档评论(0)