若晶振为12MHZ,试编写一个延时5MS的子程序

若晶振为12MHZ,试编写一个延时5MS的子程序,第1张

D5MS:

MOV R7,#25

MOV R6,#100

DJNZ R6,$

DJNZ R7,$-4

RET

void delay_ms(unsigned int ms )

{

unsigned char i;

while(ms--)

for(i=0;i<123,i++); //这是1ms的子函数

}

delay_ms(5) ; // 就是5ms延时了

最好直接利用定时器延时,定时1毫秒,程序中调用延时函数就行了,Delay(100):

uint

count;

//定义

外部变量

Delay(

uint

k)

//

延时函数

{

count

=

k;

while(count!=0)

;

}

TIME0()

interrupt

1

//

定时器0中断函数

{

TH0

=

0XFC;

TL0

=

0X18;

count--;

}

12MHz

是什么嘛?晶振频率

时间和频率是怎么换算的呢<注意频率和时间并不是一个概念哦>?

T

=

1/f

1Hz

等同于

1s

12MHz

等同于

1/12

us;

设一个变量T

=

0;

每1/12us变化一次,(比如T++);

那么,20s中有多少个

1/12us,则T就需要自动加多少次;

当最后加完最后一个

1/12us的时候,延时计时变量就该溢出了嘛(清零了)

则用个for循环实现我的思路:

unsigned

long

long

T

=

0;

for(T

=

0;T

<

(20s/(1/12us);T++))

{}

//处理代码

//计时变量恢复成0

T

=

0;

//如果你要进行第二轮处理的话。否则就没必要了

说明:for()循环里面的值不可以这么写哈,你得自己计算了;另外,也可以用while()结构;

当然楼上有人介绍用定时器,定时器还是考验了时间和频率之间的隐射关系。呵呵~~

#include<reg51h>

unsigned ms;

main()

{

TMOD=0x02;

ET0=1;

EA=1;

TH0=TL0=6;

TR0=1;

while(1);

}

void T0() interrupt 1

{

if(++ms==600){ms=0;P2_0=~P2_0;}

}

以上按占空比50%计算。使用T0中断,计数值250次产生中断,中断一次250微秒,600次150毫秒,每隔150毫秒P20输出相反的电平,即得到方波

由于晶振频率与机器周期相关,所以,你首先要确定这二者之间的关系。然后通过C语言中的循环程序,看看每条指令的机器周期数。算出总的机器周期数。或者输出方波也可以,看看方波周期,找到机器周期数,再换算出振荡频率

以上就是关于若晶振为12MHZ,试编写一个延时5MS的子程序全部的内容,包括:若晶振为12MHZ,试编写一个延时5MS的子程序、设单片机晶振频率为12MHZ,编写出其延时100毫秒的程序、假设单片机晶振为12mhz,编写一段延时20秒的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存