Red de conocimiento informático - Material del sitio web - ¿Todavía tienes un programa de visualización LCD para un reloj calendario en tiempo real basado en DS1302 y AT89C51? hay mas

¿Todavía tienes un programa de visualización LCD para un reloj calendario en tiempo real basado en DS1302 y AT89C51? hay mas

2.3.6 Diseño del módulo de visualización

En este diseño, dado que es necesario mostrar la hora y la temperatura, se selecciona el módulo LCD 1602 como salida. La pantalla LCD de 1602 caracteres generalmente tiene líneas de 14 pines o una pantalla LCD con líneas de 16 pines, las 2 líneas adicionales son líneas de alimentación de retroiluminación. Puede mostrar dos líneas, cada línea tiene 16 caracteres, se alimenta con una sola fuente de alimentación de +5 V, tiene una configuración de circuito periférico simple, es económico y tiene un rendimiento de alto costo. La memoria de generación de caracteres (CGROM) dentro del módulo LCD 1602 ha almacenado 160 gráficos de caracteres de matriz de puntos diferentes. Estos caracteres incluyen: números arábigos, letras inglesas mayúsculas y minúsculas, símbolos de uso común y kana japonés, etc. Cada carácter tiene un código fijo. Por ejemplo, el código de la letra mayúscula en inglés "A" es 01000001B (41H). Al mostrar, el módulo muestra el gráfico de caracteres de matriz de puntos en la dirección 41H, y podemos ver la letra "A". Las funciones de los pines se muestran en la Tabla 2-1.

Tabla 2-1 Funciones de los pines del LCD1602

Pin Símbolo Función Descripción

1 VSS generalmente está conectado a tierra

2 VDD está conectado al fuente de alimentación (+5V)

3 V0 Terminal de ajuste de contraste LCD.

4 RS RS es selección de registro.

5 R/W R/W es la línea de señal de lectura y escritura.

6 E El terminal E (o EN) es el terminal de habilitación y se habilita en el flanco descendente.

7 DB0 bajo 4 bits triestado, bus de datos bidireccional 0 bit (bit más bajo)

8 DB1 bajo 4 bits triestado, bus de datos bidireccional 1 bit

9 DB2 Bajo 4 bits, bus de datos bidireccional de tres estados 2 bits

10 DB3 Bajo 4 bits bus de datos bidireccional de tres estados 3 bits

11 DB4 Alto 4 bits Bus de datos bidireccional de tres estados de 4 bits

12 DB5 alto Bus de datos bidireccional de tres estados de 4 bits 5 bits

13 Bus de datos bidireccional de tres estados de 4 bits alto DB6 6 bits

14 DB7 de alto estado de 4 bits, bus de datos bidireccional de 7 bits (bit más alto)

Introducción al pin principal LCD1602: V0 es el terminal de ajuste de contraste de la pantalla LCD. El contraste es más débil cuando se conecta a la fuente de alimentación positiva y el contraste es más débil cuando se conecta a la fuente de alimentación de tierra. El contraste es el más alto. Cuando el contraste es demasiado alto, se producirán imágenes fantasma. un potenciómetro de 10K. RS es el final de la selección de registro. Cuando el nivel es alto, se selecciona el registro de datos y cuando el nivel es bajo, se selecciona el registro de instrucciones. R/W es el final de la línea de señal de lectura y escritura. Cuando el nivel es alto, se realiza la operación de lectura y cuando el nivel es bajo, se realiza la operación de escritura. Cuando RS y R/W*** son de nivel bajo, se pueden escribir instrucciones o direcciones de visualización; cuando RS es de nivel alto y R/W es de nivel bajo, se pueden escribir datos. E es el terminal de habilitación. Cuando el terminal E salta del nivel alto al nivel bajo, el módulo LCD ejecuta el comando.

