假如fosc=12MHz,编写1秒延时的时间程序

假如fosc=12MHz,编写1秒延时的时间程序,第1张

一、用定时器中断,50ms中断的1 次,20次就是1秒

#include <REG51H>

#define uchar unsigned char

sbit LED =P1^1; //接一LED,1 秒钟亮或灭一次

uchar time;

void init_t0int()

{

TMOD=0x01;

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void main()

{

init_t0int();

while(1);

}

void t0int() interrupt 1

{

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

time++;

if(time==20)

{

time=0;

LED=~LED;

}

}

二、用循环延时可能程序更简单一点,但没实际意义 。单片机在这1 秒内只能循环而不能做其它事。

#include<reg51h>

sbit LED=P1^0;

void delay_ms(unsigned char ms)

{

unsigned char i;

while(ms--)

for(i=0;i<123;i++);

}

void main()

{

while(1)

{

delay_ms(1000);

LED=~P1^0; //P10接一LED,可看到LED每1S亮或灭一次

}

}

是要汇编的还是c的

这有个c的,试试看

/-----------------------------------------------

名称:delay2ms

功能:延时2ms

晶振:12MHz 机器周期1us

时间计算:t=2+1+1995+2=2000us =2000ms

-----------------------------------------------/

void delay2ms(void) //延时2ms子程序

{

unsigned char i,j,z;

for(z=5;z>0;z--)

for(i=12;i>0;i--)

for(j=15;j>0;j--);

}

void delay(void) //延时1s 误差+0446ms。

{

unsigned int x,y,z;

for(z=251;z>0;z--)

for(x=12;x>0;x--)

for(y=40;y>0;y--);

}

若要精确延时还是用汇编或直接用定时器

12M就是每秒

12000000HZ

也就是说

循环12次的话是1微秒,循环12000次的话是1毫秒。

所以你的这个循环执行了

ms

10微秒

如果你要延迟1毫秒,那么ms就应该是100

一般先写一个延时几个毫秒的子程序,很简单。

void delay( int ms )

{

while( ms-- )

{

int i = 延时常数;

do { _nop_(); } while( --i );

}

}

要延时一秒钟,就是1000ms,delay( 1000 );

几个注意事项,

1、延时程序没有关中断,所以中断程序会影响定时精度。

2、延时常数可以用软仿真程序实验确定,需要根据不同的单片机、晶振频率调整延时常数。

3、想要适用任意型号单片机,内层循环最好加一句空 *** 作,通常这可以阻止编译时优化程序。

delay(1);//此行设置断点 //此行设置断点分别设置断点看运行时间。这两个断点之间运行的时间就是延时时间你再看设置的是12M晶振还是11m晶振的延时为25ms

//----假设,系统工作于

12mhz/12t的传统51单片机下#include

<reg51h>

sbit

test

=

p1^0;

void

delay_50ms(unsigned

char

times)

{

while(times

--

)

{

th0

=

0x3c;

//----装入初值,定时器0定时50ms

tl0

=

0xb0;

tr0

=

1;

//-----启动定时器

while(!tf0);

//-----等等定时时间到达

tf0

=

0;

//-----清零定时到达标志

}

}

void

delay_1s(unsigned

char

times)

{

while(times

--

)

{

delay_50ms(20);

}

}

void

main(void)

{

tmod

=

0x01;

//----定时器0工作于方式1

while(1)

{

delay_1s(2);

test

=

~test;

}

}

这个程序你写的太不规范了。

改你的程序

DELAY MOV R7,#50 ;2 2代表机器周期

D3: MOV R6,#50 ;2

D2: MOV R5,#200 ;2

D1: DJNZ R5,D1 ;2

DJNZ R6,D2 ;2

DJNZ R7,D3 ;2

RET ;2

其实这个程序来做延迟程序是有误差的,而且很大。

实际延迟时间 t=2us+((2us200+2us)60)50+2us=

自己算吧 反正比1S延迟要高,仔细看看计算式子的顺序。以基本2重循环思路来解决3重循环。如果要求不高的话,用它来做1S延迟也可以。

下面来给你写一个通过定时,计数器来做延迟子程序。(精确度很高)

有关知识看定时计数器单元的介绍。

DELAY: MOV TMOD,#01H ;选择工作方式1 定时器0

MOV TH0,#

MOV TLO,#

SETB TR0

LOOP1: JNB TF0,LOOP

CLR TF0

SJMP MAIN

的初始值计算方法 1000 000US=(65535-X)/T

T=121/FOSC

FOSC 即为晶振频率 用X的值除以256,商给TH0,余数给TL0

这样,如果需要延迟子程序直接调用。精确度极高。

希望对你有用。不懂继续问

以上就是关于假如fosc=12MHz,编写1秒延时的时间程序全部的内容,包括:假如fosc=12MHz,编写1秒延时的时间程序、若晶振为12MHz,试编制延迟2ms和1s的子程序 单片机程序、C语言延迟时间,我的是12M晶振,这个程序的延迟时间到底是多少等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9844460.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存