Red de conocimiento informático - Material del sitio web - Programa en lenguaje C de cuenta atrás de 999 basado en 51 microcontroladores.

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--);

}

//******************//

//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*/

}; //***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