Thông báo

Collapse
No announcement yet.

sử dụng vi điều khiển 8051\52 thiết kết đồng hồ thời gian thực với ds1307

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • sử dụng vi điều khiển 8051\52 thiết kết đồng hồ thời gian thực với ds1307

    e chao các anh chị !
    e thì hok chuyên ngành công nghệ thông tin, đợt này e phải hoc cái món vi xử lý, đợt này thầy em bắt làm cái chủ đề trên khoai quá, cả nhóm loay hoay cả mấy tuần rồi mà mãi ko biết nguyên lý hoạt đong của nó ntn,
    đây là mạch bọn em copy trên mag về, bác nào pro có thể giải thích mạch hộ em với đk kp?
    Dong ho thoi gian thuc(1).pdf

  • #2
    Nguyên văn bởi cntt Xem bài viết
    e chao các anh chị !
    e thì hok chuyên ngành công nghệ thông tin, đợt này e phải hoc cái món vi xử lý, đợt này thầy em bắt làm cái chủ đề trên khoai quá, cả nhóm loay hoay cả mấy tuần rồi mà mãi ko biết nguyên lý hoạt đong của nó ntn,
    đây là mạch bọn em copy trên mag về, bác nào pro có thể giải thích mạch hộ em với đk kp?
    [ATTACH]77103[/ATTACH]
    Công nghệ tt cũng hc cái này cơ ah, hay nhỉ.

    Comment


    • #3
      Nguyên văn bởi cntt Xem bài viết
      e chao các anh chị !
      e thì hok chuyên ngành công nghệ thông tin, đợt này e phải hoc cái món vi xử lý, đợt này thầy em bắt làm cái chủ đề trên khoai quá, cả nhóm loay hoay cả mấy tuần rồi mà mãi ko biết nguyên lý hoạt đong của nó ntn,
      đây là mạch bọn em copy trên mag về, bác nào pro có thể giải thích mạch hộ em với đk kp?
      [ATTACH]77103[/ATTACH]
      Bắt buộc phải 89x5x à bạn? Mình thấy 89xx với ds1307 nản lắm. nguồn mà không ổn định là chết với nó đấy, kể mà được chọn thì dùng atmega8a con đó có RTC luôn mà tổng giá linh kiện chắc cũng tuơng đuơng với 89x5x+ds1307.

      Comment


      • #4
        dùng 89s52 nhé bác.
        // Chuc nang cua chuong trinh: Dung DS1307 dem thoi gian va hien thi tren text LCD, chinh gio bang SW1, SW2 va SW3
        // Ket noi day:
        // LCD :
        // Port data cua LCD (D1-D7) ----> Port 2 cua 8051
        // RS cua LCD ----> P3.7 cua 8051
        // RW cua LCD ----> P3.6 cua 8051
        // EN cua LCD ----> P3.5 cua 8051
        // DS1307 :
        // SCL cua DS1307 ----> P1.0 cua 8051
        // SDA cua DS1307 ----> P1.1 cua 8051
        // Nut nhan don (khi nhấn thì output từ nút nhần chuyển từ 1 sang 0 nhé):
        // SW1 ----> P3.0 cua 8051: chinh giam
        // SW2 ----> P3.1 cua 8051: chinh tang
        // SW3 ----> P3.2 cua 8051: chinh mode

        #include <AT89X51.H>
        #include <INTRINS.H>


        #define sda P1_1
        #define scl P1_0
        #define rs P3_7
        #define rw P3_6
        #define en P3_5
        #define menu P3_2
        #define tang P3_1
        #define giam P3_0
        #define congLCD P2
        #define D7 P2_7

        unsigned char *rtc[]={"0","1","2","3","4","5","6","7","8","9"};
        unsigned char *day[]={"CNhat","Thu 2","Thu 3","Thu 4","Thu 5","Thu 6","Thu 7"};
        unsigned char giatrikhoitao_rtc[8];


        void busy()
        {
        D7=1;
        rs=0;
        rw=1;
        while(D7!=0)
        {
        en=0;
        en=1;
        }
        }

        void ghilenhLCD(unsigned char x)
        {
        busy();
        congLCD=x;
        rs=0;
        rw=0;
        en=1;
        en=0;
        }

        void khoitaoLCD(void)
        {
        ghilenhLCD(0X38);
        ghilenhLCD(0X0C);
        ghilenhLCD(0X01);
        ghilenhLCD(0X06);
        }

        void ghi_kytu(unsigned char value)
        {
        busy();
        congLCD=value;
        rs=1;
        rw=0;
        en=1;
        en=0;
        }

        void ghi_chuoi(unsigned char *string)
        {
        unsigned char i;
        for(i=0;string[i]!='\0';i++)
        ghi_kytu(string[i]);
        }


        void ghiso(unsigned char a)
        {
        unsigned char i;
        i=a/10;
        ghi_chuoi(rtc[i]);
        i=a%10;
        ghi_chuoi(rtc[i]);
        }

        void hienthi_dulieu_rtc(unsigned char x)
        {
        unsigned char temp;
        temp = x/16;
        ghi_chuoi(rtc[temp]);
        temp = x%16;
        ghi_chuoi(rtc[temp]);
        }



        void start_rtc(void)
        {
        scl=1;
        sda=1;
        _nop_();
        _nop_();
        sda=0;
        scl=0;
        }

        void stop_rtc(void)
        {
        sda=0;
        scl=1;
        _nop_();
        _nop_();
        sda=1;
        }

        void gui_rtc(unsigned char x)
        {
        unsigned char i;
        for(i=0;i<8;i++)
        {
        sda=(x&0x80)? 1:0;
        scl=1;
        _nop_();
        _nop_();
        scl=0;
        x<<=1;
        }
        scl=1;
        _nop_();
        _nop_();
        scl=0;
        }

        unsigned char nhan_rtc(void)
        {
        unsigned char Data,i;
        for(i=0;i<8;i++)
        {
        scl=1;
        Data<<=1;
        Data=Data|sda;
        scl=0;
        }
        sda=1;
        scl=1;
        _nop_();
        scl=0;
        _nop_();
        return Data;
        }

        char docdulieu(unsigned char diachi)
        {
        unsigned char Data;
        start_rtc();
        gui_rtc(0xd0);
        gui_rtc(diachi);
        start_rtc();
        gui_rtc(0xd1);
        Data=nhan_rtc();
        stop_rtc();
        return Data;
        }

        void ghivaoDS1307(void)
        {
        unsigned char t;
        for(t=0;t<9;t++)
        {
        start_rtc();
        gui_rtc(0xd0);
        gui_rtc(t);
        gui_rtc(giatrikhoitao_rtc[t]);
        stop_rtc();
        }

        }



        void hienthi_rtc(void)

        {
        ghilenhLCD(0xca);
        hienthi_dulieu_rtc(docdulieu(0));
        ghilenhLCD(0xc7);
        hienthi_dulieu_rtc(docdulieu(1));
        ghi_kytu(':');
        ghilenhLCD(0xc4);
        hienthi_dulieu_rtc(docdulieu(2));
        ghi_kytu(':');
        ghilenhLCD(0x80);
        ghi_chuoi(day[docdulieu(3)-1]);
        ghi_kytu(',');
        ghilenhLCD(0x86);
        hienthi_dulieu_rtc(docdulieu(4));
        ghi_kytu('-');
        hienthi_dulieu_rtc(docdulieu(5));
        ghi_chuoi("-20");
        hienthi_dulieu_rtc(docdulieu(6));
        }


        void delay(long time)
        {
        while(time--)
        {
        TMOD=0x01;
        TH0=0xFC;TL0=0x67;
        TR0=1;
        while(TF0!=1){};
        TF0=0;
        TR0=0;}
        }


        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_rtc()
        {
        unsigned char giay,phut,gio,thu,ngay,thang,nam;
        giay = bcd_dec(docdulieu(0)&0x7f);
        phut = bcd_dec(docdulieu(1));
        gio = bcd_dec(docdulieu(2)& 0x3f);
        thu = bcd_dec(docdulieu(3));
        ngay = bcd_dec(docdulieu(4));
        thang = bcd_dec(docdulieu(5));
        nam = bcd_dec(docdulieu(6));

        ghilenhLCD(1);
        ghi_chuoi("CHINH");
        ghi_chuoi(" GIO :");
        ghilenhLCD(0x0e);
        ghilenhLCD(0xc4);
        ghiso(gio);
        ghi_kytu(':');
        ghiso(phut);
        ghi_kytu(':');
        ghiso(giay);

        ghilenhLCD(0xC5);
        while(menu==0);
        caidatgio:while(tang!=0 && giam!=0 && menu!=0);
        if(tang==0)
        {
        gio++;
        if(gio==24) gio=0;
        ghilenhLCD(0xC4);
        ghiso(gio);
        ghilenhLCD(0xC5);
        delay(300);
        goto caidatgio; }
        if(giam==0)
        {
        gio--;
        if(gio==0xff) gio=23;
        ghilenhLCD(0xC4);
        ghiso(gio);
        ghilenhLCD(0xC5);
        delay(300);
        goto caidatgio;}


        while(menu==0);
        ghilenhLCD(0xC8);
        caidatphut: while(tang!=0 && giam!=0 && menu!=0);
        if(tang==0)
        {
        phut++;
        if(phut==60) phut=0;
        ghilenhLCD(0xC7);
        ghiso(phut);
        ghilenhLCD(0x10);
        delay(300);
        goto caidatphut;}
        if(giam==0)
        {
        phut--;
        if(phut==0xff) phut=59;
        ghilenhLCD(0xC7);
        ghiso(phut);
        ghilenhLCD(0x10);
        delay(300);
        goto caidatphut;
        }


        while(menu==0);
        ghilenhLCD(0xCB);
        caidatgiay: while(tang!=0 && giam!=0 && menu!=0);
        if(tang==0)
        {
        giay++;
        if(giay==60) giay=0;
        ghilenhLCD(0xCA);
        ghiso(giay);
        ghilenhLCD(0xCB);
        delay(100);
        goto caidatgiay;
        }
        if(giam==0)
        {
        giay--;
        if(giay==0xff) giay=59;
        ghilenhLCD(0xCA);
        ghiso(giay);
        ghilenhLCD(0xCB);
        delay(100);
        goto caidatgiay;
        }



        while(menu==0);
        ghilenhLCD(1);
        ghi_chuoi("CHINH NGAY :");
        ghilenhLCD(0xc4);
        ghiso(ngay);
        ghi_kytu('-');
        ghiso(thang);
        ghi_chuoi("-20");
        ghiso(nam);

        ghilenhLCD(0xc5);
        caidatngay:while (tang!=0 && giam!=0 && menu!=0);
        if(tang==0)
        {
        ngay++;
        if(ngay==32) ngay=1;
        ghilenhLCD(0xC4);
        ghiso(ngay);
        ghilenhLCD(0x10);
        delay(300);
        goto caidatngay;
        }

        if(giam==0)
        {
        ngay--;
        if(ngay==0) ngay=31;
        ghilenhLCD(0xC4);
        ghiso(ngay);
        ghilenhLCD(0x10);
        delay(300);
        goto caidatngay;
        }


        while(menu==0);
        ghilenhLCD(0xC8);
        caidatthang:while(tang!=0 && giam!=0 && menu!=0);
        if(tang==0)
        {
        thang++;
        if(thang==13) thang=1;
        ghilenhLCD(0xC7);
        ghiso(thang);
        ghilenhLCD(0x10);
        delay(300);
        goto caidatthang;
        }
        if(giam==0)
        {
        thang--;
        if(thang==0) thang=12;
        ghilenhLCD(0xC7);
        ghiso(thang);
        ghilenhLCD(0x10);
        delay(300);
        goto caidatthang;
        }


        while(menu==0);
        ghilenhLCD(0xCD);
        caidatnam:while(tang!=0 && giam!=0 && menu!=0);
        if(tang==0)
        {
        nam++;
        if(nam==100) nam=0;
        ghilenhLCD(0xCC);
        ghiso(nam);
        ghilenhLCD(0xCD);
        delay(300);
        goto caidatnam;
        }

        if(giam==0)
        {
        nam--;
        if(nam==0xff) nam=99;
        ghilenhLCD(0xCC);
        ghiso(nam);
        ghilenhLCD(0xCD);
        delay(300);
        goto caidatnam;
        }



        while(menu==0);
        ghilenhLCD(1);
        ghi_chuoi("CHINH THU :");
        ghilenhLCD(0xc4);
        ghi_chuoi(day[thu-1]);
        caidatthu:while(tang!=0 && giam!=0 && menu!=0);
        if(tang==0)
        { thu++;
        if(thu==8) thu=1;
        ghilenhLCD(0xC4);
        ghi_chuoi(day[thu-1]);
        delay(300);
        goto caidatthu;
        }

        if(giam==0)
        { thu--;
        if(thu==0) thu=7;
        ghilenhLCD(0xC4);
        ghi_chuoi(day[thu-1]);
        delay(300);
        goto caidatthu;
        }

        while(menu==0);
        ghilenhLCD(1);
        ghilenhLCD(0x0C);

        giatrikhoitao_rtc[0] = dec_bcd(giay);
        giatrikhoitao_rtc[1] = dec_bcd(phut);
        giatrikhoitao_rtc[2] = dec_bcd(gio);
        giatrikhoitao_rtc[3] = dec_bcd(thu);
        giatrikhoitao_rtc[4] = dec_bcd(ngay);
        giatrikhoitao_rtc[5] = dec_bcd(thang);
        giatrikhoitao_rtc[6] = dec_bcd(nam);
        giatrikhoitao_rtc[7] = 0x00;
        giatrikhoitao_rtc[8] = 'c';

        ghivaoDS1307();
        ghilenhLCD(1);


        }



        void kiemtra_rtc(void)
        {
        unsigned char temp;
        start_rtc();
        gui_rtc(0xd0);
        gui_rtc(0x08);
        start_rtc();
        gui_rtc(0xd1);
        temp=nhan_rtc();
        stop_rtc();
        if(temp!='c')
        {
        giatrikhoitao_rtc[0]=0x50;
        giatrikhoitao_rtc[1]=0x59;
        giatrikhoitao_rtc[2]=0x09;
        giatrikhoitao_rtc[3]=0x04;
        giatrikhoitao_rtc[4]=0x04;
        giatrikhoitao_rtc[5]=0x05;
        giatrikhoitao_rtc[6]=0x11;
        giatrikhoitao_rtc[7]=0x00;
        giatrikhoitao_rtc[8]='c';
        ghivaoDS1307();
        }
        }

        void doccacdulieu(void){ int i;
        for(i=0;i<=6;i++){docdulieu(i);} }


        bit co=0;
        void caidatco() interrupt 0
        {
        co=1;
        }
        void main()
        {
        khoitaoLCD();
        ghilenhLCD(0x80);
        ghi_chuoi("TEST RTC DS1307");
        ghilenhLCD(0xc0);
        ghi_chuoi("BY LEKTEKNIK COR");
        delay(4000);

        ghilenhLCD(1);
        kiemtra_rtc();
        IE=0x81;
        doccacdulieu();
        while(1)
        { doccacdulieu();
        hienthi_rtc();
        if(co==1)
        {
        caidat_rtc();
        co=0;
        }

        }
        }

        Comment


        • #5
          đề tài báo cáo mà bạn,đề thầy cho thì sử dụng khác làm sao dl

          Comment


          • #6
            trên 4rum này có mấy bác làm cái ds1307 rồi. mà sơ đồ mạch của bác có vấn đề đấy
            1. chân scl và sda phải có trở 4.7k tro nguồn
            2. dùng a1015 để kích nguồn cho led 7 đoạn, sẽ hay hơn dùng c1815

            Comment


            • #7
              Nguyên văn bởi condonhan Xem bài viết
              trên 4rum này có mấy bác làm cái ds1307 rồi. mà sơ đồ mạch của bác có vấn đề đấy
              1. chân scl và sda phải có trở 4.7k tro nguồn
              2. dùng a1015 để kích nguồn cho led 7 đoạn, sẽ hay hơn dùng c1815
              Dùng tran thuận hay ngược là tùy người viết chứ bạn.

              Comment


              • #8
                Nguyên văn bởi jqk1234 Xem bài viết
                Dùng tran thuận hay ngược là tùy người viết chứ bạn.
                mình thấy dùng a1015 dễ hơn. kích mức 0 so với VCC (có thể xem là mức 1) dễ hơn là kích mức 1 so với mức 1. sau này nếu làm việc với việc dùng trans kích nguồn lớn thì dùng c1815 kiểu đó hên xui lắm.

                Comment


                • #9
                  Nguyên văn bởi jqk1234 Xem bài viết
                  Dùng tran thuận hay ngược là tùy người viết chứ bạn.
                  Do các các chân out của họ 89 "cấp dòng" rất yếu so với "hút dòng" nên khi thiết kế người ta thường dùng Transistor loại PNP hơn, nếu sử dụng NPN bạn phải thêm điện trở treo chân B lên mức cao để tăng cường thêm dòng kích Transistor, tuỳ theo dòng cần cung cấp cho tải ta có thể tính điện trở treo cho phù hợp.
                  Last edited by pctcom; 01-11-2013, 08:52.
                  PCT COMPUTER
                  (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

                  Comment


                  • #10
                    Nguyên văn bởi pctcom Xem bài viết
                    Do các các chân out của họ 89 "cấp dòng" rất yếu so với "hút dòng" nên khi thiết kế người ta thường dùng Transistor loại PNP hơn, nếu sử dụng NPN bạn phải thêm điện trở treo chân B lên mức cao để tăng cường thêm dòng kích Transistor, tuỳ theo dòng cần cung cấp cho tải ta có thể tính điện trở treo cho phù hợp.
                    tốt nhất là port nào cũng treo như port 0 cho khỏe

                    Comment

                    Về tác giả

                    Collapse

                    cntt Tìm hiểu thêm về cntt

                    Bài viết mới nhất

                    Collapse

                    Đang tải...
                    X