Conecte el terminal RS de LCD1602 a P2.0, el terminal R/W a P2.1 y el terminal E a P2.2. Cuando RS=0, escriba instrucciones en LCD1602; 1 Al escribir datos en LCD1602. Cuando el terminal R/W está conectado a un nivel alto, el chip está en el estado de lectura de datos; de lo contrario, está en el estado de escritura de datos y el terminal E es el terminal de señal de habilitación. Cuando R/W es de nivel alto, el terminal E también es de nivel alto y RS es de nivel bajo, la pantalla LCD muestra el número que debe mostrarse. La Figura 2.11 es el diagrama de conexión de hardware entre la pantalla LCD 1602 y el microcontrolador.

Figura 2.11 Diagrama de conexión del hardware del microcontrolador y la pantalla de cristal líquido LCD

Descripción del programa de la parte del Apéndice 2

void delay(uint xms) //***** **Función de retardo, función parametrizada*****//

{ uint x,y;

for(x=xms;x>0;x--)

for(y=110;y>0;y--);

}

//******subrutina relacionada con el chip ds18b20 *** ***/

void DS18B20_init() //****Inicialización

{ uint i; tem_ds=0

i=160 ; i>0) //Dale al bus único DS18B20 una señal de bajo nivel de al menos 480uS

i--; //Sube 15~60uS

i = 8; while(i>0) i--;

}

void temwritebit(bit instruc_data) //****Escribe un poco****** */ /

{ int time;

if(instruc_data)

{ tem_ds=0;

time=3 // Retraso 14us;

while(time>0)

time--;

tem_ds=1; //escribe "1"

time= 8; //Retraso 35us

while(time>0)

time--;

}

else

{

tem_ds=0; //Escribe 0

time=14; //Retraso 62us

while(time> 0)

tiempo--;

}

tem_ds=1; //Liberar línea de datos

tiempo++;tiempo++;

}

bit temreadbit() //************Leer un bit*********//

{ uint i ;

bit datbit;

tem_ds=0;

i++;

tem_ds=1;

i++ ;i++;

datbit=tem_ds; //Leer datos

i=10 //Retraso 45 

while(i>0)

i--;

tem_ds=1;

return(datbit);

}

uchar temreadbyte () / /********Leer bytes**********//

{ uchar i,j,dat;

dat= 0;

for(i=0;i<8;i++)

{ j=te

mreadbit() ;

dat=(j<<7)|(dat>>1);

}

return(dat);

}

void temwritebyte(uchar instru) //*******escribir byte**********//

{ int i;

for(i=0;i<8;i++)

{temwritebit(instru&01);

instru>>=1 p>

}

}

uint get_tem() //********Obtener la temperatura********** **//

{ uchar tem_L,tem_H;

DS18B20_init();

retardo(1);

temwritebyte(0xcc); ); //Escribir instrucciones ROM de salto

temwritebyte(0xbe); //Leer datos

tem_L=temreadbyte();

tem_H=temreadbyte(); ;

tem=tem_H<<8|tem_L;

f_tem=tem*0.0625;

tem=f_tem

retorno ( tem);

}

//******Programas relacionados con LCD******/

write_1602com(uchar com) // ****Función de comando de escritura LCD****//

{ rs=0; //La selección de datos/comando se establece en comando

rw=0; y la selección de escritura está configurada para escribir

P0=com; //Enviar datos

delay(1);

en=1 //Tire de habilitación; terminal alto para crear una caída efectiva Prepárese para el flanco

delay(1);

en=0; //es cambia de alto a bajo, generando un flanco descendente, y el LCD ejecuta el comando

}

write_1602dat(uchar dat) //***Función de escritura de datos de LCD****//

{ rs=1 ; //La selección del comando de datos se establece en datos

rw=0; //La selección de lectura y escritura se establece en escribir

P0=dat;

delay(1);

en=1; //en está configurado en nivel alto para prepararse para el flanco descendente

delay(1);

en=0; //en cambia de alto a bajo, se produce un flanco descendente y la pantalla LCD ejecuta el comando

}

