Làm đồng hồ diện tử led 7 vạch là một chuyên đề quá quen thuộc với các bạn là dân điện tử nhưng mạch điều khiển của nó có rất nhiều dạng nhưng chia ra hai dạng chính đó là đồng hồ mạch ic số (ĐHS) và đồng hồ Vi điều khiển (VĐK). Nhưng nếu làm bằng ic số thì mạch phức tạp và phải có xung 1Hz mà cái này thì khó kiếm khó làm. Nên mình quyết định chọn vi điều khiển.
Chiếc đồng hồ này thực ra chính là máy hẹn giờ do mình lập trình và thi công bản mạch PCB.

+ Mạch nguyên lý



+ Chương trình viết bằng C:
- Dòng vi xử lý : 89C51
- Ngôn ngữ : C
- Môi trường biên dịch : Keil C


#include<regx51.h>
sfr dulieu=0x80;
sbit nutmode=P3^0;
sbit nuton=P3^4;
sbit chuong=P3^1;
int on=0,a,r=0,giay=59,chucgiay=0,dvgiay=0,phut=59,chucphut=0,dvphut=0,gio=24,chucgio=0,dvgio=0,
dvgiay_bcd=0,chucgiay_bcd=0,dvphut_bcd=0,chucphut_bcd=0,dvgio_bcd=0,chucgio_bcd=0;
void delay(long time)
   {
         while(time--);
   }
void giaima_ht()
    { 
        switch(a)
          {
             case 0: a=0x40; break;
             case 1: a=0x79; break;
             case 2: a=0x24; break;
             case 3: a=0x30; break;
             case 4: a=0x19; break;
             case 5: a=0x12; break;
             case 6: a=0x02; break;
             case 7: a=0x78; break;
             case 8: a=0x00; break;
             case 9: a=0x10; break;
           }
}
void giaima_dec()
      {
          dvgiay=giay%10;
          chucgiay=giay/10;
          dvphut=phut%10;
          chucphut=phut/10;
          dvgio=gio%10;
          chucgio=gio/10;
       }
void giaima_bcd()
      {
         a=dvgiay;
         giaima_ht();
         dvgiay_bcd=a;
         a=chucgiay;
         giaima_ht();
         chucgiay_bcd=a;
         a=dvphut;
        giaima_ht();
        dvphut_bcd=a;
        a=chucphut;
        giaima_ht();
        chucphut_bcd=a;
        a=dvgio;
        giaima_ht();
        dvgio_bcd=a;
        a=chucgio;
        giaima_ht();
      chucgio_bcd=a;
   }
void hienthi()
    {
        P1=0xff;
       dulieu=0xff;
       dulieu=dvgiay_bcd;
       P1=0xfe;
       delay(1);
       P1=0xff;
       dulieu=0xff;
       dulieu=chucgiay_bcd;
       P1=0xfd;
       delay(1);
       P1=0xff;
       dulieu=0xff;
       dulieu=dvphut_bcd;
       P1=0xfb;
       delay(1);
       P1=0xff;
       dulieu=0xff;
       dulieu=chucphut_bcd;
       P1=0xf7;
       delay(1);
       P1=0xff;
       dulieu=0xff;
       dulieu=dvgio_bcd;
       P1=0xef;
       delay(1);
       P1=0xff;
      dulieu=0xff;
      dulieu=chucgio_bcd;
      P1=0xdf;
      delay(1);
  }
void main()
{
       EA=1;
       ET0=1;
       EX0=EX1=1;
       IT0=IT1=1;
       chuong=0;
      TMOD=0x01;
      TL0=0xf0;
      TH0=0xd8;
      TR0=1;
      while(1)
          {
               giaima_dec();
               giaima_bcd();
               hienthi();
               if(nuton==0)
                 {
                   delay(300);
                   while(nuton==0)
                           {;}
                    on=1;
                  }
           }
  }
void ngat_T0() interrupt 1
    {
           TF0=0;
            if(on==1)r++;
           while(r==16)
                 {
                      r=0;
                     if(giay>-1)
                         {
                             giay=giay-1;
                          }
                    if(gio==0&&giay==-1&&phut==0)
                         {
                               chuong=1;
                               on=0;
                               giay=0;
                        }
                    if(phut>-1&&giay==-1&&gio>=0)
                        {
                                phut=phut-1;
                                giay=59;
                         }
                   if(phut==-1)
                         {
                               gio=gio-1;
                               phut=59;
                          }  
                  TL0=0xf0;
                  TH0=0xd8;
                   TR0=1;
           }
    }
void ngat_ET0() interrupt 0
    {
          if(nutmode==1)
             {
                if(phut<59)
                   {
                       phut++;
                    }
             }
          else
             {
                if(gio<24)
                     {
                        gio++;
                     }
             }
    }
void ngat_ET1() interrupt 2
     {
         if(nutmode==1)
            {
               if(phut>0)
                  {
                      phut--;
                   }
            }
        else
             if(gio>0)
                  {
                         gio--;
                   }
          }

+ Hình ảnh về sản phẩm







+ Nguyên lý hoạt động
-Gồm 5 nút điều khiển:
+ Reset
+ run
+ INC
+ DEC
+ ADJ hour
1. Nút reset: reset đồng hồ đưa về giá trị 245959

2. Nút run: Nhấn nút này đồng hồ đếm lùi

3. INC: Tăng giá trị  đếm

4. DEC: Giảm giá trị đếm

5. ADJ hour: Nhấn nút này khi bấm INC, DEC thì sẽ điều chỉnh giờ

Khi giá trị lùi về 000000 thì relay đóng chuông báo.

Echipkool - Điện Tử | Tin Học - Chia sẻ kiến thức - Kết nối đam mê điện tử

Đăng nhận xét

Đăng nhận xét

Author Name



Tôi là Ngọc Anh. Tôi đến từ Nghệ An. Tôi tốt nghiệp một trường đại học tại Sài Gòn. Hiện tôi đang phát triển công ty riêng. Liên lạc với tôi qua:






Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.