Chat
Danh mục
Hướng dẫn mạch đồng hồ Led Giờ - Phút dùng 89C2051

Hướng dẫn mạch đồng hồ Led Giờ - Phút dùng 89C2051

Số lượng:
Thêm vào giỏ
Hướng dẫn mạch đồng hồ Led Giờ - Phút dùng 89C2051 đã được thêm vào giỏ hàng





Do không có thời gian vẽ mạch nên mình làm sơ đồ dạng lụi như sau:
Nếu các bạn lắp ráp sử dụng led siêu sáng thì các bạn có thể sử dụng bất kỳ bo mạch quảng cáo nào đang bán ở chợ Nhật Tảo, bạn có thể mua mạch in về và gắn linh kiện lên. Giá mạch in cũng không đắt chỉ khoảng 10 ngàn gì đó.

Theo mạch in thực tế thì các bạn có thể sử dụng tất cả các transitor đều cùng 1 loại, cụ thể là C828 hoặc C1815. Các bạn yên tâm sử dụng loại transistor này, cam đoan không hư đâu.
Riêng IC DS1307 thì mình mua, trước mình cũng có ráp nhưng xài linh kiện rẻ tiền hay chạy sai. Bo này đang bán ở công ty Thiên Minh (tme.vn)

Nếu bạn nào ráp đèn led siêu sáng thì sơ đồ đấu led như sau:
Bản thiết kế mặt đồng hồ gắn LED. Cái này được thực hiện bằng phần mềm Corel, mình gửi tặng các bạn bảng thiết kế mặt hiển thị đồng hồ LED 7 đoạn được thiết kế trong Corel 12. Bạn ra cửa hàng bán mica, mua 2 tấm mica dày 2mm khổ lớn hơn 40 x 20cm một chút khoảng 1, hoặc 2 cm gì đó cho dễ cắt. Màu mica thì tùy bạn thích, đen hoặc mica màu. Một tấm cắt lỗ để gắn LED và cắt khung bo tròn như hình dưới, tấm còn lại chỉ cắt khung ngoài không cắt lỗ gắn LED, tấm này dùng để gắn mặt sau của hộp đồng hồ. Nếu các bạn có vật liệu gì đó để thay thế tấm mica mặt sau thì sẽ tiết kiệm tiền mica. Sau đó bạn đem ra tiệm mica nhờ họ cắt theo bản thiết kế sau:

(Corel Draw)
Khi nhấn nút "Tải Về Máy", bạn sẽ vào trang quảng cáo, vui lòng chờ 5 giây. Nút  hiện ra ở góc phải phía trên, nhấn vào để đến trang download
Hình mặt đồng hồ led
Bóng LED. Dùng loại 5mm, Tổng số bóng cho bảng là 337 bóng, bạn nên mua 350 bóng để trừ hao phòng khi bị cháy LED trong quá trình thực hiện. Bạn nên mua bóng hiệu Kento, nếu sang hơn bạn mua bóng hiệu Sanyang. Những loại bóng này cho ánh sáng đẹp và bền. Theo thực tế sử dụng và làm nhiều thì mình thích LED màu xanh lá hoặc xanh dương sẽ đẹp hơn.

Toàn bộ mã nguồn mình sẽ giới thiệu dưới đây, các bạn đọc không hiểu có thể để lại bình luận, mình sẽ trả lời. Chương trình mình viết trong KeilC nhé

#include <REGX52.H>
#include <MATH.H>

#define SCL         P2_0 //chan scl cua ds1307 noi voi chan p20
#define SDA         P2_1 ////chan SDA cua ds1307 noi voi chan p21
//dinh nghia cho led 7 thanh
#define Led1Sang  P1=~0x01;
#define Led2Sang  P1=~0x02;
#define Led3Sang  P1=~0x04;
#define Led4Sang  P1=~0x08;

#define SEC      0x00
#define MIN      0x01
#define HOUR     0x02

