51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)

如题所述

1、下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。

2、软件延时:(asm)

晶振12MHZ,延时1秒
程序如下:
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0:DJNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2:DJNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4:DJNZ 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

3、C语言延时程序:

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--);

}

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)

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--);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-24
void delay10us(void) //误差 -0.234375us
{
unsigned char a;
for(a=2;a>0;a--);
}
这个延时包含调用时间本回答被网友采纳

51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)
1、下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振...

51单片机C语言中delay函数是怎么定义和使用的?
定义一个延时xms毫秒的延时函数 void delay(unsigned int xms) \/\/ xms代表需要延时的毫秒数 { unsigned int x,y;for(x=xms;x》0;x--)for(y=110;y》0;y--);} 使用:void Delay10us(uchar Ms){ uchar data i;for(;Ms》0;Ms--)for(i=26;i》0;i--);} i=[(延时值...

单片机延时函数的设计
对于51单片机,两个参数决定了MAIN_Fosc的数值,1】系统板的晶振。2】有否单片机的时钟分频。如果没有设置时钟分频,而晶振是X MHz=X*1000000Hz,那么X*1000000=13000*850;X=13000*850\/1000000=11.05; 值此可以推断,这个延时函数是基于晶振11.0592MHz的。废话说了这么多,主要想提醒楼主注意,通过...

我用的51单片机的振荡频率为11.0592MHZ,此单片机的定时器能最小识别...
既然之前设置的定时器完成一次计时是100微秒,计200次就可以了,舵机正常工作。后来改成50微秒,计400次舵机就不正常工作,那说明舵机不能识别那么高频率的方波,或者数据类型错了,应该定义为unsigned int。因为unsigned char 类型最大值只能是255。

C语言延时程序中,延时时间是如何计算出来的. (假如我想延时1s该如何计算...
你这个11.0592是匹配波特率所用的晶振,机器周期只是约等于1us。首先你要延时多长时间,us级别的必须使用汇编,C误差很大,10-100us级别的可以用C控制,单必须考虑C出栈入栈时间。ms以上的用时间除以机器周期(除以你则个1us是不行的,误差大)。另外,看着你好像用的是keil,keil里边单步调试里边不是...

在keil_C51设计中几种精确延时的方法
所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。在C51中通过预处理指令 #pragma asm和#pragma endasm可以嵌套汇编程序段实现延时。用户编写的汇编语言紧跟在 #pragma asm之后,在 #pragma endasm之前结束。将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳...

51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un
void delay_ms(unsigned int ms_number) \/\/ ms延时函数 (AT89C51 @ 11.0592MHz){ unsigned int i;unsigned char j;for(i=0;i<ms;i++){ for(j=0;j<200;j++);for(j=0;j<102;j++);} } void Delay(){ unsigned char a,b,c;for(a=0;a<?;a++)for(b=0;b<?;b++)for(c...

51单片机的定时器问题
假设要求50ms中断,求定时器初值。晶振11.0592M,每个机器周期时间为:t=12×(1\/11.0592M) 单位:us 50ms所需机器周期为:50×1000÷t=46080 那么需要初值为:0xFFFF-46080=65535-46080=19456=0x4C00 因此,置初值为TH=0x4c,TL=0x00,经过46080个指令周期,计数器将产生50ms定时中断。如果...

51单片机用11.0592晶振和12MHZ的编程有区别吗
区别不大,但与定时器有关的初值需修改,因都是要求时间准确的场合才用定时器,例如串口异步通信,普通的延时函数有误 差关系不大

用51单片机实现时钟功能程序???
DELAY200US:;@11.0592MHz NOP NOP NOP PUSH30H PUSH31H MOV30H,#2 MOV31H,#179 NEXT:DJNZ31H,NEXT DJNZ30H,NEXT POP31H POP30H RET ORG0060H ;DISPLAY子程序 DISPLAY:PUSHACC;不能写A,此处ACC代表地址,push后跟地址,代表把地址内的内容压入栈中 PUSH00H;R0 PUSH06H;R6 PUSH07H;R7 PUSH...

相似回答