C语言程序:
#include
void main (void)
{
TMOD = 0x10;
TH1 = (-50000>>8);
TL1 = -50000;
TCON = 0x40;
IE = 0x88;
while(1);
}
void T1_int (void) interrupt 3
{
TH1 = (-50000>>8);
TL1 = -50000;
}
汇编程序如下:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP T1INT
ORG 0100H
MAIN:
MOV TMOD, #10H
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
MOV TCON, #40H
MOV IE, #88H
AJMP $
T1INT:
PUSH ACC
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
POP ACC
RETI
Keil C51程序设计中几种精确延时方法
延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
使用定时器/计数器实现精确延时
单片机系统一般常选用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个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
设 MCS-51 单片机的晶振频率为 12MHz,试编写 10ms 的延时程序(要求误差不超过 0.003ms)。
要求精确定时,应该采用硬件。
51 单片机有两个定时器,52 的有三个。够你用的了。
用软件编写延时程序,就别要求太高了。
在 10,000us 内,误差不超过 3us!
并不值得费这心思。
能不能告诉怎么算啊?要不写个汇编也行啊
一些单片微型计算机原理的答题 求高手 能答多少就多少
不能使程序正常结束。--- 27. MCS-51的中断是否均可以屏蔽?可以,令EA为0,即可。