//khai bao bien
//Dinh nghia ma hex cho led 7 doan 
code unsigned char Display_Number[]={
0x77,//0
0x44,//1
0x6B,//2
0x6E,//3
0x5C,//4
0x3E,//5
0x3F,//6
0x64,//7
0x7F,//8
0x7C//9  
};

static unsigned char ds1307_started = 0;

static char sec,hour,min;      //cac bien dem gio phut giay....
static char key;// luu gia tri phim nhan
static char buffer[4], digit[4];

void delay_us(unsigned int us)
{
  unsigned int i;
 for(i=0;i<us;i++);
}
void delay_ms(unsigned int ms)      //ham delay
{
  unsigned int i,j;
 for(i=0;i<ms;i++)
  for(j=0;j<121;j++);
}

void I2C_delay(){
 delay_us(1);
}

void _I2C_Init() {
   // must do following in one go else port takes time to do it so R-M-F stops it.
   SDA=1; // release data  (high).
   SCL=1; // release clock (high).
void I2C_start()  //ham khoi dong I2C
{
 SDA=1;
 SCL=1;
   I2C_delay();
   
   SDA=0;
   I2C_delay();

   SCL=0;
   I2C_delay();


}
void I2C_stop()   
{
    SCL = 0;
 I2C_delay();
 SDA = 0;  
 I2C_delay();

  SCL = 1; 
 I2C_delay();

  SDA = 1;
 I2C_delay();
}

//////////////////////////////////////////////////////////////////////
// Returns 0 for no errors = the ACK bit from the slave
unsigned char _I2C_Wr(unsigned char dat) {
unsigned char ret=0,i;
   for(i=0;i<8;i++) {
      SCL=0; // Clock low
   SDA = (dat & 0x80) ? 1:0;
      dat <<= 1;   // Next data bit.
      SCL=1;    // Clock released to high.
      I2C_delay();  // high T/2.
   }

   // get ACK or NACK
   SCL=0;
   SDA=1;    // Release the  data line
   I2C_delay();  // low T/2.
   
   SCL=1;
   // Sample the ACK
   ret = SDA;
   //I2C_delay();  // high T/2.
   
   SCL=0;    // Return clock to safe state

   return ret;
}

//////////////////////////////////////////////////////////////////////
unsigned char _I2C_Rd(unsigned char ack) {
 unsigned char i;
 char dat=0;
 SDA = 1;  // Release the data pin
   // grab the data
   for(i=0;i<8;i++) {      
      SCL = 1;    // Clock released to high.
      dat <<=1;
      while (SCL==0) {;} // Wait here if clock is pulled low by slave
      dat  = (dat | SDA);//if (I2C_SDA_IN) {data |= 1;} // Sample the data
      SCL = 0;   // Clock is low
      I2C_delay(); 
   }
   // Send ACK or NACK
   if (ack) SDA = 0;  // send ACK
    else SDA = 1;  // send NACK
   I2C_delay();  // low T/w.
   SCL = 1;
   I2C_delay();  // high T/2.   
   SCL = 0;    // Return clock to safe state.
   return dat;
}


//////////////////////////////////////////////////////////////////////
unsigned char DS1307_Rd(unsigned char address) {
 unsigned char dat;
   I2C_start();
   _I2C_Wr(0xd0);
   _I2C_Wr(address);
   I2C_start();
   _I2C_Wr(0xd1);           // b0 is read
   dat=_I2C_Rd(0);         // Read with NACK.
   I2C_stop();
   return (((dat/16)*10)+ (dat & 0x0f));  /*for Led 7seg*/ 
}

void DS1307_wr(unsigned char address, unsigned char dat) {
unsigned char i;
   unsigned char temp;
   temp = (((dat/10)*16)|(dat %10));
   I2C_start();
   _I2C_Wr(0xd0);
   _I2C_Wr(address);
   _I2C_Wr(temp);
   I2C_stop();

   I2C_start();

   // Get an ACK from the slave but give up after 3 goes don't hang waiting.
   for(i=0;i<3;i++) {
      if (_I2C_Wr(0xd0)==1) {  // Check for NACK
         I2C_start();
      } else break;            // found ACK
   }
   I2C_stop();
}

void  Ds1307_Start() {
 unsigned char sec;

   if (ds1307_started) return;

   sec = DS1307_Rd (0) & ~0x80; // CH = 0 - start.
   DS1307_wr(0,sec);
   ds1307_started = 1;
}
void Ds1307_Stop() {
   unsigned char sec;
   sec = DS1307_Rd(0) | 0x80; // CH = 1 - stop.
   DS1307_wr(0,sec);

   ds1307_started = 0;
}


void Read_DS1307()
 sec   = DS1307_Rd(SEC);
 min   = DS1307_Rd(MIN); //doc phut tu DS1307
 hour  = DS1307_Rd(HOUR); //doc gio tu DS1307
}

