1. 怎么根据单片机晶振计算每段程序的运算时间啊
用KEIL软件可以计算时间,将while的起始位置和终止位置加红点(双击即可);
然后左侧的SEC后面的就是执行的时间。
再给你几个延时程序做参考:
软件延时:(asm)
晶振12MHZ,延时1秒
程序如下:
DELAY:MOV72H,#100
LOOP3:MOV71H,#100
LOOP1:MOV70H,#47
LOOP0:DJNZ70H,LOOP0
NOP
DJNZ71H,LOOP1
MOV70H,#46
LOOP2:DJNZ70H,LOOP2
NOP
DJNZ72H,LOOP3
MOV70H,#48
LOOP4:DJNZ70H,LOOP4
定时器延时:
晶振12MHZ,延时1s,定时器0工作方式为方式1
DELAY1:MOVR7,#0AH;;晶振12MHZ,延时0.5秒
AJMPDELAY
DELAY2:MOVR7,#14H;;晶振12MHZ,延时1秒
DELAY:CLREX0
MOVTMOD,#01H;设置定时器的工作方式为方式1
MOVTL0,#0B0H;给定时器设置计数初始值
MOVTH0,#3CH
SETBTR0;开启定时器
HERE:JBCTF0,NEXT1
SJMPHERE
NEXT1:MOVTL0,#0B0H
MOVTH0,#3CH
DJNZR7,HERE
CLRTR0;定时器要软件清零
SETBEX0
RET
C语言延时程序:
10ms延时子程序(12MHZ)
voiddelay10ms(void)
{
unsignedchari,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
1s延时子程序(12MHZ)
voiddelay1s(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--);
}
200ms延时子程序(12MHZ)
voiddelay200ms(void)
{
unsignedchari,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
500ms延时子程序程序:(12MHZ)
voiddelay500ms(void)
{
unsignedchari,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
不过实际得到的延时会存在差异,所以最好用实验的方法调整延时参数。
http://..com/link?url=D6NFOp_-_ctZ7gAh1VfA-VDEhKsNmWgIq
2. 单片机时间计算
255是错误的,定时器 高8位的1相当于256个脉冲
假设一个脉冲是1US
总时间=定时时间*中断次数+TH0*256+TL0-15536
15536是定时50ms时所装入的初值,一定要减去
将US换算成mS T=tcount*50+TH0*0.256+TL0/1000-15.536
另外一种方法是将定时器初值设为0,即定时65536US, 这样总时间为
T=65536*中断次数+TH0*256+TL0