延时1us程序12mhz晶振c语言,51单片机KeilC延时程序的简单(晶振12MHz,一。。。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
延时1us程序12mhz晶振c语⾔,51单⽚机KeilC延时程序的简单
(晶振12MHz,⼀。
⼀. 500ms延时⼦程序
void delay500ms(void)
{
unsignedchari,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);
}
产⽣的汇编:
C:0x0800 7F0F MOV R7,#0x0F
C:0x0802 7ECA MOV R6,#0xCA
C:0x0804 7D51 MOV R5,#0x51
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
计算分析:
程序共有三层循环
⼀层循环n:R5*2 = 81*2 = 162us DJNZ 2us
⼆层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值1us = 3us
三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us
循环外: 5us⼦程序调⽤2us +⼦程序返回2us + R7赋值1us = 5us
延时总时间=三层循环+循环外= 499995+5 = 500000us =500ms
计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5
⼆. 200ms延时⼦程序
void delay200ms(void)
{
unsignedchari,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--);
}
产⽣的汇编
C:0x0800 7F05 MOV R7,#0x05
C:0x0802 7E84 MOV R6,#0x84
C:0x080C 22 RET
三. 10ms延时⼦程序
void delay10ms(void)
{
unsignedchari,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);
}
产⽣的汇编
C:0x0800 7F05 MOV R7,#0x05
C:0x0802 7E04 MOV R6,#0x04
C:0x0804 7DF8 MOV R5,#0xF8
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
四. 1s延时⼦程序
void delay1s(void)
{
unsignedcharh,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--); }
对1s延时的验证:
1.设置仿真的晶振为12MHz
2.在延时函数设置断点
3.单步运⾏程序,到达延时函数的⼊⼝
4.先记下进⼊延时函数的时间
5.step out跳出函数,记下此时时间,两个时间相减即为延时函数运⾏时间
函数运⾏时间=1.00041400-0.00041600≈1s
产⽣的汇编
C:0x0808 DCFE DJNZ R4,C:0808
C:0x080A DDFA DJNZ R5,C:0806
C:0x080C DEF6 DJNZ R6,C:0804
C:0x080E DFF2 DJNZ R7,C:0802
C:0x0810 22 RET
在精确延时的计算当中,最容易让⼈忽略的是计算循环外的那部分延时,在对时间要求不⾼的场合,这部分对程序不会造成影响. void mDelay(unsigned int Delay) //Delay = 1000 时间为1S
{
unsignedinti;for(;Delay>0;Delay--)
{for(i=0;i<124;i )
{;}
}
}void waitms(inti)
{charm;for( ; i ;i--)
{for(m = 203; m ; m--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
延时1ms的函数时钟频率12MHz
unsigned intsleepTime;
unsingedchar inSleep = 0;void sleepService(void)
}void isr_timer(void) //假定定时器中断1ms 中断⼀次。
{
...
sleepService();
...
}void sleep(unsigned int ms) //延时⼦程序
{
sleepTime=ms;
inSleep= 1;while(inSleep);
}void main(void)
{
....
sleep(1000); //延时 1秒
...
}
如果要求是秒级的这么长的延时,单⽚机中⼀般采取不占CPU时间的延时,利⽤定时器来实现延时,如果⾮得⽤循环延时,在C中也通常嵌⼊汇编实现,这样误差⽐较⼩。
==========================================================================
如下程序能实现ms毫秒级的⽐较精确的延时
void Delayms(unsigned intn)
{
unsignedinti,j;for(j=n;j>0;j--)for(i=112;i>0;i--);
}
⽤keil可以看出这个延时的时间,我们先延时1ms(Delayms(1))。
进⼊Delayms前,sec=0.00042209s
延时后,sec=0.00142253s
可以知道Delayms(1)实际延时0.00142253s—0.00042209s=0.00100044s≈1ms
同样如果想延时15ms的话,⽤Delayms(15),实际延时0.01480903s≈15ms,延时还是挺精确的。
=======================================================。