Programa de retraso del lenguaje SCM c
Si no utiliza el método de interrupción pero utiliza el método de bucle de software, puede realizar una simulación de software en el cuerpo del bucle (puede ver el código ensamblador) y calcular los ciclos de máquina ocupados por el cuerpo del bucle. Y aún así calcular el tiempo con precisión. Por ejemplo: #include
{ uchar i;
for( ; ms > 0 ; ms--)
for(i=0;i<200;i++)_nop_();
} Después de compilar en el software Keil, abra el archivo **(nombre de archivo).m51 y busque el retardo() C O D E M E M O R Y la dirección base, luego ingrese la simulación del software ("Opción para destino..." - el elemento de la página "depuración" está configurado en "Usar simulador"), ingrese la dirección base del retraso() en la barra de direcciones del puntero de la PC y presione Entrar, la PC actual apunta a la entrada de la función y la ventana de desmontaje se abrirá de forma predeterminada, como se muestra a continuación (tanto el prototipo del lenguaje C como el resultado del ensamblaje. A continuación, simplemente cuente el total de ciclos de máquina de las instrucciones de ensamblaje). el cuerpo del programa de bucle, puede obtener el tiempo de retardo exacto. 279: retraso nulo (uint ms)
280: { uchar i;
281: for( ; ms > 0 ; ms--)
C: 0x6807 D3 SETB C
C:0x6808 EF MOV A,R7
C:0x6809 9400 SUBB A,#0x00
C:0x680B EE MOV A,R6
C:0x680C 9400 SUBB A,#0x00
C:0x680E 400E JC C:681E
282: for(i=0;i<200; i++)_nop_();
C:0x6810 E4 CLR A
C:0x6811 FD MOV R5,A
C:0x6812 00 NOP
C:0x6813 0D INC R5
C:0x6814 BDC8FB CJNE R5,#0xC8,C:6812
C:0x6817 EF MOV A,R7
C:0x6818 1F DEC R7
C:0x6819 70EC JNZ retardo(C:6807)
C:0x681B 1E DEC R6
C:0x681C 80E9 SJMP retraso(C:6807)
283: }
C:0x681E 22 RET