
几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响。
500ms延时子程序程序:(晶振12MHz,一个机器周期1us。)
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--);
}
扩展资料
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。
频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。
51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12(1/ 晶振频率)= x μs。常用单片机的晶振为110592MHz,12MHz,24MHz。
其中110592MHz的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
很简单的,假设晶振频率为12M Hz ,则每一个机器周期为1us,T0工作于方式1,非门控,16位定时器。汇编程序为如下:
MOV TMOD,00000001B 即MOV TMOD,01H 工作于方式11
MOV TH0,3CH
MOV TL0,0B0H 初始值
STEB TR0 T0开始工作
初始值计算: (65536-X)1us=50ms=50000us
则X=15536 即3CB0H
1个机器周期=6个时钟周期=12个振荡周期
而单片机是以机器周期为时间单位的,所以要为
112/12M=1us
这个是循环查询定时器溢出标志位是否为一,即查询法。
ORG 00H
LJMP MAIN
ORG 30H
MAIN:
MOV TMOD,#10H
MOV TCON,#00H
MOV TL1,#78H
MOV TH1,#0ECH
SETB TR1 //启动定时器T1
LOOP:
JBC TF1,TIME1 //等待定时器溢出
SJMP LOOP
TIME1:
MOV TL1,#78H //重装初值
MOV TH1,#0ECH
SJMP LOOP
RET
END
中断法
ORG 00H
LJMP MAIN
ORG 001BH
LJMP TIME_1
ORG 30H
MAIN:
MOV TMOD,#10H
MOV TCON,#00H
MOV TL1,#78H
MOV TH1,#0ECH
SETB ET1
SETB EA
SETB TR1 //启动定时器T1
SJMP $ //等待中断,TR1置一
TIME_1:
MOV TL1,#78H //重装初值
MOV TH1,#0ECH
RETI
END
以上就是关于【急求】设计一个延时大约0.5秒的延时子程序(晶振频率12HZ);要求:限用ASM51语言编写程序,全部的内容,包括:【急求】设计一个延时大约0.5秒的延时子程序(晶振频率12HZ);要求:限用ASM51语言编写程序,、编程利用8051内部的定时器T0产生50ms延时、51单片机用定时器T1编写延时10ms汇编程序 谁给写一个 急啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)