Thông báo

Collapse
No announcement yet.

Giao tiếp DS1307

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

  • Giao tiếp DS1307

    Ai có lỡ ghé ngang, mong được xem qua dùm e cái code
    giao tiếp giữa vdk với Ds1307 hiển thị led 7 đoạn.
    vì làm mạch thực, thí nghiệm trên mạch thực lun, nên ko có sơ đồ protues, mong mọi người thông cảm.
    Cảm ơn mọi người rất nhiều!

    #include <REGX52.H>
    sbit scl = P3^4;
    sbit sda = P3^5;
    sbit a1 = P0^0;
    sbit a2 = P0^1;
    sbit a3 = P0^2;
    sbit a4 = P0^3;
    sbit a5 = P0^4;
    sbit a6 = P0^5;
    sbit a7 = P0^6;
    sbit m1 = P2^0; //hien thi phut1
    sbit m2 = P2^1; //hien thi phut2
    sbit h1 = P2^2; //hien thi gio1
    sbit h2 = P2^3; //hien thi gio2
    sbit d1 = P2^4; //hien thi ngay1
    sbit d2 = P2^5; //hien thi ngay2
    sbit mo1 = P2^6;
    sbit mo2 = P2^7;
    sbit y1 = P1^0;
    sbit y2 = P1^1;

    unsigned char bcd,dulieu;
    unsigned char giay,phut,gio,ngay,thang,nam;
    unsigned char gio1,gio2,phut1,phut2,giay1,giay2;
    ///////////////
    void delay(int t) //delay
    {int i;
    unsigned char b;
    for (i=0;i<t;i++){for(b=0;b<125;b++){;}}
    }
    /////////////////////////////
    void delay2(int t) //delay2
    {int i;
    for (i=0;i<t;i++);
    }
    //////////////////////////////////////////////////////
    void ds1307()
    {unsigned char a;
    for(a=0;a<7;a++)
    {
    scl=0;
    sda=0xc0&(0x80>>a);
    scl=1;
    }
    }
    ////////////////////////////////////////////////////////
    void star()
    {
    scl=0;
    sda=1;
    scl=1;
    delay2(10);
    sda=0;
    }
    ////////////////////////////////////////////////////////
    void stop()
    {
    scl=0;
    sda=0;
    scl=1;
    delay2(10);
    sda=1;
    }
    ////////////////////////////////////////////////////////
    void ghi()
    {
    scl=0;
    sda=0;
    scl=1;
    }
    ////////////////////////////////////////////////////////
    void doc()
    {
    scl=0;
    sda=1;
    scl=1;
    }
    ////////////////////////////////////////////////////////
    void ack()
    {
    scl=0;
    scl=1;
    }
    ////////////////////////////////////////////////////////
    void sobcd(unsigned char a) //chuyen tu hex sang bcd
    {unsigned char b,c;
    b=a/10;
    b=b<<4;
    c=a%10;
    bcd=b|c;
    }
    ////////////////////////////////////////////////////////
    void guidulieu(unsigned char a)
    {unsigned char b;
    for(b=0;b<8;b++)
    {
    scl=0;
    sda=a&(0x80>>b);
    scl=1;
    }
    }
    ////////////////////////////////////////////////////////
    void nhan()
    {unsigned char b;
    for(b=0;b<8;b++)
    {
    scl=0;
    scl=1;
    dulieu=(dulieu>>b)|sda;

    }
    }
    //////////////////////////////////////////////////////
    void settime()
    { unsigned char a,b,c;
    sobcd(44);
    a=bcd; //giay
    sobcd(22);
    b=bcd; //phut
    sobcd(12);
    c=bcd; //gio


    star();ds1307();ghi();ack();guidulieu(0x00);ack(); guidulieu(a);ack();
    guidulieu(b);ack();guidulieu(c);ack();

    }
    ///////////////////////////////////////////////////////////////
    void hienthi(unsigned char a)
    { a1=a2=a3=a4=a5=a6=a7=1;
    switch(a)
    {
    case 0: a1=a2=a3=a4=a5=a6=0;break; //so0
    case 1: a2=a3=0;break; //so1
    case 2: a1=a2=a4=a5=a7=0;break; //so2
    case 3: a1=a2=a3=a4=a7=0;break; //so3
    case 4: a2=a3=a6=a7=0;break; //so4
    case 5: a1=a3=a4=a6=a7=0;break; //so5
    case 6: a1=a3=a4=a5=a6=a7=0;break; //so6
    case 7: a1=a2=a3=0;break; //so7
    case 8: a1=a2=a3=a4=a5=a6=a7=0;break; //so8
    case 9: a1=a2=a3=a4=a6=a7=0;break; //so9
    }
    }
    ////////////////////////////////////////////////////////
    void nhanthoigian()
    {
    star();ds1307();ghi();ack();guidulieu(0x00);ack(); stop();

    star();ds1307();doc();ack();nhan();ack();stop();


    }
    ///////////////////////////////////////////////////////
    void tach()
    {

    giay1=dulieu&0x0f;
    giay2=(dulieu&0xf0)>>4;
    }
    //////////////////////////////////////////////////////
    void main ()
    {
    sda=scl=1;
    settime();
    while (1)
    {
    nhanthoigian();
    tach();
    hienthi(giay1);

  • #2
    giúp mình với........................................

    Comment


    • #3
      mình cũng làm cái này nhưng ngại đọc code quá
      bạn tham khảo code của mình nhé
      Code:
      #include <regx51.h>
      #define uchar unsigned char
      #define SCL P1_0
      #define SDA P1_1
      #define DSW 0xd0
      #define DSR 0xd1
      void delay(void);
      void i2cstart(void);
      void i2cstop(void);
      uchar i2cwrite(uchar c);
      uchar i2cread(void);
      uchar i2creadlast(void);
      uchar maled[10]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x8,0x9};
      
      void scl1(void);
      void main(void)
      {
      	//dau tien khoi tao i2c free
      	uchar c;
      	SDA=1;
      	SCL=1;
      
      	//kiem tra xem boc tem chua
      	i2cstart();
      	i2cwrite(DSW);
      	i2cwrite(0);//ghi vao dia chi 0
      	i2cstart();
      	i2cwrite(DSR);
      	c=i2creadlast();
      	if(c&0x80)
      	{
      		i2cstart();
      		i2cwrite(DSW);
      		i2cwrite(0);
      		i2cwrite(0);
      	}
      	i2cstop();
      	while(1)
      	{
      		i2cstart();
      		i2cwrite(DSW);
      		i2cwrite(0);
      		i2cstart();
      		i2cwrite(DSR);
      		c=i2creadlast();
      		i2cstop();
      		c&=0xf;
      		//c>>=4;
      		//xuat du lieu ra led 7 seg
      		//c=8;
      		P2=maled[c];
      	}
      }
      void delay(void)
      {
      	uchar i;
      	for(i=0;i<5;++i);
      }
      void i2cstart(void)
      {
      	SDA=1;
      	scl1();
      	SDA=0;
      	delay();
      	SCL=0;
      	delay();	
      }
      void scl1(void)
      {
      	SCL=1;
      	while(!SCL);
      }
      void i2cstop(void)
      {
      	SDA=0;
      	scl1();
      	SDA=1;
      	delay();
      }
      uchar i2cwrite(char c)
      {
      	uchar i,ret;
      	for(i=0;i<8;++i)
      	{
      		//lan luot gui tung bit 1 ra
      		SDA=0;
      		if(c&0x80)
      			SDA=1;
      		c<<=1;
      		scl1();
      		delay();
      		SCL=0;
      		delay();
      	}
      	ret=0;
      	//tao xung ack
      	SDA=1;
      	scl1();
      	delay();
      	if(!SDA)
      		ret=1;
      	SCL=0;
      	delay();
      	return ret;
      }
      uchar i2cread(void)
      {
      	uchar ret,i;
      	for(i=0;i<8;++i)
      	{
      		ret<<=1;
      		scl1();
      		delay();
      		ret|=SDA;
      		SCL=0;
      		delay();
      	}
      	//gui tra lai ack
      	SDA=0;
      	scl1();
      	delay();
      	SCL=0;
      	delay();
      	return ret;
      }
      uchar i2creadlast(void)
      {
      	uchar ret,i;
      	for(i=0;i<8;++i)
      	{
      		ret<<=1;
      		scl1();
      		delay();
      		ret|=SDA;
      		SCL=0;
      		delay();
      	}
      	//gui tra lai not ack
      	SDA=1;
      	scl1();
      	delay();
      	SCL=0;
      	delay();
      	return ret;	
      }

      Comment


      • #4
        Code a khá hay, có rất nhiều thứ để e học hỏi. thank nhiều

        Comment


        • #5
          không có gì
          mình cũng chỉ biết sơ sơ thôi mà

          Comment


          • #6
            Có bác nào có code chỉnh chế độ 12/24h share em ngâm cứu với, thanks

            Comment


            • #7
              thì bác hiểu về cấu trúc bộ nhớ của nó là làm được ấy mà
              cái này em nghĩ không khó bạn muốn chỉnh kiểu gì mình code cho
              ví dụ khi ấn 1 nút nào đó thì hiển thị giờ theo chế độ 12/24 hay ghi chế độ 12/24 vào 1307
              nếu chỉ là hiển thị thì chỉ cần quy đổi là ok không cần ghi giá trị vào 1307

              Comment


              • #8
                Nguyên văn bởi kidteam Xem bài viết
                thì bác hiểu về cấu trúc bộ nhớ của nó là làm được ấy mà
                cái này em nghĩ không khó
                Cấu trúc thì em cũng nắm đc mà viết code khi chuyển sang 12 thì đc rồi, nhưng chuyển sang 24 là ko đc. Mất cả tuần mà cũng ko làm đc đành chấp nhận 24h.

                Comment


                • #9
                  ok
                  nhưng ý bác là ghi chế độ 12/24 vào con 1307 ấy hả
                  hay chỉ cần hiển thị

                  Comment


                  • #10
                    Nguyên văn bởi kidteam Xem bài viết
                    ok
                    nhưng ý bác là ghi chế độ 12/24 vào con 1307 ấy hả
                    hay chỉ cần hiển thị
                    Em dùng nút bấm để chọn chế độ hiển thị 12 hoặc 24 giờ.

                    Comment


                    • #11
                      thế thì chỉ cần chuyển đổi là được mà
                      không cần ghi vào con 1307
                      mà bác cho em xin cái file bác pót bên kia đi
                      về em sửa chút

                      Comment


                      • #12
                        cho em hỏi cái khai báo uchar của bác nghĩa là gì thế ạh?
                        Nguyên văn bởi kidteam Xem bài viết
                        mình cũng làm cái này nhưng ngại đọc code quá
                        bạn tham khảo code của mình nhé
                        Code:
                        #include <regx51.h>
                        #define uchar unsigned char
                        #define SCL P1_0
                        #define SDA P1_1
                        #define DSW 0xd0
                        #define DSR 0xd1
                        void delay(void);
                        void i2cstart(void);
                        void i2cstop(void);
                        uchar i2cwrite(uchar c);
                        uchar i2cread(void);
                        uchar i2creadlast(void);
                        uchar maled[10]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x8,0x9};
                        
                        void scl1(void);
                        void main(void)
                        {
                        	//dau tien khoi tao i2c free
                        	uchar c;
                        	SDA=1;
                        	SCL=1;
                        
                        	//kiem tra xem boc tem chua
                        	i2cstart();
                        	i2cwrite(DSW);
                        	i2cwrite(0);//ghi vao dia chi 0
                        	i2cstart();
                        	i2cwrite(DSR);
                        	c=i2creadlast();
                        	if(c&0x80)
                        	{
                        		i2cstart();
                        		i2cwrite(DSW);
                        		i2cwrite(0);
                        		i2cwrite(0);
                        	}
                        	i2cstop();
                        	while(1)
                        	{
                        		i2cstart();
                        		i2cwrite(DSW);
                        		i2cwrite(0);
                        		i2cstart();
                        		i2cwrite(DSR);
                        		c=i2creadlast();
                        		i2cstop();
                        		c&=0xf;
                        		//c>>=4;
                        		//xuat du lieu ra led 7 seg
                        		//c=8;
                        		P2=maled[c];
                        	}
                        }
                        void delay(void)
                        {
                        	uchar i;
                        	for(i=0;i<5;++i);
                        }
                        void i2cstart(void)
                        {
                        	SDA=1;
                        	scl1();
                        	SDA=0;
                        	delay();
                        	SCL=0;
                        	delay();	
                        }
                        void scl1(void)
                        {
                        	SCL=1;
                        	while(!SCL);
                        }
                        void i2cstop(void)
                        {
                        	SDA=0;
                        	scl1();
                        	SDA=1;
                        	delay();
                        }
                        uchar i2cwrite(char c)
                        {
                        	uchar i,ret;
                        	for(i=0;i<8;++i)
                        	{
                        		//lan luot gui tung bit 1 ra
                        		SDA=0;
                        		if(c&0x80)
                        			SDA=1;
                        		c<<=1;
                        		scl1();
                        		delay();
                        		SCL=0;
                        		delay();
                        	}
                        	ret=0;
                        	//tao xung ack
                        	SDA=1;
                        	scl1();
                        	delay();
                        	if(!SDA)
                        		ret=1;
                        	SCL=0;
                        	delay();
                        	return ret;
                        }
                        uchar i2cread(void)
                        {
                        	uchar ret,i;
                        	for(i=0;i<8;++i)
                        	{
                        		ret<<=1;
                        		scl1();
                        		delay();
                        		ret|=SDA;
                        		SCL=0;
                        		delay();
                        	}
                        	//gui tra lai ack
                        	SDA=0;
                        	scl1();
                        	delay();
                        	SCL=0;
                        	delay();
                        	return ret;
                        }
                        uchar i2creadlast(void)
                        {
                        	uchar ret,i;
                        	for(i=0;i<8;++i)
                        	{
                        		ret<<=1;
                        		scl1();
                        		delay();
                        		ret|=SDA;
                        		SCL=0;
                        		delay();
                        	}
                        	//gui tra lai not ack
                        	SDA=1;
                        	scl1();
                        	delay();
                        	SCL=0;
                        	delay();
                        	return ret;	
                        }
                        Nguyễn Huy Biên - 01649 802 694
                        gmail :

                        Comment


                        • #13
                          thì như trong code ấy
                          nó là unsigned char // kiểu số nguyên 1 byte không dấu

                          Comment


                          • #14
                            tks bác,e hiểu rồi
                            Nguyễn Huy Biên - 01649 802 694
                            gmail :

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X