Programa en lenguaje C de cuenta atrás de 999 basado en 51 microcontroladores.
/************************************
El requisito es poder contar hasta 9999 segundos
Implementado en lenguaje C
********************* *********** ******************/
#include
#define uchar unsigned char
#define uint unsigned int
uchar num_qian,num_bai,num_shi,num_ge;//Define miles, centenas, decenas y unidades.
uint time;//Tiempo que se mostrará 0~9999
uint tcnt;//Unidad de tiempo
//******** *********//
//La siguiente es la definición del puerto
//*************** ********* //
sbit key_qian=P1^0;//Botón "Qianjia 1"
sbit key_bai =P1^2;//Botón " Qianjia 1"
sbit key_shi =P1^4;//Botón "Diez más 1"
sbit key_ge =P1^6;//Botón "Diez más 1"
sbit laba = P3^1;//Altavoz
retraso vacío (unsigned int z)//subfunción de retraso de 1 milisegundo
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); p>
}
//******************//
//El siguiente es el segmento de siete controlador de tubo digital
//************************//
/**** ************** *************************************
** Descripción de la función: controlador de cadena de aceptación de interrupción
**Ocupa el recurso pin P30
**Ocupa el recurso del sistema interrupción del puerto serie 4
p>************************************************ *************/
#define DUAN P0
#define WEI P2
dispcode de código de caracteres sin firmar[]=
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66, /*4*/
0x6D,/*5*/
0x7D ,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/ p>
}; //***Tabla de códigos del segmento Yin
//0,1,2,3,4,5,6,7,8,9,A,b,C ,c,d,E,F,NULL,-
código uchar dispbitcode[ ]=
{0xef,0xdf,0xbf,0x7f} //***Tabla de códigos Yin;
uchar dispbuf[4],dispcount;//Abre cuatro áreas de búfer de visualización
void ledinit()/***Subfunción de inicialización, el temporizador 0 actualiza el contenido de la pantalla** */
{
TMOD|=0x01; // Temporizador 0 modo 1
TH0=(65536-5000)/256 //Temporizador 16- modo bit
TL0=(65536-5000)%256; // Tiempo de desbordamiento: 5 ms
TR0=1 //Habilitar temporizador 0
ET0= 1; //Habilitar temporizador 0
EA=1; //Habilitar sistema
}
void leddisp()//Visualización fija de ciertos números
Palabra
{
dispbuf[0]=tiempo/1000;
dispbuf[1]=tiempo%1000/100;
dispbuf[2]=time%100/10;
dispbuf[3]=time%10;
}
void keytest()//detección de clave Programa
{
if(!key_qian)//Si se presiona la tecla mil
{
delay(5);/ / Retraso de rebote de 5 milisegundos
if(!key_qian)//Si realmente se presiona la tecla de mil dígitos
{
num_qian++;//Suma los mil dígitos 1
while(!key_qian);//Espera a que se suelte la clave
}
time+=num_qian*1000;//Agrega 1 al dígito de mil
p>}
if(!key_bai)//Si se presiona la tecla de centenas
{
retraso( 5);//Retraso de 5 milisegundos en rebote
if(!key_bai)//Si realmente se presiona la tecla de centenas
{
num_bai++;// Agrega uno al dígito de las centenas
p>while(!key_bai);//Espera a que se suelte la clave
}
time+=num_bai*100 ;//Suma 1 al dígito de las centenas
}
if(!key_shi)//Si se presiona la tecla de las decenas
{
delay(5);// Retraso de rebote de 5 milisegundos
if(!key_shi)//Si realmente se presiona la tecla de las decenas
{
num_shi++ ;//El dígito de mil más uno
while(!key_shi);//Espera a que se suelte la tecla
}
time+=num_shi*10 ;//Suma 1 al dígito de las decenas
}
if(!key_ge)//Si se presiona la tecla de mil
{
delay(5);// Retraso de rebote de 5 milisegundos
if(!key_ge)//Si el botón de unidades realmente está presionado
{
num_qian++ ;//Agrega uno al dígito de los mil
while (!key_ge);//Espera a que se suelte la tecla
}
time+=num_ge; //Suma 1 al dígito único
}
}
void main()//programa principal
{
ledinit();//inicialización de interrupción del tubo digital, el temporizador 0 actualiza el contenido de la pantalla
while(1)//Big loop
{
if((!key_qian)||(!key_bai)||(!key_shi)|| (!key_ge))//Si se presiona alguna de las cuatro teclas
keytest();//Ejecutar el programa de detección de claves
leddisp();//Actualizar continuamente el contenido de la pantalla
}
}
//**** *************************************************
//El siguiente es el controlador de contenido de la pantalla del tubo digital de actualización del temporizador 0
p>//********************* ****
*******************************
/************ ****** **********************************
** Función descripción: Controlador de tubo digital de siete segmentos
**Ocupa recursos de pin: selección de segmento de tubo digital, selección de broca de tubo digital
**Ocupa el recurso del sistema T0
****** ********************************************** */
void t0(void) interrupción 1 //usando 0
{
TH0=(65536-5000)/256 //interrupción de 5 ms<; /p>
TL0=(65536-5000)%256; //Modo de temporizador de 16 bits
WEI=0xff;//Selección de bit desactivado
DUAN=dispcode[ dispbuf[dispcount]]; //Selección de segmento
WEI=dispbitcode[dispcount]; //Abrir selección de bits
dispcount++; 5)
dispcount=0;
tcnt++; //Aumentar el recuento en uno
if(tcnt==5*200)//Satisfacer 1S
{
tcnt=0;//Devuelve el conteo a cero
tiempo--;//Disminuye el tiempo en uno
si (tiempo==0) //Tiempo
while(1);
}
if(tiempo<10)//El tiempo es menor que 10
laba= ~laba;//Alarma sonora
}
Esta es una cuenta regresiva de 9999 segundos