lcd_init() //***LCD función de inicialización**

**//

{ write_1602com(0x38); //Establece el modo de funcionamiento de la pantalla LCD, lo que significa: pantalla de 16*2 líneas, matriz de puntos de 5*7, datos de 8 bits

write_1602com (0x01 ); //Borrar la pantalla

write_1602com(0x06); //La pantalla completa no se mueve, el cursor se mueve automáticamente hacia la derecha

write_1602com(yh+1) ; //El calendario muestra el símbolo fijo de Comenzar a mostrar después de la primera posición en la primera línea

write_1602com(0x0c); //Activa la pantalla sin mostrar el cursor

para (a=0;a<14;a++)

{ write_1602dat(tab1[a]); //Escribe la parte del símbolo fijo de la visualización del calendario en la pantalla LCD

retraso (3);

}

write_1602com(er+2); //La hora muestra la posición de escritura del símbolo fijo, comenzando desde la segunda posición

para (a=0;a<8;a++)

{write_1602dat(tab2[a]); //Escribe el símbolo fijo del tiempo de visualización, dos dos puntos

delay(3);

}

}

/******************Subfunciones relacionadas con DS1302*** *********************/

void write_byte(uchar dat) //******Escribe un byte**** *//

{ ACC=dat;

RST=1;

for(a=8;a>0;a--)

{ IO=ACC0;

SCLK=0; /*En el flanco ascendente del siguiente reloj SCLK después de ingresar la palabra de instrucción de control*/

SCLK=1 ; /*Los datos se escriben en DS1302*/

ACC=ACC> >1;

}

}

uchar read_byte( ) //******Leer un byte******//

{ RST=1;

for(a=8;a>0;a --)

{ ACC7=IO;

SCLK=1;

SCLK=0;

ACC=ACC>>1 ;

}

return (ACC) ;

}

void write_1302(uchar add,uchar dat) //*** *Escribir función en el chip 1302, especificar dirección de escritura, datos**//

{ RST=0;

SCLK=0;

RST=1;

escribir_byte(agregar);

escribir_byte(dat);

SCLK=1;

RST=0;

}

uchar read_1302(uchar add) // ****Leer función de datos desde 1302, especificar la dirección de fuente de datos de lectura***//

{

uchar temp;

RST=0;

SCLK=0;

RST=1;

write_byte(agregar); p>

temp=read_byte();

SCLK=1;

RST=0;

retorno(temp);

}

uchar BCD_Decimal(uchar bcd) //*****código BCD a función decimal****//

{ uchar Decimal;

Decimal=bcd>>4; //Los cuatro dígitos superiores de BCD representan el dígito de las decenas, los cuatro dígitos inferiores representan el dígito de las unidades, 8421 códigos;

return(Decimal=Decimal*10 +(bcd&=0x0F));

}

void ds1302_init() //***Subfunción de inicialización del chip 1302 (2010-01-07,12:00:00 ,semana4)***//

{ RST=0;

SCLK=0;

write_1302(0x8e,0x00); //Escritura permitida, protección contra escritura prohibida

write_1302(0x80,0x00); //Escribe el segundo dato inicial 00 en el segundo registro de escritura interno DS1302 80H

write_1302(0x82,0x00); datos al registro de minutos de escritura interno 82H de DS1302 Datos 00

write_1302(0x84,0x12); //Escribe los datos de hora iniciales 12 en el registro de horas de escritura 84H en DS1302

write_1302(0x8a, 0x04); //Escribe en DS1302 Escribe el registro de semana 8aH y escribe los datos de la semana inicial 4

write_1302(0x86,0x07); //Escribe los datos de fecha inicial 07 para escribir el registro de fecha 86H en DS1302

write_1302(0x88, 0x01); //Escribe los datos del mes inicial 01 en el registro interno de escritura del mes 88H de DS1302

write_1302(0x8c,0x10); //Escribe los datos del año inicial 10 en la escritura interna de DS1302; -año de registro 8cH

write_1302(0x8e,0x80); //Activar protección contra escritura

}

