这个程序里,void delay(u16 i){while(i--)},i和i--代表什么?

这个程序里,void delay(u16 i){while(i--)},i和i--代表什么?,第1张

i 是参数,是前面已经声明的 无符号 16位 整型数。

在模薯 C 语言中,i-- 表示变量 i 递减 1 *** 作。

这个自定义的 delay(i) 子程序就是中仔把输入的数值 一直循环减到 0 为旦培者止。目的就是“消耗”系统时间,达到延时目的。

如果颤神哪茄码是精确的话,需要用定时器,不是太精确的话,瞎厅软件延时就可以。

假如12M晶振

void delay10s()

{

int i,j

for(i=0i<10000i++)

for(j=0j<120j++)

}

void delay10s()

{

unsigned char i

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

TR0=1

i=200

while(i--)

{

while(TF0==0)

TF0=0

TH0=(65536-50000)/256

TL0=(65536-50000)%256

}

}

举一个例子来说明吧.比如你要编一个延时50毫知毁秒的子程序,那么步骤如下:

1、查看一下你的硬件环境,比如晶振燃差大小,CPU型号,不用CPU指令的机器周期是不一样的。

2、计算延时需要的机器搭段备周期。比如采用12M晶振,CPU采用通用8051,那么一个机器周期为1US,50毫秒为50*1000=50000US,需要的机器周期=50000/1=50000。

3、试编程,如下:

程序代码指令时间 总共时间

DELAY50MS: 2 2

MOV R7,#A 1 1

DELAY1:

MOV R6,#B 1 1*A

DJNZ R6,$ 2 2*B*A

DJNZ R7,DELAY1 2 2*A

RET 2 2

所以总时间=2+1+A+2*A*B+2*A+2=5+3A+2AB

4、凑数求A、B

根据2、3得到如下式子:

50000=5+3A+2AB

可以有很多种结果,不过最好是以A尽可能小,B尽可能大为原则,当然不能大于255.

我现在凑出A=110,B=225;那么总延时时间=5+3*110+2*110*225=49835。还差165US

5、补齐不够时间

再加一个小循环就OK了,呵呵如下:

MOV R6,#C

DJNZ R6,$

会算了吧,2*C+1=165;所以C=82。

现在完整的延时程序出来了,如下:

DELAY50MS: 2 2

MOV R7,#110 1 1

DELAY1:

MOV R6,#225 1 1*110

DJNZ R6,$ 2 2*225*110

DJNZ R7,DELAY1 2 2*110

MOV R6,#821 1

DJNZ R6,$22*82

RET 2 2

很圆满:总的时间50000微妙,也就是50毫秒。这种方式编程,在该硬件环境下可以保证最大误差为1微妙。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12490583.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存