51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)

51单片机求10微秒的延时函数 C语言(晶振11.0592MHz),第1张

1、下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是110592MHz和120000MHz的晶振,而在AVR单片机上常用的有8000MHz和4000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。

2、软件延时:(asm)

晶振12MHZ,延时1秒

程序如下:

DELAY:MOV

72H,#100

LOOP3:MOV

71H,#100

LOOP1:MOV

70H,#47

LOOP0:DJNZ

70H,LOOP0

NOP

DJNZ

71H,LOOP1

MOV

70H,#46

LOOP2:DJNZ

70H,LOOP2

NOP

DJNZ

72H,LOOP3

MOV

70H,#48

LOOP4:DJNZ

70H,LOOP4

定时器延时:

晶振12MHZ,延时1s,定时器0工作方式为方式1

DELAY1:MOV

R7,#0AH

;;晶振12MHZ,延时05秒

AJMP

DELAY

DELAY2:MOV

R7,#14H

;;晶振12MHZ,延时1秒

DELAY:CLR

EX0

MOV

TMOD,#01H

;设置定时器的工作方式为方式1

MOV

TL0,#0B0H

;给定时器设置计数初始值

MOV

TH0,#3CH

SETB

TR0

;开启定时器

HERE:JBC

TF0,NEXT1

SJMP

HERE

NEXT1:MOV

TL0,#0B0H

MOV

TH0,#3CH

DJNZ

R7,HERE

CLR

TR0

;定时器要软件清零

SETB

EX0

RET

3、C语言延时程序:

10ms延时子程序(12MHZ)

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延时子程序(12MHZ)

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--);

}

200ms延时子程序(12MHZ)

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--);

}

500ms延时子程序程序:

(12MHZ)

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--);

}

void delay(unsigned char cnt)和void delay(unsigned int cnt)意义上是一样的

延时程序的延时过程,是

while(--cnt);

程序运行过程中消耗的时间

如何计算时间

这要根据你单片机上的晶振频率

51系列单片机1个机器周期等于12个时钟周期,12MHz晶振的话一个机器周期=1/12MHz12=1us

delay(1000),

delay(1000)即--cnt这条指令运行1000次,消耗1000个机器周期,即1ms。在这个程序上运行消耗1ms时间,相当于延时1ms。

对for

循环的

编译,不同编译器的编译结果不尽

相同;对不同

单片机系列,编译结果也不尽相同。

标准51单片机,KEIL

为例:(已知12MHz,12T时钟模式,一个机械周期

t

则为

1us)

一条

赋值语句(count=1),2个机械周期

t;一条判断(C>0)4t;一条自减(C--)

1t;一条空语句

(nop)1t(不是空函数,是

空语句);

第一个

for

循环:

①执行

赋初值

2t,②判断

4t,③执行空语句

1t,④执行自减

1t,⑤执行判断

4t,结束。

共计

12

个机械周期,12us;

第二个for

循环:

①执行一次

赋值

2t;

②执行

30次

判断,4t×30=120t;

③执行

30次

空语句,30t;

④执行

30次

自减,30t;

⑤又执行

1次判断

4t,结束。

共计

186

机械周期

186us。

这个问题,如果是笔答题,你需要给出你的单片机是多少位的,需要计算时钟分频。

如果是在调程序时就简单多了,在你的keilc上运行,点调试按钮,会在左边栏有时间计数,只要设定程序的断电,就是你这个程序的开始void delay1(),然后先给ms一个数值看下具体的时间是多少,然后再计算就好多了。

首先你要知道一个指令周期是几秒 算法是1/(晶振频率除以12)

然后你要知道循环究竟执行了几个指令周期 你可以用keil里在线反汇编命令看看你的循环编译成机器语言后到底是几个指令周期 这样就知道了延迟时间 当然你取近似值也可以的

比如

for(i=0,i<255,i++){x=2}

这里x=2是一个指令周期 而执行了255次 假如你的晶振是12MHZ的 则你执行一个指令周期是1us 255次是0255ms

DelayMS(300)表示希望系统delay 300毫秒,系统有自己的RTC,根据硬件的晶振(Hz)可以计算出一次振荡大约多少耗时,这样就能大约算出1ms需要多少次振荡;

简单比喻一次振荡需要1us,那1ms就是1000次振荡,300ms就是300x1000次振荡,这样就能大概的计算出300ms delay;

这得看你的CPU运行一条指令得多久,像单片机89C51一般一条1us。

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台;

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。

根据外部晶振的不同,延时1毫秒的循环次数也不一样,一般12M晶振的话用 for(j=time;j>0;j--);延时时,1毫秒time大概为125左右,这里用110,大概晶振为110592M,所以这段程序,内部循环完成1毫秒延时,外部循环完成500毫秒延时。

希望对你能有所帮助。

以上就是关于51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)全部的内容,包括:51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)、单片机C语言延时程序的计算,是什么样的算法,请求高手。、单片机延时时间计算。c语言,晶振频率是12MHZ等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9316904.html

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

发表评论

登录后才能评论

评论列表(0条)

保存