单片机延时编程
A. 51单片机用c语言怎么写延时函数
延时时间的计算与单片机的晶振频率有关。若晶振频率为12Mhz,那么单片机每震动一次所需要的时间是1/12M s。那么再来看看单片机执行一次自减所需要的振动次数是96次,假如我们对时间要求不是特别精确的话,可以约等于100来计算。现在通过上面两个数据可以得出:单片机每执行一次自减所需要的时间是1/12M *100(s),即1/120000 s,逆向计算一下,每1ms需要自减多少次?120次对吧。所以一个简单的延时功能就诞生了,我们只需要自减120次,就可以延时1ms,如果我们要延时50ms呢,那就自减50*120=6000次。那么在程序上如何表达呢?我们可以用两套for循环
void delay(int i){
int x,y;
for(x=i;x>0;x--){
for(y=120;y>0;y--)
}
}
参数 i 代表该函数延时多少ms
B. 51单片机中,编程怎么计算延时的
单片机延时,有两种延时。
第一种: 软件延时。 根本不准确
软件延时意思就单片机在执行指令时,执行一条空指令,具体如下:
Void Delay (unsigned char i)
{
while( i != 0)i--;
}
Delay(100);
以上无法计算出延时时间,只能通过Keil软件仿真,来查看具体延时之间。
第二种: 定时器延时。精准延时
C. 单片机有哪些延时方法详细介绍
据我所知,单片机延时的方法有:
1。空操作延时(12MHz)
voiddelay10us()
{
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
}
2。循环延时(12MHz)
Voiddelay500ms()
{
unsignedchari,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
延时总时间=[(k*2+3)*j+3]*i+5
k*2+3=165 us
165*j+3=33333 us
33333*i+5=500000 us=500 ms
3。计时器中断延时(工作方式2) (12MHz)
#include<reg52.h>
sbitled=P1^0;
unsignedintnum=0;
voidmain()
{
TMOD=0x02;
TH0=6;
TL0=6;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num==4000)
{
num=0;
led=~led;
}
}
}
voidT0_time()interrupt1
{
num++;
}
4。C程序嵌入组合语言延时
D. 单片机延时控制程序
#include<reg51.h>
#defineucharunsignedchar
ucharcnt=0,sec=0;
sbitAsgn=P1^0;
sbitBsng=P1^1;
sbitOut=P1^4;
bitflag=0;
voidt0isr()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
if(cnt>=20)
{
cnt=0;
sec++;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
sec1=0;
sec2=0;
while(1)
{
sec=0;
cnt=0;
TR0=0;
while(Bsng==1);//死等B信号
TR0=1;
cnt=0;
sec=0;
while(sec1<1)//1秒内等待A信号
{
if(Asng==0)
{
sec=0;
cnt=0;
flag=1;
}
}
if(flag)//如果出现有效信号
{
while(sec<3);//等待3秒
out=0;
flag=0;
}
}
}
E. 如何用单片机的delay实现延时
单片机中的delay()的单位时间不是系统提供的,而是用户自己编制的。
如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。
如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。
最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
(5)单片机延时编程扩展阅读
单片机C语言程序中延时函数delay的原理是:仅仅执行一些,没有实质性影响的所谓“无意义指令”,比如做比大小啊,做某个int的自加运算啊之类的。
单片机的有些程序需要调用延时程序,合理的安排循环次数以及空操作的个数方法:用汇编的话就根据你的当前晶振频率去推算你的指令周期,然后结合需要延迟的时间。
编写延迟程序,用C的话还是要看最后生成的汇编码是什么样的了。最简单的方法就是写好程序以后再编译器里软仿真看时间。
单片机C语言延时需注意的问题:
标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。
在keil C51中,直接调用库函数:
#include // 声明了void _nop_(void);
_nop_(); // 产生一条NOP指令
作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。
F. 单片机延时程序的延时时间怎么算的
单片机的延时程序通过执行指令来达到延时效果,这个时间等于执行的指令需要的时间,而一个指令需要的时间叫做指令周期,这个时间等于若干个机器周期。
(6)单片机延时编程扩展阅读:
1丶指令周期,是每种运算需要的时间,如加法、逻辑等,是每一步进行这种指令运算需要的时间,是机器周期的整数倍,这种周期不定。
2丶51单片机12M晶振,晶振周期1/12微妙,一个机器周期包含12个晶振周期,所以12M晶振时机器周期=12x(1/12)微妙=1微妙。
3丶1个毫秒延时子程序如下:
void delay1ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<110;j++);
}
}
G. 单片机汇编程序延时0.3秒和0.5秒怎么写
延时0.3秒程序(12M):
DELAY3:
MOVR2,#200
DL1:
MOVR3,#250
DJNZR3,$
MOVR3,#250
DJNZR3,$
MOVR3,#250
DJNZR3,$
DJNZR2,DL1
RET
延时0.5秒程序:
DELAY5:
MOVR2,#5
DLY1:
MOVR3,#200
DLY2:
MOVR4,#250
DJNZR4,$
DJNZR3,DLY2
DJNZR2,DLY1
RET
H. 51 单片机延时程序
我以2ms为例说明一下:
单片机的晶振周期为12hz,则执行一条代码为一个机器周期,为1微妙(ua),所以2ms=10*200(ua),
对r2赋值200(4位二进制数最大值为256,所以只能取到200)即#c8h。再对r2循环20次就实现了2ms延时。至于100ms、
200ms、
1s等等方法类似,只是调整相应的初值。多设置几次循环就行。
程序代码如下:
delay:
mov
r1,#0ah
;赋值r1为10次
delay1:
mov
r2,#c8h
;赋值r2为200次
delay2:
djnz
r2,$
;r2自减到0,不到0继续等待
djnz
r1,delay1
;r2减到0后r1自减1,重新给r2赋初值后继续循环,直到r1到0为止,延时结束
ret
I. 单片机C语言延迟程序
下面的延时的基本程序(中断加计数器)
********
void
T0_int(void)
interrupt
1
{
TH0
=
0x4C;
//重新装载,50MS定时器初值
TL0
=
0x00;
T0_count++;
if(T0_count==20)
//1S到
{
T0_count
=
0;
//在这写程序
}
}
main()
{
TMOD
=
0x01;//定时器0,工作方式1,16位计数
TH0
=
0x4C;
//50MS定时器初值
TL0
=
0x00;
IE
=
0x82;
//开总中断,开T0中断
EA
=
1;
ET0
=
1;
TR0
=
1;
T0_count
=
0;
i
=
0;
loop:
goto
loop;
}
还有:
for(us=0;us<60;us++);
/*延时500us*/
for(us=0;us<1;us++);
/*
延时15微秒*/
for(us=0;us<5;us++);
/*
延时51微秒*/