Diseño de programa de reloj electrónico Diseño de 51 computadoras de un solo chip con reloj despertador y tiempo ajustable

2020-07-25 14:54:54

Diseño de programa de reloj electrónico Diseño de 51 computadoras de un solo chip con reloj despertador


Piezas de hardware:


   Basado en 51 microcomputadoras de un solo chip, chip de reloj ds1302, chip de temperatura ds18b20 y pantalla de cristal líquido 1602 en tiempo real y en tiempo real. Al mismo tiempo, el año, mes, día, hora, minuto y día de la semana se pueden configurar presionando los botones. Y puede configurar la alarma del reloj. Cuando la hora de la alarma se acabó, el timbre sigue sonando. Al mismo tiempo, la luz LED parpadea continuamente y el botón de parada designado no se presiona en un minuto, la alarma se detendrá automáticamente. . .




Parte del software:




#incluir


#define uchar unsigned char


#definir uint unsigned int


sbit spk = P1 ^ 7;


sbit led = P1 ^ 5;


sbit DQ = P1 ^ 0;


sbit RS = P2 ^ 4;


sbit RW = P2 ^ 5;


sbit EN = P2 ^ 6;


sbit key1 = P2 ^ 0;


sbit key2 = P2 ^ 1;


sbit key3 = P2 ^ 2;


clave sbit4 = P2 ^ 3;


sbit IO = P3 ^ 6;


sbit RST = P3 ^ 7;


sbit SCLK = P3 ^ 5;


tabla de códigos uchar [] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};


int nian, xing, yue, ri, shi, fen, miao;


uchar num, temp, c, d, time [7], a, b, aa, bb, ns, ng, ys, yg, rs, rg, ss, sg, fs, fg, ms, mg, flag;




/ ******************* 1602 ************************ /




retraso nulo (int z)


{


 int x, y;


 para (x = z; x> 0; x--)


  para (y = 100; y> 0; y--);


}




void write_com (uchar com) // comando de escritura


{


 RS = 0;


 P0 = com;


 retraso (5);


 EN = 1;


 retraso (5);


 EN = 0;


}




void write_data (fecha uchar) // escribe datos


{


 RS = 1;


 P0 = fecha;


 retraso (5);


 EN = 1;


 retraso (5);


 EN = 0;


}


void init () // inicialización


{


 RW = 0;


 EN = 0;


 write_com (0x38); // Configuración del modo de visualización


 write_com (0x0c); // Pantalla abierta, sin cursor, sin parpadeo


 write_com (0x06); // escribe un cursor de puntero de dirección de carácter más uno, toda la pantalla no se mueve


 write_com (0x01); // Pantalla clara




 write_com (0x80 + 0x04);


 write_data ('2');


 write_com (0x80 + 0x05);


 write_data ('0');


 write_com (0x80 + 0x00);


 write_data ('c');


 write_com (0x80 + 0x01);


 write_data ('a');


 write_com (0x80 + 0x02);


 write_data ('i');


 write_com (0x80 + 0x4e);


 escribir_datos (0xdf);


 write_com (0x80 + 0x4f);


 write_data ('C');


 write_com (0x80 + 0x4b);


 write_data (0x2e); // Mostrar "."


}


 


/ ************** DS18B20 **************** /




void delay1 (unsigned int t) // Función de retraso


{


 mientras que (t--);


}




void init1 () // inicialización


{


 uchar n = 0;


 DQ = 1; // reinicio de DQ


 retraso1 (8);


 DQ = 0; // El host tira DQ bajo


 delay1 (80); // Retraso mayor que 480us


 DQ = 1;


 delay1 (5); // Delay 15 ~ 60us


 n = DQ;


 delay1 (5); // Si n = 0 éxito inicial n = 1 falla inicial (puede establecer el valor de retorno para ver si n es 1)


}


 


void write_byte (uchar dat) // Escribe un byte


{


 uint i;


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


 {


  DQ = 0;


  DQ = dat & 0x01;


  retraso1 (12);


  DQ = 1;


  dat >> = 1;


 }


 retraso1 (4);


}




uchar read_byte () // Leer en un byte


{


 uint k = 0;


 valor de uchar = 0;


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


 {


  DQ = 0;


  valor >> = 1;


  DQ = 1;


  si (DQ)


  valor | = 0x80;


  retraso1 (4);


 }


 valor de retorno;


}




uchar read_temp () // Función de temperatura de lectura


