Thiết kế chương trình đồng hồ điện tử Thiết kế 51 máy tính chip đơn với đồng hồ báo thức và thời gian có thể điều chỉnh

2020-08-16 12:13:15

Thiết kế chương trình đồng hồ điện tử Thiết kế 51 máy tính chip đơn với đồng hồ báo thức và thời gian có thể điều chỉnh


Phần cứng:


   Dựa trên 51 máy vi tính chip đơn, chip đồng hồ ds1302, chip nhiệt độ ds18b20 và màn hình tinh thể lỏng 1602 thời gian thực và hiển thị nhiệt độ thời gian thực. Đồng thời, năm, tháng, ngày, giờ, phút và ngày trong tuần có thể được thiết lập thông qua các nút. Và bạn có thể cài đặt đồng hồ báo thức. Khi hết thời gian báo thức, còi sẽ tiếp tục kêu bíp, đồng thời, đèn led tiếp tục nhấp nháy và không nhấn nút dừng được chỉ định trong vòng một phút, đồng hồ báo thức sẽ tự động dừng. . .




Phần mềm:




#include


#define uchar unsigned char


#define uint unsigned int


sbit spk = P1 ^ 7;


sbit dẫn = 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;


khóa sbit3 = P2 ^ 2;


khóa sbit4 = P2 ^ 3;


sbit IO = P3 ^ 6;


sbit RST = P3 ^ 7;


sbit SCLK = P3 ^ 5;


bảng mã 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 ************************ /




void delay (int z)


{


 int x, y;


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


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


}




void write_com (uchar com) // ghi lệnh


{


 RS = 0;


 P0 = com;


 chậm trễ (5);


 EN = 1;


 chậm trễ (5);


 EN = 0;


}




void write_data (uchar date) // ghi dữ liệu


{


 RS = 1;


 P0 = ngày tháng;


 chậm trễ (5);


 EN = 1;


 chậm trễ (5);


 EN = 0;


}


void init () // khởi tạo


{


 RW = 0;


 EN = 0;


 write_com (0x38); // Cài đặt chế độ hiển thị


 write_com (0x0c); // Màn hình mở, không có con trỏ, không nhấp nháy


 write_com (0x06); // Viết ký tự Con trỏ trỏ địa chỉ cộng một, toàn bộ màn hình không di chuyển


 write_com (0x01); // Hiển thị rõ ràng




 ghi_com (0x80 + 0x04);


 ghi_data ('2');


 ghi_com (0x80 + 0x05);


 ghi_data ('0');


 ghi_com (0x80 + 0x00);


 ghi_data ('c');


 ghi_com (0x80 + 0x01);


 ghi_data ('a');


 ghi_com (0x80 + 0x02);


 ghi_data ('i');


 ghi_com (0x80 + 0x4e);


 ghi_data (0xdf);


 ghi_com (0x80 + 0x4f);


 ghi_data ('C');


 ghi_com (0x80 + 0x4b);


 write_data (0x2e); // Hiển thị "."


}


 


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




void delay1 (unsigned int t) // Hàm trì hoãn


{


 trong khi (t--);


}




void init1 () // khởi tạo


{


 uchar n = 0;


 DQ = 1; // Đặt lại DQ


 chậm trễ1 (8);


 DQ = 0; // Máy chủ kéo DQ xuống thấp


 delay1 (80); // Độ trễ lớn hơn 480us


 DQ = 1;


 delay1 (5); // Trì hoãn 15 ~ 60us


 n = DQ;


 delay1 (5); // Nếu n = 0 thành công ban đầu n = 1 thất bại ban đầu (bạn có thể đặt giá trị trả về để xem n có phải là 1 hay không)


}


 


void write_byte (uchar dat) // Ghi một byte


{


 uint tôi;


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


 {


  DQ = 0;


  DQ = dat & 0x01;


  chậm trễ1 (12);


  DQ = 1;


  dat >> = 1;


 }


 trễ1 (4);


}




uchar read_byte () // Đọc trong một byte


{


 uint k = 0;


 giá trị uchar = 0;


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


 {


  DQ = 0;


  giá trị >> = 1;


  DQ = 1;


  nếu (DQ)


  giá trị | = 0x80;


  trễ1 (4);


 }


 giá trị trả về;


}




uchar read_temp () // Đọc hàm nhiệt độ


