Mạch Đồng Hồ LCD 16x2 Sử dụng 89C51



Code này có 1 bạn chia sẻ trên DTVN nhưng không có Mô Phỏng Chip vẽ lại và Thêm phần Hẹn Giờ cho các bạn phát triển ứng dụng ^^ Mong các bạn sẽ thích ghé thăm Website Echipkool.com..

#include<reg52.h>
#include<string.h>
#define Bat 1
// Dat lai ten cho cac chan dac biet duoc dung
sbit SCL=P1^0;
sbit SDA=P1^1;
sbit Rs=P1^5;
sbit Rw=P1^6;
sbit En=P1^7;
sbit tang=P3^5;
sbit giam=P3^4;
sbit menu=P3^2;
sbit Bf  =P2^7;
sbit Led =P3^0;


unsigned char bcd_dec(unsigned char bcd); // Chuyen doi so BCD sang Thap phan hien thi len LCD

unsigned char dec_bcd(unsigned char dec); // Chuyen doi so thap phan sang BCD dung de nap vao DS1307

unsigned char bcd_dec(unsigned char bcd)
              {
   return((bcd/16)*10+(bcd%16));
}

unsigned char dec_bcd(unsigned char dec)
               {
    return((dec/10)*16+(dec%10));
}            

void caidat(); // Ham phim bam cai dat ngay gio
void hienngay(); // Ham hien thi ngay thang nam
void hiengio(); // Ham Hien thi Gio Phut Giay
void hien_hengio();// Ham Hien thi Hen Gio
unsigned char mode=0;
unsigned char a_min,a_hour,h_phut1,h_phut2,h_gio1,h_gio2;// Cac bien phuc vu cho hen gio
bit tang0=1,tang1=1,giam0=1,giam1=1,mode0=1,mode1=1;
char giay,phut,gio,h1,h2,m1,m2,s1,s2,ngay,thang,nam,ng1,ng2,th1,th2,n1,n2,thu,day; // cac gia tri
// giay,phut,gio,thu,ngay,thang,nam duoc tach thanh 2 so de hien thi


// Ham tre t(ms)
void delay(int t)
{
  int a,b;
  for(a=0;a<t;a++)
  {
    for(b=0;b<125;b++)
{}
  }
}
// Ham tre t(us)
void delay_us(int t)
{
  int a;
  for(a=0;a<t;a++)
  {}
}

// CAC CHUONG TRINH GIANH CHO LCD
// Ham kiem tra ban
void ban()
{
  P2=0xFF;
  Rs=0;
  Rw=1;
  while(Bf)
  {
    En=0;
delay_us(50);
En=1;
  }
}
// Ham ghi lenh
void lenh(unsigned char x)
{
  ban();
  P2=x;
  Rs=0;
  Rw=0;
  delay_us(20);
  En=1;
  delay_us(20);
  En=0;
}
// Ham ghi du lieu
void kitu(unsigned char x)
{
  ban();
  P2=x;
  Rs=1;
  Rw=0;
  delay_us(20);
  En=1;
  delay_us(20);
  En=0;
}
// Ham ghi chuoi
void chuoi(unsigned char *s)
{
  char i;
  for(i=0;i<strlen(s);i++)
  {
    kitu(s[i]);
  }
}
// Ham ghi cham 1 chuoi
void chuoi_cham(unsigned char *s)
{
  char i;
  for(i=0;i<strlen(s);i++)
  {
    kitu(s[i]);
delay(75);
  }
}
// Ham khoi tao LCD
void khoitao()
{
  lenh(0x38);
  lenh(0x01);
  lenh(0x0c);
  lenh(0x80);
}

