Utilice el microcontrolador 51 como base y utilice el lenguaje C para diseñar un contador que requiera la visualización de 8 bits de datos, una función de reinicio, un intervalo de tiempo de 1 segundo y una visualización dinámica.
void dis_cnter(void) Se inicia la subrutina de valor del contador
{uchar i; definir carácter variable local i
P3_7=1;P3_6=1; válido y se permite la visualización
for(i=0;i8;i++) bucle 8 veces
{SBUF=SEG7[cnt]; while(!TI);TI=0 ; } Enviar visualización basada en la búsqueda de tabla de 8 unidades
P3_7=0; Desactivar el borrado, visualización normal
} Mostrar el valor del contador finaliza la subrutina
void cnter( void) se inicia la subrutina de conversión de conteo
{uchar i; define la variable local del carácter i
for(i=0;i7;i++) se repite 8 veces
p>{if(cnt9){cnt=0;cnt[i+1]++;}}Si el valor de un determinado bit en el contador es mayor que 9, el bit volverá a 0,
Y el bit alto será Carry plus 1
--------------------------------- ------------
if(cnt[7]9){for(i=0;i8;i++)cnt=0;} Si el valor más alto del contador es mayor que 9, el contador se borrará a 0
} Conversión de conteo Fin de la subrutina
void pt_cnt(void) Inicio de la subrutina de control de salida
{
if((cnt[0]==pre_cnt[0])&& (cnt[1]==pre_cnt[1])&&
(cnt[2]==pre_cnt [2])&&(cnt[3]==pre_cnt[3])&&
(cnt[4]==pre_cnt[4])&&(cnt[5]==pre_cnt[5]) &&
(cnt[6]==pre_cnt[6])&&( cnt[7]==pre_cnt[7])) Si el valor de conteo es igual al valor preestablecido
out_flag=1; el indicador de salida se establece en 1
else out_flag=0 de lo contrario, el indicador de salida se establece en 0
===========; =============================== =======
if(out_flag)drv =0; si el indicador de salida es 1, configure el terminal de salida (P3.4) en 0 y active el optoacoplador U2
de lo contrario, drv=1; de lo contrario, el terminal de salida (P3.4) se establece en 1
} La subrutina de control de salida finaliza
void main(void) Se inicia el programa principal
{ IE=0x84 Abrir interrupción de CPU, abrir interrupción de externo; interrupción 1
IT1=1; establece la interrupción externa 1 como disparador de flanco
while(1) bucle infinito
{P3_6=0;P3_7=1; para enviar a la pantalla, el borrado es válido
SBUF=0x00; while(!TI);TI=0 Envíe 0x00 a IC2 para que la salida IC2 esté completa en 0
if( (P3&0x24)!=0x24)keydown_flag=1; Compruebe si P3.2 y P3.5 son de nivel alto.
Si no es de nivel alto, significa que se presiona una tecla y el indicador de tecla presionada se establece en 1
de lo contrario, keydown_flag=0, el indicador de tecla presionada es; establecido en 0
p>
---------------------------------- ---------- ----------------------------------
SBUF=0xfe; while(!TI) ;TI=0; Enviar 0xfe a IC2
if(!P3_2)set_flag=!set_flag; Si P3.2 es 0, significa que se presiona la tecla S9; , y la bandera set_flag está invertida
===================================== ==============
if(!set_flag){cnter();dis_cnter();pt_cnt();delay(100);}
Si el indicador set_flag es 0, llame al recuento, muestre el recuento, subrutina de control de salida
else {scan_key();dis_pre_cnter();delay(10);}
De lo contrario, el flag set_flag es 1, llama a escanear las teclas S1~S8, muestra la subrutina de configuración de valor previo
=========================== ============== ===============
if(keydown_flag)delay(300); , se llama a la subrutina de retardo de 300 mS,
Para evitar ajustar el valor de la clave demasiado rápido
}
} El programa principal finaliza
void extern_int1(void) interrupción 2 usando 1 subrutina de servicio de interrupción externa 1
{
cnt[0]++ Agrega 1 al bit más bajo del contador
<; p>}