{


 uchar a = 0, b = 0;


 init1 ();


 ghi_byte (0xcc);


 ghi_byte (0x44);


 chậm trễ1 (200);




 init1 ();


 ghi_byte (0xcc);


 ghi_byte (0xbe);


 a = read_byte ();


 b = read_byte ();


 c = b;


 d = a;


 b << = 4;


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


 trả lại b;


}




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




void wirte_byte1 (uchar date) // Ghi byte


{


 uchar tôi;


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


 {


  IO = ngày & 0x01;


  SCLK = 0;


  SCLK = 1;


  date = ngày >> 1;


   }


}




uchar read_byte1 () // Đọc một byte


{


 uchar dat, i;


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


 {


  dat = dat >> 1;


  SCLK = 0;


  nếu (IO)


  dat = dat | 0x80;


  SCLK = 1;


 }


 return (dat);


}




void write_ds1302 (uchar add, uchar date) // ghi dữ liệu vào 1302


{


 RST = 0;


 SCLK = 0;


 RST = 1;


 wirte_byte1 (thêm);


 wirte_byte1 (ngày tháng);


 RST = 0;


 SCLK = 1;


}




uchar read_ds1302 (uchar add) // Đọc dữ liệu trong 1302


{


 nhiệt độ uchar;


 RST = 0;


 SCLK = 0;


 RST = 1;


 wirte_byte1 (thêm);


 temp = read_byte1 ();


 RST = 0;


 SCLK = 0;


 trở lại (tạm thời);


}




uchar huan_BCD (uint z) // Chuyển đổi dữ liệu thành BCD


{


 uint a, b;


  a = z / 10;


  b = z;


  a = a & 0xff;


  b = b & 0xff;


  a << = 4;


  a = a | b;


 return (a);


}




void xian_shi () // Hàm hiển thị LCD


{


 nếu (b == 0 & a == 0)


 {


  ms = thời gian [0] / 16;


  mg = thời gian [0];




  fs = thời gian [1] / 16;


  fg = time [1];


  fen = fs * 10 + fg;


 


  ss = time [2] / 16;


  sg = time [2];


  shi = ss * 10 + sg;




  rs = time [3] / 16;


  rg = time [3];


  ri = rs * 10 + rg;




  ys = thời gian [4] / 16;


  yg = time [4];


  yue = ys * 10 + yg;




  ns = thời gian [6] / 16;


  ng = time [6];


  nian = ns * 10 + ng;




  xing = time [5];


 }


 nếu (a == 1 | b == 1)


 {


  ss = shi / 10;


  sg = shi;




  ghi_com (0x80 + 0x41);


  ghi_data (0xff);




  ghi_com (0x80 + 0x40);


  ghi_data (table [ss]);


  ghi_com (0x80 + 0x41);


  ghi_data (table [sg]);




 }


 nếu (a == 2 | b == 2)


    {


  fs = fen / 10;


  fg = fen;




  ghi_com (0x80 + 0x44);


  ghi_data (0xff);




  ghi_com (0x80 + 0x43);


  ghi_data (table [fs]);


  ghi_com (0x80 + 0x44);


  ghi_data (table [fg]);


 }




 if (a == 3)


    {


  rs = ri / 10;


  rg = ri;




  ghi_com (0x80 + 0x0d);


  ghi_data (0xff);




  ghi_com (0x80 + 0x0c);


  ghi_data (table [rs]);


  ghi_com (0x80 + 0x0d);


  write_data (table [rg]);


 }


 if (a == 4)


    {


  ys = yue / 10;


  yg = yue;




  ghi_com (0x80 + 0x0a);


  ghi_data (0xff);




  ghi_com (0x80 + 0x09);


  ghi_data (table [ys]);


  ghi_com (0x80 + 0x0a);


  write_data (table [yg]);


 }


 if (a == 5)


    {


  ns = nian / 10;


  ng = nian;




  ghi_com (0x80 + 0x07);


  ghi_data (0xff);




  ghi_com (0x80 + 0x06);


  ghi_data (table [ns]);


  ghi_com (0x80 + 0x07);


  write_data (table [ng]);


 }


 if (a == 6)


    {


  ghi_com (0x80 + 0x0f);


  ghi_data (0xff);


  ghi_com (0x80 + 0x0f);


  write_data (table [xing]);


 }


  write_com (0x80 + 0x06); // Hiển thị năm ở chữ số thứ bảy và thứ tám trên dòng đầu tiên của màn hình LCD


  ghi_data (table [ns]);


  write_com (0x8