void write_temp(uchar add,uchar dat) // ****Escribe la temperatura en los datos de la pantalla LCD y especifica la posición de visualización****//

{ uchar gw,sw;

gw=dat%10; dígitos únicos

sw=dat/10; //Obtener diez dígitos

write_1602com(er+add); //er es el valor 0x80x40 especificado en el archivo de encabezado

p>

write_1602dat(0x3 sw); //El número +30 obtiene el código de visualización LCD1602 del número

write_1602dat(0x3gw); //El número +30 obtiene el código de visualización LCD1602; del número

write_1602dat( 0xdf); //El símbolo del círculo pequeño que muestra la temperatura, 0xdf es el símbolo de la biblioteca de caracteres de la pantalla LCD.

Código de dirección

write_1602dat(0x43); //Muestra el símbolo "C", 0x43 es el código de dirección de la C mayúscula en la biblioteca de caracteres LCD

}

void write_sfm(uchar add,uchar dat) //Escribe horas, minutos y segundos en la pantalla LCD, con la posición de visualización y los datos de visualización, dos parámetros

{ uchar gw,sw;

gw=dat% 10; //Obtener los dígitos de las unidades

sw=dat/10; //Obtener los dígitos de las decenas

write_1602com(er+add); valor especificado en el archivo de encabezado 0x80x40//Para mostrar el año, mes y día, simplemente cambie er a yh, los demás son iguales;

write_1602dat(0x3sw); obtiene el código de visualización LCD1602 del número

write_1602dat(0x3gw); //El número +30 obtiene el código de visualización LCD1602 del número

}

void write_week(uchar semana) //****Escribir función de semana *****//

{ write_1602com(yh+0x0c); //Mostrar posición de los caracteres de la semana

switch(week)

{ case 1:write_1602dat('M'); //Cuando el número de semana es 1, se muestra

write_1602dat('O');

write_1602dat('N');

break; //Las siguientes seis formas de selección son iguales, solo modifique los caracteres entre corchetes en consecuencia

}

}

voidkeyscan() //******************Funciones relacionadas con el escaneo del teclado******* ***************

{ if(key1==0) //key1 es una tecla de función (tecla de configuración)

{retraso (9); //Retraso, utilizado para eliminar la fluctuación

if( key1==0) //Confirma la pulsación de la tecla nuevamente después del retraso

{buzzer=0; el timbre suena una vez brevemente

delay(20);

buzzer=1;

while(!key1); //llave esperando ser liberada

key1n++;

if(key1n==9)

key1n=1; //Establece las claves para que tengan segundos, minutos, horas, días de la semana, días, meses, años, retorno, 8 ciclos de funciones

switch(key1n)

{ case 1: TR0=0; //Apaga el temporizador

write_1602com( er+0x09); //Configura el botón que se presionará una vez y el cursor se mostrará en la segunda posición

write_1602com(0x0f);

//Establece el cursor en flash

temp=(miao)/10*16+(miao)%10; //Escribe el segundo dato en DS1302

write_1302(0x8e,0x00)

write_1302(0x80,0x80|temp); //miao

write_1302(0x8e,0x80);

descanso;

caso 2: write_1602com(er+6); //Presiona fen dos veces para mostrar el cursor

write_1602com(0x0f); //Los siguientes casos3~case7 son básicamente iguales, solo cambia la dirección

caso 8: write_1602com(0x0c); //Presione hasta la octava vez, configure el cursor para que no parpadee

TR0=1;//Encienda el temporizador

temp=(miao)/ 10*16+(miao)%10;

write_1302(0x8e,0x00);

write_1302(0x80,0x00|temp);//miao datos está escrito en DS1302

write_1302(0x8e,0x80);

break

}

}

}

>/------------------------------Agregar clave2-------- ------ -------------

if(key1n!=0) //Cuando se presiona la tecla1. Solo tendrá efecto si presionas las siguientes teclas nuevamente (el número de pulsaciones de teclas no es igual a cero)

{if(key2==0) //Tecla arriba

{delay(10);

if(key2==0)

{buzzer=0; //El timbre suena una vez brevemente

delay(20) ;

zumbador=1 ;

while(!key2);

switch(key1n)

{ caso 1:miao++; /Presione la tecla de configuración una vez y ajuste los segundos

if(miao==60)

miao=0

write_sfm(0x08,miao); /p>

temp=(miao) /10*16+(miao)%10; //Convertir decimal a código BCD requerido por DS1302

write_1302(0x8e,0x00); , protección contra escritura prohibida

write_1302(0x80,temp); //Escribe el código BCD de datos ajustado en el segundo registro de escritura 80H en DS1302

write_1302(0x8e,0x80); Activar protección contra escritura

write_1602com(er+0x09); //Debido a que el modo de configuración de la pantalla LCD es incrementar automáticamente el puntero en uno después de escribir datos, es necesario devolver el cursor.

break;

// Los siguientes Caso2 ~ caso7 son los mismos que el caso1, solo cambie la dirección correspondiente.

}

}

}

La siguiente clave3 es básicamente la misma que la clave2 clave2

; }

}