// CAC CHUONG TRINH DANH CHO DS1307
// Ham start I2C   // Khoi tao Giao Tiep I2C
void start()
{
  SCL=1;
  SDA=1;
  delay(1);
  SDA=0;
  delay(1);
  SCL=0;
  SDA=1;
}
// Ham stop I2C   // Ket thuc Giao Tiep I2C
void stop()
{

  SDA=0;SCL=1;
  delay(1);
  SDA=1;
  delay(1);
}
// Ham ghi 1 byte vao DS1307  // Mater 89xx Ghi 1 Byte vao DS1307
void truyen(unsigned char g)
{
  unsigned char tem,i;
  for(i=0;i<8;i++)
  {
    tem=g&0x80;
if(tem==0x80)
SDA=1;
else SDA=0;
SCL=1;
delay(1);
SCL=0;
g=g*2;

  }
  SCL=1;
  delay(1);
  SCL=0;
}
// Ham nhan 1 byte  // Ham 89xx nhan 1 byte tu DS1307
unsigned char nhan()
{
 unsigned char gt=0,i;
 for(i=0;i<8;i++)
 {
   SCL=1;
   gt=gt*2;
   delay(1);
   gt=gt|SDA;
   SCL=0;
   delay(1);
 }
 SCL=1;
 SDA=1;
 delay(1);
 SCL=0;
 return gt;
}
//Ham ghi gia tri vao 1 dia chi len DS1307
void ghi(unsigned char add,unsigned char gt)
{
  start();
  truyen(0xd0);
  truyen(add);
  truyen(gt);
  stop();
}
// Ham doc gia tri tu 1 dia chi tu DS1307 xuong
unsigned char doc(unsigned char add)
{
  unsigned char value;
  start();
  truyen(0xd0);
  truyen(add);
  start();
  truyen(0xd1);
  value=nhan();
  stop();
  return value;
}
// CAC CHUONG TRINH GIAO TIEP 89S52-DS1307
//Ham khoi tao gia tri ban dau cho DS1307
void khoitao_DS()
{
  unsigned char check;
  check=doc(0x10);
  if(check!='c')
  {
    ghi(0x10,'c');
ghi(0x00,(dec_bcd(30))&0x7F);// Giay
ghi(0x01,(dec_bcd(35))&0x7F);// Phut
ghi(0x02,(dec_bcd(14))&0x3F);// Gio
ghi(0x03,dec_bcd(4)); // Thu
ghi(0x04,dec_bcd(1)); // Ngay
ghi(0x05,dec_bcd(5)); // Thang
ghi(0x06,dec_bcd(13)); // Nam
ghi(0x08,dec_bcd(0));   // Hen phut
ghi(0x09,dec_bcd(0)); // Hen Gio

  }
}

//Ham doc gia tri thoi gian tu DS1307
void docgio()
{
  giay =bcd_dec(doc(0x00));
  phut =bcd_dec(doc(0x01));
  gio  =bcd_dec(doc(0x02));
  thu=bcd_dec(doc(0x03));
  ngay =bcd_dec(doc(0x04));
  thang=bcd_dec(doc(0x05));
  nam  =bcd_dec(doc(0x06));
  a_min=bcd_dec(doc(0x08));
  a_hour=bcd_dec(doc(0x09));
 
}
//Tach gia tri de hien thi
void tach()
{
  s1=giay/10+48;s2=giay%10+48;
  m1=phut/10+48;m2=phut%10+48;
  h1=gio/10+48;h2=gio%10+48;
  day=thu+48;
  ng1=ngay/10+48;ng2=ngay%10+48;
  th1=thang/10+48;th2=thang%10+48;
  n1=nam/10+48;n2=nam%10+48;
  h_phut1=a_min/10+48;h_phut2=a_min%10+48;
  h_gio1=a_hour/10+48;h_gio2=a_hour%10+48;
}


//Ham hien thi thoi gian
void hienthi()
{
  docgio(); ///////
  tach();
  lenh(0x80);
  if(thu!=7)
  {
    chuoi("Thu ");
kitu(day+1);
kitu(' ');
  }
  else chuoi("CNHAT ");
  kitu(ng1);kitu(ng2);
  kitu('/');
  kitu(th1);kitu(th2);
  kitu('/');
  chuoi("20");
  kitu(n1);kitu(n2);
  lenh(0xc0);
  chuoi("Time: ");
  kitu(h1);kitu(h2);
  kitu(':');
  kitu(m1);kitu(m2);
  kitu(':');
  kitu(s1);kitu(s2);
  chuoi("  ");
}
//Hien thi thu ngay thang nam
void hienngay()
{
  tach();
  lenh(0xc0);
  if(thu!=7)
  {
    chuoi("Thu ");
kitu(day+1);
kitu(' ');
  }
  else chuoi("CNHAT ");
  kitu(ng1);kitu(ng2);
  kitu('/');
  kitu(th1);kitu(th2);
  kitu('/');
  chuoi("20");
  kitu(n1);kitu(n2);
}
//Hien giay phut gio
void hiengio()
{
  tach();
  lenh(0xc0);
  chuoi("Time: ");
  kitu(h1);kitu(h2);
  kitu(':');
  kitu(m1);kitu(m2);
  kitu(':');
  kitu(s1);kitu(s2);
  kitu(' ');
}
// hien hen gio
void hien_hengio()
{
  tach();
  lenh(0xc0);
  chuoi("Alarm: ");
  kitu(h_gio1);kitu(h_gio2);
  kitu(':');
  kitu(h_phut1);kitu(h_phut2);
  kitu(':');

}
//------------------------------------------------
 void Out_1Hz()
{
start(); /* Start i2c bus */
truyen(0xD0); /* Connect to DS1307 */
truyen(0x07);   //vi tri con tro RTC
truyen(0x10);
stop();
}

