
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秒的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)