编写10ms延时的子程序c语言,单片机定时器延时程序
编写10ms延时的⼦程序c语⾔,单⽚机定时器延时程序
单⽚机定时器延时程序
单⽚机的延时程序(包括asm和C程序,都是我在学单⽚机的过程中⽤到的),在单⽚机延时程序中应考虑所使⽤的晶振的频率,在51系列的单⽚机中我们常⽤的是11.0592MHz和12.0000MHz的晶振,⽽在AVR单⽚机上常⽤的有8.000MHz和4.000MH的晶振所以在⽹上查程序时如果涉及到精确延时则应该注意晶振的频率是多⼤。
软件延时:(asm)
晶振12MHZ,延时1秒
程序如下:
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0JNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2JNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4JNZ 70H,LOOP4
定时器延时:
晶振12MHZ,延时1s,定时器0⼯作⽅式为⽅式1
DELAY1:MOV R7,#0AH ;; 晶振12MHZ,延时0.5秒
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
C语⾔延时程序:
void delay_18B20(unsigned int i)
{
while(i--);
旅游景点介绍}
void Delay10us( ) //12mhz
{
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
/*****************11us延时函数*************************/ //
2022中元节是几号>上海搬家公司哪个好void delay(uint t)
{
for (;t>0;t--);
}
1ms延时⼦程序(12MHZ)
void delay1ms(uint p)//12mhz
{ uchar i,j;
for(i=0;i
{
for(j=0;j<124;j++)
{;}
}
}
关于虎的成语
函数功能:延时20ms的⼦程序
**************************************************************/
void delay20ms(void) //3*i*j+2*i=3*100*60+2*100=20000μs=20ms; { //(3*60+2)*100
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
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--);
}
((248*2+3)*4+3)*5+5=10ms
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) www.dgzj
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--);
}
下⾯是⽤了8.0000MHZ的晶振的⼏个延时程序(⽤定时0的⼯作模式1):(1)延时0.9MS
void delay_0_9ms(void)
{
TMOD=0x01; /*定时器0⼯作在模式1下(16位计数器)*/
TH0=0xfd;
TL0=0xa8;
TR0=1; /*启动定时器*/
while(TF0==0);
TR0=0;
}
(2)延时1MS
void delay_1ms(void)
{
TMOD=0x01; /*定时器0⼯作在模式1下(16位计数器)*/
TH0=0xfd;
TL0=0x65;
TR0=1; /*启动定时器*/
while(TF0==0);
TR0=0;
}
(3)延时4.5ms
void delay_4_5ms(void)
{
TMOD=0x01; /*定时器0⼯作在模式1下(16位计数器)*/
TH0=0xf4;
TL0=0x48;
TR0=1; /*启动定时器*/
while(TF0==0);
TR0=0;
}
在⽤定时器做延时程序时如果懒得计算定时器计数的初始值可以在⽹上⼀个专门⽤来做延时的⼩软件,我在⽤着感觉很实⽤,如果不到的话可以留⾔,留下⾃⼰的邮箱我给发过去;如果上⾯的延时中有错误敬请指正。
Keil C51程序设计中⼏种精确延时⽅法
2009年07⽉28⽇ 星期⼆ 下午 11:15
延时通常有两种⽅法:⼀种是硬件延时,要⽤到定时器/计数器,这种⽅法可以提⾼CPU的⼯作效率,
也能做到精确延时;另⼀种是软件延时,这种⽅法主要采⽤循环体进⾏。
1 使⽤定时器/计数器实现精确延时
单⽚机系统⼀般常选⽤11.059 2 MHz、12 MHz或6 MHz晶振。第⼀种更容易产⽣各种标准的波特率,后两种的⼀个机器周期分别为1μs和2 μs,便于精确延时。本程序中假设使⽤频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器⼯作在⽅式2,则可实现极短时间的精确延时;如使⽤其他定时⽅式,则要考虑重装定时初值的时间(重装定时器初值占⽤2个机器周期)。
在实际应⽤中,定时常采⽤中断⽅式,如进⾏适当的循环可实现⼏秒甚⾄更长时间的延时。使⽤定时器/计数器延时从程序的执⾏效率和稳定性两⽅⾯考虑都是最佳的⽅案。但应该注意,C51编写的中断服务程序编译后会⾃动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执⾏时占⽤了4个机器周期;如程序中还有计数值加1语句,则⼜会占⽤1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最⼩误差的⽬的。
2 软件延时与时间计算
在很多情况下,定时器/计数器经常被⽤作其他⽤途,这时候就只能⽤软件⽅法延时。下⾯介绍⼏种软件延时的⽅法。
2.1 短暂延时
可以在C⽂件中通过使⽤带_NOP_( )语句的函数实现,定义⼀系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在⼀个⾃定义的C⽂件中,需要时在主程序中直接调⽤。如延时10 μs的延时函数可编写如下:
void Delay10us( ) {
贵州旅游线路_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
Delay10us( )函数中共⽤了6个_NOP_( )语句,每个语句执⾏时间为1 μs。主函数调⽤Delay10us( )时,先执⾏⼀个LCALL指令(2
μs),然后执⾏6个_NOP_( )语句(6 μs),最后执⾏了⼀个RET指令(2 μs),所以执⾏上述函数时共需要10 μs。 可以把这⼀函数当作基本延时函数,在其他函数中调⽤,即嵌套调⽤[4],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调⽤4次Delay10us( )函数,得到的延时时间将是42 μs,⽽不是40 μs。这是因为执⾏Delay40us( )时,先执⾏了⼀次LCALL指令(2 μs),然后开始执⾏第⼀个Delay10us( ),执⾏完最后⼀个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调⽤,如在Delay80us( )中两次调⽤Delay40us( ),则也要先执⾏⼀次LCALL指令(2 μs),然后执⾏两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简⾔之,只有最内层的函数执⾏RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调⽤8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调⽤,上述⽅法可以实现不同时间的延时。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。