//----------------------------------------------------------------------
//Ham cai dat gia tri thoi gian
void caidat()
{
  if(mode==1) // Gio
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 gio=gio+1;
 if(gio==24)
 gio=0;

}
if(giam0==0 && giam1==1)
{
 gio=gio-1;
 if(gio<0)
 gio=23;
}
  }
  else
  {
  if(mode==2)   // Phut
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 phut=phut+1;
 if(phut==60)
 phut=0;

}
if(giam0==0 && giam1==1)
{
 phut=phut-1;
 if(phut<0)
 phut=59;
}
  }
  else
  {
  if(mode==3)   // Giay
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 giay=giay+1;
 if(giay==60)
 giay=0;

}
if(giam0==0 && giam1==1)
{
 giay=giay-1;
 if(giay<0)
 giay=59;
}
  }
  else
  {
  if(mode==4)   // Thu
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 thu=thu+1;
 if(thu==8)
 thu=1;

}
if(giam0==0 && giam1==1)
{
 thu=thu-1;
 if(thu==0)
 thu=7;
}
  }
  else
  {
  if(mode==5)   // Ngay
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 ngay=ngay+1;
 if(ngay==32)
 ngay=1;

}
if(giam0==0 && giam1==1)
{
 ngay=ngay-1;
 if(ngay==0)
 ngay=31;
}
  }
  else
  {
  if(mode==6)   // Thang
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 thang=thang+1;
 if(thang==13)
 thang=1;

}
if(giam0==0 && giam1==1)
{
 thang=thang-1;
 if(thang==0)
 thang=12;
}
  }
  else
  {
  if(mode==7)   // Nam
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 nam=nam+1;
 if(nam==100)
 nam=0;

}
if(giam0==0 && giam1==1)
{
 nam=nam-1;
 if(nam<0)
 nam=99;
}
  }
  if(mode==8)   // Gio Alarm
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 a_hour=a_hour+1;
 if(a_hour==24)
 a_hour=0;

}
if(giam0==0 && giam1==1)
{
 a_hour=a_hour-1;
 if(a_hour<0)
 a_hour=24;
}
  }
  if(mode==9)   // Phut Alarm
  {
    tang0=tang1;tang1=tang;
giam0=giam1;giam1=giam;
if(tang0==0 && tang1==1)
{
 a_min=a_min+1;
 if(a_min==60)
 a_min=0;

}
if(giam0==0 && giam1==1)
{
 a_min=a_min-1;
 if(a_min<0)
 a_min=60;
}
  }

  }
  }
  }
  }
  }
  }

    ghi(0x00,(dec_bcd(giay))&0x7F);
ghi(0x01,(dec_bcd(phut))&0x7F);
ghi(0x02,(dec_bcd(gio))&0x3F);
ghi(0x03,dec_bcd(thu));
ghi(0x04,dec_bcd(ngay));
ghi(0x05,dec_bcd(thang));
ghi(0x06,dec_bcd(nam));
ghi(0x08,dec_bcd(a_min));
ghi(0x09,dec_bcd(a_hour));



  if(mode==1)
  {
    lenh(0x80);
chuoi("   CHINH GIO:   ");
lenh(0xc0);
hiengio();
  }
  else
  {
  if(mode==2)
  {
    lenh(0x80);
chuoi("   CHINH PHUT:  ");
lenh(0xc0);
hiengio();
  }
  else
  {
  if(mode==3)
  {
    lenh(0x80);
chuoi("   CHINH GIAY:  ");
lenh(0xc0);
hiengio();
  }
  else
  {
  if(mode==4)
  {
    lenh(0x80);
chuoi("   CHINH THU:   ");
lenh(0xc0);
hienngay();
  }
  else
  {
  if(mode==5)
  {
    lenh(0x80);
chuoi("   CHINH NGAY:  ");
lenh(0xc0);
hienngay();
  }
  else
  {
  if(mode==6)
  {
    lenh(0x80);
chuoi("   CHINH THANG: ");
lenh(0xc0);
hienngay();
  }
  else
  {
  if(mode==7)
  {
    lenh(0x80);
chuoi("   CHINH NAM:   ");
lenh(0xc0);
hienngay();
  }
  else
  {
  if(mode==8)
  {
    lenh(0x80);
chuoi("   CHINH HGIO:   ");
lenh(0xc0);
hien_hengio();
  }
  else
  {
  if(mode==9)
  {
    lenh(0x80);
chuoi("   CHINH HPHUT:   ");
lenh(0xc0);
hien_hengio();
  }
  }
  }
  }
  }
  }
  }
  }
  }

}
// HAM CHINH
void main()
{
  khoitao();
  //khoitao_DS();
  lenh(0x80);
  chuoi_cham("REAL TIME CLOCK ");
  lenh(0xc0);
  chuoi_cham(" ECHIPKOOL.COM  ");
  delay(2000);
  lenh(0x01);
  lenh(0x80);
  chuoi_cham("Edit ChipKool");
  lenh(0xc0);
  chuoi_cham("GMAIL:new.moon9xone");
  delay(2000);
  lenh(0x01);

  while(1)
  {
    Out_1Hz();//
    mode0=mode1;mode1=menu;
if(mode0==0 && mode1==1)
{
 mode=mode+1;
 if(mode==10)
 mode=0;
}
    if(mode!=0)
 caidat();
else
hienthi();
/*if((gio==a_hour)&&(phut==a_min))
{
Led=Bat;
delay(100);
} */
  }
}