void init() //Función de configuración del temporizador y contador

{ TMOD=0x01 //Especifica el modo de funcionamiento del temporizador/contador como 1;

TH0=0; //Los cuatro bits superiores del temporizador T0=0

TL0=0; //Los cuatro bits inferiores del temporizador T0=0

EA=1; //El sistema permite abrir interrupciones

ET0=1; //Permitir interrupciones T0

TR0=1 //Habilitar interrupciones e iniciar el temporizador

}

void main() //************función principal************

{ lcd_init(); // Llamando a la subfunción de inicialización de la pantalla LCD

ds1302_init(); // Llamando a la subfunción de inicialización del reloj DS1302

init(); Llamar a la subfunción de configuración del contador de tiempo

buzzer=0; //El timbre suena una vez durante mucho tiempo

delay(80);

buzzer= 1;

while(1 ) //Las siguientes declaraciones en un bucle infinito:

{keyscan();} //Llama a la subfunción de escaneo del teclado

}

Void timer0() interrupción 1 //Obtener y mostrar calendario y hora

{ TH0=0; //Repetir valor inicial

TL0= 0;

DS18B20_init();

retardo(1);

temwritebyte(0xcc); //Escribir instrucción ROM de salto; > temwritebyte(0x44); //Iniciar la conversión de temperatura;

flag=get_tem(); //Enviar el resultado de la función devuelto por la operación 18b20 a la variable flag para su visualización

// Lea los siete datos de segundos, minutos, semanas, meses y años (DS1302 El registro de lectura es diferente del registro de escritura):

miao = BCD_Decimal(read_1302(0x81));//Los siguientes minutos, segundos, año, mes y día están en el mismo formato, solo cambie la dirección

//Muestra datos de temperatura, segundos, horas y minutos:

write_temp(12,flag); //Muestra la temperatura, comenzando desde el carácter 12 de la segunda línea

write_sfm (8,miao);// Segundos, comenzando desde la 8va palabra de la segunda línea (muestra la subfunción en minutos y segundos cuando se llama)

write_sfm(5,fen);//Minutos, a partir del segundo

Comienza a mostrar después del quinto carácter en la línea

write_sfm(2,shi);// Hora, comienza a mostrar después del segundo carácter en la segunda línea

//Muestra el día y mes, datos del año:

write_nyr(9,ri);//Fecha, comenzando desde el noveno carácter de la segunda línea.

write_nyr(6,yue);//Mes , se muestra a partir del sexto carácter de la segunda línea

write_nyr(3,nian); //Año, se muestra a partir del tercer carácter de la segunda línea

write_week( semana) ;

}