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

January 13, 2014

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





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();
    }
}

11 comments:

nam phạm said...
13/1/14

sắp tết rồi tính đặt 1 cái, nhưng k biết giá cả sao?

Chip Kool said...
13/1/14

Cái này giá mắc lắm..Chíp nghĩ bạn nên đặt mua cái module bên chíp làm có thêm hẹn giờ + Remote giá rẻ chỉ việc mua về lắp ráp theo hướng dẫn là chạy: Bạn xem cuối bài viết này Sale hàng giá tốt

Long Sơn said...
13/1/14

Nhật tảo có bán mạch in sẵn ko bạn ?

Long Sơn said...
13/1/14

Nhật tảo có bán mạch in sẵn ko bạn ?

Chip Kool said...
13/1/14

Bạn liên hệ bên tme..

Nguyễn Đăng Quý said...
13/1/14

CHip =.= sao có bài mới không mail cho e, a nói có bài mới là hướng dẫn hay gọi em liền mà, định làm lại mạch mới bằng cách đi mua nên lên mạng tìm lại, cái dự án led đơn kia e treo hiwn nữa tháng nay rồi T^T chừ thấy cái này hạnh phúc quá hy vọng làm thành công T^T

Nguyễn Đăng Quý said...
14/1/14

Tội quá chủ thớt ơi, cái code thì cho dip 40 mà cái hình lại ghi cho dip 20, đứa nào àm ko biết rõ vấn đề này mò cũng chết bà nó, :)) thớt nhận em một lạy, hướng dẫn thì cho đàng hoàng không thì thôi ko nên post lên đây đâu. với lại phương pháp quét như này với số led lớn sẽ gây nháy ko gánh nỗi dòng đâu.

Chip Kool said...
14/1/14

@Nguyễn Đăng Quý Bạn không hiểu gì về lập trình cả..Codedongf 8051 chỉ có việc chỉnh chân Port..Dip 20 và 40 nó khác nhau vị trí chân..còn vào ra vẫn vậy..bạn cứ vẽ con 89c2051 mô phỏng nạp code vẫn chạy...Chán cho 1 thế hệ sinh viên..

Hung Nguyen Hoang said...
18/3/14

Mạch này mình muốn sửa code làm sao để khi nhấn 1 nút nào đó thì hiển thị nhiệt độ lên led luôn được không chip? Đang tính làm cái. Hì

Hung Nguyen Hoang said...
18/3/14

Mạch mình mô phỏng trong proteus 8 sao không chạy nhỉ? Nó nháy loạn xạ lê. :((

Cao Văn Thành said...
24/9/14

code này nạp cho 89c51 đc k Chíp. với code k có nút điều chỉnh giờ à

Post a Comment

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!!

:) :( :)) :(( =)) =D> :D :P