EchipKool - Chia sẻ kiến thức - Kết nối đam mê điện tử
In bài này
Previous
Next Post »

4 comments

Click here for comments
18/10/13 ×

KO DOWN DUOC A CHIP OI
..............

Reply
avatar
Chip Kool
admin
18/10/13 ×

Tự biên dịch đi..chia sẻ thế là tốt rồi

Reply
avatar
thanhtam ho
admin
13/11/13 ×

A chip giúp e cái mạch in của đồng hồ thời gian thực hiển thị LCD dc ko ạ

Reply
avatar
Chip Kool
admin
13/11/13 ×

@thanhtam hoBạn liên hệ mail: new.moon9xone@gmail.com để biết thêm chi tiết

Reply
avatar

Bạn đọc hãy giúp chúng tôi xây dựng cộng đồng bằng cách để lại bình luận, chúng tôi luôn đón nhận mọi ý kiến của các bạn:
» Bình luận nghiêm túc và không chứa các liên kết quảng cáo.
» Vui lòng không Spam nhận xét với mọi hình thức.
» Rất mong bạn đề tên cho nhận xét của chính mình - Bằng cách chọn vào Tên/URL và điền tên bạn vào (Phần URL có thể bỏ trống ).

- Bạn có thể chèn Link nhạc (NCT), video(Youtube),Hình ảnh vào comment bằng cú pháp:
+ [youtube] Link video Youtube [/youtube].
+ [img] Link ảnh( định dạng PNG, JPG,GIF) [/img]
+Chèn link liên kết: <a href="LINK" rel="nofollow">Name</a>
-Bạn copy mã bên cạnh biểu tượng chèn vào nhận xét để bày tỏ cảm xúc!! ConversionConversion EmoticonEmoticon

       Mạch Khóa Số Điện Tử Mạch Đếm Sản Phẩm Mạch Đèn giao thông Ngã Tư Mạch Trái Tim Final Mạch Trái Tim Final Mạch Trái Tim I Love U

THƯ MỤC KHO TÀI LIỆU MIỄN PHÍ ECHIPKOOL

Code 8051 - ASM Code 8051 - C Code AVR - C Code led sao băng Code PIC - C Điện tử cơ bản điện tử viễn thông Đo Nhiệt Độ DS18B20 + LCD Đo Nhiệt Độ LM35 + LCD Đo Nhiệt Độ LM35 + Led 7 thanh Đo tốc độ động cơ Động cơ robo Ebook Đại Học ebook điện tử Ebook đồ án Học Orcad Học Protues Hồng ngoại Lập Trình 8051 Lập Trình AVR lập trình c++ Lập Trình Led Quảng Cáo lập trình PIC Lập trình Robot Lập trình VHDL Lcd16x2 Led Clock Led Quay Led RGB Mạch 7seg Mạch Amply.Mạch Loa Mạch Cảm Biến Mạch cube Mạch Đếm Sản Phẩm Mạch điện cơ bản Mạch điện hay Mạch Điện Ứng Dụng Mạch đọc file nhạc MP3 dùng Atmega 8 Mạch Động Cơ Mạch đồng hồ Mạch đồng hồ LCD Mạch đồng hồ Matrix Mạch giao thông Mạch in Mạch khóa số điện tử Mạch Led đơn Mạch Led Quảng Cáo Mạch Led Vumeter Mạch Ma trận Phím Mạch Matrix Mạch nạp Mạch nguồn Mạch Nút Bấm Mạch RS232 Mạch RS485 Mạch thu phát Mạch tổ hợp MSI Mạch trái tim Mạch truyền điện không dây Mạch Vi điều khiển Module Bluetooth Module Sim Module Sim548 Motor Nhiệt độ - Độ ẩm oscilloscope Phần mềm điện tử Phần Mềm Diệt Viruts Phần Mềm Hay Phần Mềm Led Quảng Cáo Phần mềm vi tính robocon Rule robocon Sạc Acquy Sản Phẩm Thương Mại Sáng tạo Smart Home Tài liệu Điện Tử Tranzitor Tụ điện TUT - 8051 - ASM TUT - 8051 - KeilC UART Ứng Dụng Led Quảng Cáo Ứng dụng USB USB TO COM Vi điều khiển - Ứng dụng Vi mạch số VOM Wifi ESP8266