void Write_DS1307()
{
 DS1307_wr(SEC,sec);
 DS1307_wr(MIN,min);     //ghi du lieu vao thanh ghi phut
 DS1307_wr(HOUR,hour);    //ghi du lieu vao thanh ghi gio
}


void setHour()
{
 // hour  = DS1307_Rd(HOUR);
 //hour >23
 (hour>=0x17) ?  hour=0 : hour++;
 DS1307_wr(HOUR,hour);
}

void setMinute()
 //min   = DS1307_Rd(MIN);
 //min>59
 (min>=0x3B) ? min=0 : min++;
 DS1307_wr(MIN,min); 
}

void Convert_Number()
{
 buffer[0] = Display_Number[hour/10];
 buffer[1] = Display_Number[hour%10];
 buffer[2] = Display_Number[min/10];
 buffer[3] = Display_Number[min%10];
}
void scanLED()
{
    unsigned char i;
    key = -1;
    for( i = 0; i < 4; i++)  /* 4-DIGIT scanning */
    {
        P0 = ~buffer[i];  /* send complement[segment] */
  P1 = ~digit[i];  /* send complement[digit] */
        delay_ms(5);         /* delay a while */
        P0 = 0xFF;        /* off LED */
        if ((P1 & 0x80) == 0) /* if key pressed P2.7 became low */
           key = i;       /* save key position to key variable */
    }
}
void keyexe()
{
    if (key != -1)
    {
        switch(key){
         case (1):
          setHour(); 
    delay_ms(150);
         break;
         case (2):
    setMinute(); 
    delay_ms(150);
         break;
      }
    }
}

void Ds1307_Init() 
{
   // Check if initialisation is needed by checking a ram location
   // use the year value : RAM location 3F is used to hold the year data

   if (DS1307_Rd(0x3f)==0x20) {return;} // initialised so return

   Ds1307_Start(); // Start the oscillator

  // Set the time
   DS1307_wr(0,0x59 & 0x7F); // bit 7 - oscailltor halt (if=1).  : secs  0-59
   DS1307_wr(1,0x59);  //                                        : mins  0-59
   DS1307_wr(2,0x23 & ~(1<<6) ); // reset bit 6 for 24 hour mode.:0-23,1-12 hour
   DS1307_wr(3,0x07);  // week day day 0-7                       : day   1-7
   DS1307_wr(4,0x31);  // (exceptions Feb,Apr,Jun,Sep,Nov 1-30)  : date  1-31
   DS1307_wr(5,0x12);  //                                        : month 1-12
   DS1307_wr(6,0xC);  //                                        : year  0-99,2012
   // Write high digit of year into RAM easier code
   // and gives initialisation check.
   DS1307_wr(0x3f,0x20);    //                                   : year  12
}

 //chuong trinh chinh
void main(void)
{
 //khai bao dia chi 4 so can hien thi
 digit[0]=0x01;
 digit[1]=0x02;
 digit[2]=0x04;
 digit[3]=0x08; 

  _I2C_Init();
 Ds1307_Init();

    while (1)
    {
  Read_DS1307(); //doc thoi gian tu DS1307
  Convert_Number();
  scanLED();  
  keyexe();
    }
}