Thông báo

Collapse
No announcement yet.

[Cần giúp đỡ] Sửa lỗi mạch đồng hồ số thực ds1307 sử dụng họ 8051 viết bằng C

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

  • [Cần giúp đỡ] Sửa lỗi mạch đồng hồ số thực ds1307 sử dụng họ 8051 viết bằng C

    Như tít, mình đang làm mạch đồng hồ, vì mới tìm hiểu nên mới chỉ muốn hiện giờ phút giây.
    Nhưng hiện tại thì cái mạch của mình vẫn ko chạy vì mình vẫn chưa lấy đc dữ liệu của con ds
    Ảnh mạch của nó đây
    Click image for larger version

Name:	Capture.JPG
Views:	1
Size:	144.4 KB
ID:	1415832

    Code của nó đây
    Code:
    #include <REGX52.H>
    //// Mang hien so tu 0 - 9
    unsigned char so[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
    unsigned char gio,phut,giay,thu,ngay,thang,nam;
    
    
    // Cac chan quet led
    sbit led1=P2^0;
    sbit led2=P2^1;
    sbit led3=P2^2;
    sbit led4=P2^3;
    sbit led5=P2^4;
    sbit led6=P2^5;
    
    // Dinh nghia chan SDA va SCL
    sbit sda=P1^0;
    sbit scl=P1^1;
    
    // Ham tre
    void delay(unsigned int ms)
      {
         unsigned int i;
         for(i=0;i<ms;i++)
    	   {;}  
      }
    
    // Khoi dong I2C
    void start_i2c()
      {
         scl=1;
    	 sda=1;
    	 sda=0;
    	 delay(1);
         scl=0;
    	 delay(2); // Tre di 1 ti cho no chac
      }
    
    // Stop I2C
    void stop_i2c()
      {
         sda=1;
    	 scl=0;
    	 delay(1);
    	 scl=1;
      }
    
    // Truyen 8 bit du lieu tu chu xuong to ////
    bit write_i2c(unsigned char data_write)
      {	
         bit outbit;
         unsigned int i;
    	 for(i=1;i<=8;i++)
    	    {
    		  outbit=(data_write&0x80);
    		  sda=outbit;
    		  data_write=data_write<<=1;
    
    		  scl=1;
    		  delay(1);
    
    		  scl=0;
    		  delay(1);
    		}
    	 sda=1;
    	  // tao clock de nhan bit ack tu to
    	 scl=1;
    	 delay(5);
    	 outbit=sda;
    	 scl=0;
    	 delay(5);
    	 return(outbit);
      }
    
    // Truyen du lieu 8 bit tu to len chu //////
    unsigned char read_i2c(bit ack_bit)
      {
         unsigned char data_read=0;
    	 unsigned int i;
    	 bit inbit;
    	 sda=1;
    	 for(i=1;i<=8;i++)
    	   {
    	      scl=1;
    		  delay(1);
    		  inbit=sda;
              data_read=data_read<<=1;
    		  data_read= data_read|inbit;
    		  scl=0;
    		  delay(1);
    	   }
    	 if(ack_bit==1) sda=0;	 // gui ack
    	 else sda=1;			 // gui no ack
    	 delay(1);
    	 // clock gui no ack
    	 scl=1;
    	 delay(1);
    	 scl=0;
    	 delay(1);
    	 return(data_read);  
      }
    
    // Doc du lieu tu ds1307
    unsigned char read_rtc(unsigned char add)
      {
         unsigned char ret;
         start_i2c(); 
         write_i2c(0xD0);
         write_i2c(add); 
         start_i2c(); 
         write_i2c(0XD1);
         ret = read_i2c(0);
         stop_i2c();
    
         ret = (((ret/16)*10)+ (ret & 0x0f)); // for Led 7seg
    
         return(ret);
      }
    // Doc ds1307
    void read_ds1307()
      {
         giay=read_rtc(0x00);//read_rtc(0x00);
         phut=read_rtc(0x01);//read_rtc(0x01);
         gio=read_rtc(0x02);//read_rtc(0x02);
    	 thu=read_rtc(0x03);
    	 ngay=read_rtc(0x04);
    	 thang=read_rtc(0x05);
    	 nam=read_rtc(0x06);
      }
    
    // Ham hien thi 
    void hienthi(void)
      {
    	 led1=1;  P0=so[gio/10];   delay(10); led1=0;
         led2=1;  P0=so[gio%10];   delay(10); led2=0; 
    
         led3=1;  P0=so[phut/10];   delay(10); led3=0;
         led4=1;  P0=so[phut%10];   delay(10); led4=0;
    	 
    	 led5=1;  P0=so[giay/10];   delay(10); led5=0;
         led6=1;  P0=so[giay%10];   delay(10); led6=0;  
      }
    
    /// Ham chinh ///////
    void main()
      {	 
         while(1)
    	   {
    	     read_ds1307();
    		 hienthi();
    	   }
      }
    Tất cả file đây, mọi người down về kiểm tra hộ nhé I2C & DS1307.rar
    Code:
    http://www.mediafire.com/?kwd241o6fdfdn9x

  • #2
    bạn ơi trước tiên bạn muốn đọc được thời gian trong con ds1307 này thì bạn phải ghi các giá trị vào các thanh ghi giây phút giờ..... như ở đây bạn chưa có hàm ghi thời gian (cái này chỉ cần ghi 1 lần duy nhất lúc mới chạy con ds thui) bạn thử đi nhé
    chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
    Everything should be made as simple as possible, but not simpler

    Comment

    Về tác giả

    Collapse

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

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

    Collapse

    Đang tải...
    X