{


 uchar a = 0, b = 0;


 init1 ();


 escritura_byte (0xcc);


 escritura_byte (0x44);


 retraso1 (200);




 init1 ();


 escritura_byte (0xcc);


 escritura_byte (0xbe);


 a = leer_byte ();


 b = read_byte ();


 c = b;


 d = a;


 b << = 4;


 b + = (a & 0xf0) >> 4;


 volver b;


}




/ *********************** 1302 ********************** /




nulo wirte_byte1 (fecha uchar) // Escribe un byte


{


 uchar i;


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


 {


  IO = fecha & 0x01;


  SCLK = 0;


  SCLK = 1;


  fecha = fecha >> 1;


   }


}




uchar read_byte1 () // Leer un byte


{


 uchar dat, i;


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


 {


  dat = dat >> 1;


  SCLK = 0;


  si (IO)


  dat = dat | 0x80;


  SCLK = 1;


 }


 volver (dat);


}




void write_ds1302 (uchar add, uchar date) // escribe datos en 1302


{


 RST = 0;


 SCLK = 0;


 RST = 1;


 wirte_byte1 (agregar);


 wirte_byte1 (fecha);


 RST = 0;


 SCLK = 1;


}




uchar read_ds1302 (uchar add) // Leer los datos en 1302


{


 uchar temp;


 RST = 0;


 SCLK = 0;


 RST = 1;


 wirte_byte1 (agregar);


 temp = read_byte1 ();


 RST = 0;


 SCLK = 0;


 retorno (temp);


}




uchar huan_BCD (uint z) // Convertir datos en BCD


{


 uint a, b;


  a = z / 10;


  b = z;


  a = a & 0xff;


  b = b & 0xff;


  a << = 4;


  a = a | b;


 retorno (a);


}




void xian_shi () // Función de pantalla LCD


{


 si (b == 0 & a == 0)


 {


  ms = tiempo [0] / 16;


  mg = tiempo [0];




  fs = tiempo [1] / 16;


  fg = tiempo [1];


  fen = fs * 10 + fg;


 


  ss = tiempo [2] / 16;


  sg = tiempo [2];


  shi = ss * 10 + sg;




  rs = tiempo [3] / 16;


  rg = tiempo [3];


  ri = rs * 10 + rg;




  ys = tiempo [4] / 16;


  yg = tiempo [4];


  yue = ys * 10 + yg;




  ns = tiempo [6] / 16;


  ng = tiempo [6];


  nian = ns * 10 + ng;




  xing = tiempo [5];


 }


 si (a == 1 | b == 1)


 {


  ss = shi / 10;


  sg = shi;




  write_com (0x80 + 0x41);


  write_data (0xff);




  write_com (0x80 + 0x40);


  write_data (tabla [ss]);


  write_com (0x80 + 0x41);


  write_data (tabla [sg]);




 }


 si (a == 2 | b == 2)


    {


  fs = fen / 10;


  fg = fen;




  write_com (0x80 + 0x44);


  write_data (0xff);




  write_com (0x80 + 0x43);


  write_data (tabla [fs]);


  write_com (0x80 + 0x44);


  write_data (tabla [fg]);


 }




 si (a == 3)


    {


  rs = ri / 10;


  rg = ri;




  write_com (0x80 + 0x0d);


  write_data (0xff);




  write_com (0x80 + 0x0c);


  write_data (tabla [rs]);


  write_com (0x80 + 0x0d);


  write_data (tabla [rg]);


 }


 si (a == 4)


    {


  ys = yue / 10;


  yg = yue;




  write_com (0x80 + 0x0a);


  write_data (0xff);




  write_com (0x80 + 0x09);


  write_data (tabla [ys]);


  write_com (0x80 + 0x0a);


  write_data (tabla [yg]);


 }


 si (a == 5)


    {


  ns = nian / 10;


  ng = nian;




  write_com (0x80 + 0x07);


  write_data (0xff);




  write_com (0x80 + 0x06);


  write_data (tabla [ns]);


  write_com (0x80 + 0x07);


  write_data (tabla [ng]);


 }


 si (a == 6)


    {


  write_com (0x80 + 0x0f);


  write_data (0xff);


  write_com (0x80 + 0x0f);


  write_data (tabla [xing]);


 }


  write_com (0x80 + 0x06); // Muestra el año en los séptimo y octavo dígitos en la primera línea de la pantalla LCD


  write_data (tabla [ns]);


  write_com (0x8