Escribiendo ****yang 0~999 en el lenguaje C del microcontrolador, ¡es mejor explicarlo en detalle!
/****Entorno de hardware predeterminado del programa fuente: 52 microcontroladores, oscilador de cristal de 12 MHz, 3 dígitos **** tubo digital yang, selección de segmento de puerto P0, selección de bits de alto nivel P10~P12 (controlador de transistor NPN), P12 es el tubo digital más alto***/
#include " reg52.h"//include 52 archivo de encabezado
#define TRUE 1 //define booleano '1': verdadero
#define FALSE 0 //define booleano '0': falso
# define uchar unsigned char //define la abreviatura de datos de caracteres sin signo
#define uchar unsigned char #define uint unsigned int //define el nombre corto de datos enteros sin signo
#define th0 0xfc
#define tl0 0x18 //1ms a 12MHz (estado del modo de trabajo del temporizador 1)
#define SEG_Num 3 //Número de tubos digitales
#define SEG_Data P0 //Nigital Interfaz del controlador del segmento de tubo
#define SEG_En P1 //Interfaz del controlador del tubo digital
#define SEG_AllOff (SEG_En&=0xf8) //Apaga todos los tubos digitales (controladores de bits) p>
if(!t1ms_sec) TimesUpFlag=TRUE; //Si regresa a 0, entonces se acaba el tiempo de 1, se establece TimeUpFlag
}
void SystemInit() / /Función de inicialización del sistema
{
TMOD=0x01; //Apaga el temporizador 1, enciende el temporizador 0
TMOD=0x01; 1, enciende el temporizador 0 y trabaja en modo 1 (temporizador de 16 bits)
TH0=th0;
TL0=tl0;//La frecuencia del temporizador 1 es 12MHz p>
TR0=1;//Iniciar temporizador
ET0=1;//Habilitar temporizador de interrupción 0
EA=1;//Habilitar función de interrupción del sistema
EA=1;//Habilita la función de interrupción del sistema. Función de interrupción del sistema
}
float Pow_Self(float x,uint y)//Función x de y simple autoprogramada, y solo puede ser un entero no negativo
{
suma flotante;
if(x==0 && y==0) return; //0 elevado a la potencia 0 no tiene sentido.
/0 elevado a la potencia 0 no tiene sentido
else if(x==0) sum=0 //Esto es opcional, y! =0 ya contiene x=0, no agregarlo no afectará el resultado, pero sí afectará la velocidad de operación
else if(y==0) sum=1 //Cualquier número excepto el anterior; son todos 1 elevados a la potencia 0
else if( y==1) sum=x // La primera potencia de cualquier número es él mismo
else if(y> 1) ) sum=Pow_Self(x,--y)*x; //llamada recursiva, hasta la potencia
return sum; //devuelve el resultado del cálculo
}
void TimesUpdata() //Función de actualización de hora
{
if(TimesUpFlag) //Si TimesUpFlag es verdadero
{< / p>
Sec=++Sec%TimesEnd; //Sec (segundo) está dentro del rango de TimesEnd (0~999) más 1
TimesUpFlag es verdadero. p> TimesUpFlag=FALSE; //Borrar indicador de TimesUp
}
}
void Display(uint dis_num) //Función de visualización, el contenido de visualización es un entero sin signo data dis_num
{
static uchar dis_loca; //definir la posición de visualización de la variable estática
if(DisplayFlag) //si el bit de indicador de visualización es verdadero (single ' bit' ha terminado), luego ejecute la siguiente tarea
{
DisplayFlag=FALSE; //borrar bit de indicador de visualización
dis_loca= ++ dis_loca %SEG_Num; //primero agrega 1 a la posición de visualización, luego limita el rango de la variable 0~(SEG_Num-1)
SEG_AllOff; //Apaga todas las pantallas del digitalizador (controladas por bits)
p>SEG_Data=SEG_B_List[(dis_num/(uint) ( Pow_Self(10,dis_loca)))%10] //Convierte el contenido mostrado (dis_num) al valor del bit (dis_loca) que necesita se mostrará esta vez y lo enviará al puerto de datos
SEG_En|=1<< dis_loca; // Habilite el controlador de bits que debe mostrarse esta vez
} p>
}
void main() //función principal
{
SystemInit() //Llamar a la función de inicialización del sistema
while(1 ) //Sistema circular
{
TimesUpdata(); //Llama a la función de actualización de tiempo
Display(Sec); /Llame a la función de visualización para mostrar el contenido: Sec
}
}