Thông báo

Collapse
No announcement yet.

Cần sự giúp đỡ về đồng hồ thời gian thực DS1307

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

  • Cần sự giúp đỡ về đồng hồ thời gian thực DS1307

    Chào mọi người. Mình đang làm đồ án về đồng hồ thời gian thực (Đồng hồ vạn niên có cảm biến nhiệt độ.). Nói thực là mình nhờ bạn mình lập trình cho. giờ mạch bị hỏng con VĐK nên mất hết không có file HEX. Còn file .C giờ không thể dịch được. Ai có thể giúp mình được không. Mình xin hậu tạ.
    code
    Code:
     #include <at89x52.h>
     #include <stdio.h>
     #include <INTRINS.H>
     #include <ds1307.c>
    
     sbit SET	 	 = P3^3;
     sbit DOWN		 = P3^2;
     sbit UP	 	 = P3^1;
     sbit MODE		 = P3^0;
     sbit WRADC		 = P0^7;
     							// 0   1	 2	  3	  4		5	 6	  7	   8	9	-	 off
     unsigned char code ma_bcd[14] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF,0xFF}; // Common Anode
     unsigned char hour, min, sec, day, date, mon, year, adate, amon; 
     unsigned char temp,i,j,chedo, mode, et1,x,dem;
     unsigned int tempx;
     bit bit_nhay;
     unsigned char ledData[8];
     unsigned char code ledPort[8] = {0xFE,0xFD,0xFB,0xF7,0x7F,0xBF,0xDF,0xEF};
     unsigned char code dayOfMon[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
     unsigned char code numMonAl[37] = {0x01,0x12,0x03,0x14,0x05,0x06,0x17,0x08,0x19,0x0A,0x1B,0x0C,0x11,0x02,0x13,0x04,0x15,0x06,0x17,0x08,0x09,0x19,0x0A,0x1B,0x0C,0x11,0x02,0x13,0x14,0x05,0x16,0x07,0x08,0x09,0x1A,0x0B,0x1C};
    
     void delay(unsigned int d);
     void quetLed(void);
     void scanKey(void);
     void chonCheDo(void);
       
     // tao tre
     void delay(unsigned int d)
     {
     	while(d--);
     }
    
     unsigned char readAdc(void)
     {
     	WRADC = 0;
    	P2 = 0xFF;
    	delay(100);
    	return(P2);
     }
     // Quet LED 				   
    void quetLed(void)
    { 
    	for(j=0; j<20; j++)
    	{
    		for(i=0;i<8;i++)
    		{
    			P1 = ledPort[i];			// Cho phep led1
    			P0 = ledData[i];	// Hien thi chuc gio
    			delay(10);					// Tre 10 chu ki
    			
    			P1 = 0xFF; 	// tat Led
    			P0 = 0XFF;	// tat led
    		}
    	}
    }
    
    unsigned int soNgayDl(unsigned char dd,unsigned char mm,unsigned char yy) 
    {
    	unsigned int ddate=0;
    	for(i=13;i<yy;i++)
    	{
    		ddate+=365;
    		if(i%4==0)ddate++;
    	}	
    	for(j=1;j<mm;j++)
    	{
    		ddate += (unsigned int) (dayOfMon[j-1]);
    		if((i%4==0)&(j==2))ddate++; // Nam nhuan
    	}
    	ddate += dd;
      	return (ddate);
    }
    // Tinh am lich
    void amLich(void)
    {
    	unsigned int numDateDl,sttAmon,dateAl;
    	unsigned char i;
    	numDateDl = soNgayDl(date,mon,year)-40;
    	sttAmon = (numDateDl*2)/59;
    	amon = numMonAl[sttAmon]&0x0F; 		// Thang Al
    	dateAl = numDateDl;
    	for(i=0;i<sttAmon;i++)
    	{
    		if((numMonAl[i]&0x10)==0x10)
    			dateAl -= 30;
    		else
    			dateAl -= 29;
    		
    	}
    	adate = numDateDl - ((sttAmon*59)/2);	// Ngay Al
    }		  
    
    // chon che do -- dua du lieu ra bo dem hien thi
    void chonCheDo(void)
    {
    	if(mode == 0)
    	{
    		rtcReadTime(&hour,&min,&sec);
    		rtcReadDate(&date,&mon,&year);
    		if((hour==0)&(min==0)&(sec<3))amLich();
    	}
    	if(chedo==1)
    	{
    		ledData[0] = ma_bcd[hour/10];
    		ledData[1] = ma_bcd[hour%10];
    		ledData[2] = ma_bcd[min/10];
    		ledData[3] = ma_bcd[min%10];
    		ledData[4] = ma_bcd[sec/10];
    		ledData[5] = ma_bcd[sec%10];
    		ledData[6] = 0xFF;
    		ledData[7] = 0xFF;	
    	}
    	if(chedo==2)
    	{
    		ledData[0] = ma_bcd[date/10];
    		ledData[1] = ma_bcd[date%10];
    		ledData[2] = ma_bcd[mon/10];
    		ledData[3] = ma_bcd[mon%10];
    		ledData[4] = ma_bcd[2];
    		ledData[5] = ma_bcd[0];	
    		ledData[6] = ma_bcd[year/10];
    		ledData[7] = ma_bcd[year%10];
    	}
    	if(chedo==3)
    	{
    		tempx = readAdc()/2;
    		ledData[0] = ma_bcd[adate/10];
    		ledData[1] = ma_bcd[adate%10];
    		ledData[2] = ma_bcd[amon/10];
    		ledData[3] = ma_bcd[amon%10];
    		ledData[4] = ma_bcd[temp/10];
    		ledData[5] = ma_bcd[temp%10];
    		ledData[6] = 0x9c;	  // o
    		ledData[7] = 0xC6;	  // C
    	}
    	if (bit_nhay&(mode>0))
    	{
    		switch (mode)
    		{
    		case 1: ledData[0] = ledData[1] = 0xFF; break;
    		case 2: ledData[2] = ledData[3] = 0xFF; break;
    		case 3: ledData[4] = ledData[5] = 0xFF; break;
    		case 4: ledData[0] = ledData[1] = 0xFF; break;
    		case 5: ledData[2] = ledData[3] = 0xFF; break;
    		case 6: ledData[6] = ledData[7] = 0xFF; break;
    		}	
    	}
    }
    // quet phim
    void scanKey(void)
     {
     	if (MODE == 0) // Nhan phim MODE
    	{
    		while(!MODE)quetLed();	// Cho nha phim
    		mode++;
    		chedo = 1;
    		if(mode>3)chedo = 2;
    		if (mode > 6) 
    		{
    			mode = 0;
    			chedo = 1;
    			rtcWriteTime(hour,min,sec);
    			rtcWriteDate(date,mon,year);
    		}
    	}
    
    	if (mode != 0)
    	{
    		if(UP == 0)			   // Nhan phim UP
    		{
    			dem=0;
    			while(!UP)quetLed();// Cho nha phim
    			switch (mode)
    			{
    			case 1: hour++; if (hour > 23)hour = 0; break;
    			case 2: min++; if (min > 59)min = 0;	break;
    			case 3: sec++; if (sec > 59)sec = 0; 	break;
    			case 4: date++; if (date > 31)date = 1; break;
    			case 5: mon++; if (mon > 12)mon = 1;	break;
    			case 6: year++; if (year > 99)year = 0;	break;
    			}			
    		}
    		if(DOWN == 0)			 	// Nhan phim Down
    		{
    			dem=0;
    			while(!DOWN)quetLed();	// Cho nha phim
    			switch (mode)
    			{
    			case 1: if (hour == 0)hour = 23;	else hour --; break;
    			case 2: if (min == 0)min = 59;		else min --; break;
    			case 3: if (sec == 0)sec = 59;		else sec--; break;
    			case 4: if (date == 1)date = 31;	else date --; break;
    			case 5: if (mon == 1)mon = 12;		else mon --; break;
    			case 6: if (year == 0)year = 99;	else year--; break;
    			}
    		}		
    	}
    	if (SET == 0)
    	{							// Nhan phim set
    		while(!SET)quetLed();	// Cho nha phim
    		mode = 0;				// Thoat che do dat thoi gian
    		rtcWriteTime(hour,min,sec);
    		rtcWriteDate(date,mon,year);
    	}
     }
    
     void Ngat_T1(void) interrupt 3
     {
     	TR1 = 0;
    	TF1 = 0;
    	TH1 = -50000/256;	
    	TL1 = -50000%256;
    	
    	et1 ++;
    
    	if ((et1 >= 2)& (mode != 0))
    	{
    		et1 = 0;
    		bit_nhay = ~bit_nhay;			
    	}
    	else if(et>5)
    	{
    		if(chedo<3)chedo++;
    		else chedo = 1;
    	}
    	
    	TR1 = 1;
     }
      
     // Chuong trinh chinh
    void main()
    {
    	TMOD = 0x11;	 // Dat Timer1 che do 1
    	ET1 = 1;		 // Cho phep ngat Timer1
    	EA = 1;			 // Cho phep ngat toan bo
    	
    
    	mode = 0;		 // Cam che do dieu khien
    
    	rtcInit();
    	chedo = 1; 		// Chon che do hien thi gio
    
    	rtcReadTime(&hour,&min,&sec);
    	rtcReadDate(&date,&mon,&year);
    	amLich();
    	TR1 = 1;		 // Cho phep Timer1 hoat dong
    	while(1)
    	{
    		if(mode==0)chonCheDo();
    		scanKey();
    		quetLed();		
    	}
    }
    code 2
    Code:
    #include <intrins.h>
    // Dinh nghia cong cho I2C
    
    #define SDA P3_6
    #define SCL P3_7
    
    #define CLK	{SCL=1;_nop_();SCL=0;_nop_();}
    #define ACK {SDA=0;CLK;}
    #define NO_ACK {SDA=1;CLK;}
    #define I2C_START {SDA=1;SCL=1;SDA=0;SCL=0;SDA = 1;}  // Marco
    #define I2C_STOP {SDA=0;SCL=1;SDA=1;}   // Marco
    
    void I2C_WR(unsigned char c)
    {
     char i;
     for (i=7;i>=0;i--)
     {
      SDA= (c>>i) & 0x01;
      CLK;
     }
     CLK;
    }
    
    unsigned char I2C_RD(bit ack)
    {
     unsigned char c=0;
     bit a;
     char i;
     for (i=7;i>=0;i--)
     {
      SDA=1;
      SCL=1;
      c=c<<1;
      if (SDA) c++;
      SCL=0;
    
     }
     SDA=ack;
     CLK;
     return (c);
    }
    
    
    // Thu - Ngay Thang Nam - Gio Phut Giay
    
    void rtcInit()
    {
     I2C_START;
     I2C_WR(0xd0);
     I2C_WR(0x07);   //vi tri con tro RTC
     I2C_WR(0x90);
     I2C_STOP;
     }  
    
     int bin2bcd (int x)
     {
      return (x%10) | ((x/10) << 4);
     }
    
     int bcd2bin (int x)
     {
      return (x >> 4) * 10 + (x & 0x0f);
     }
    
    void rtcWriteTime(char hour,char min,char sec)
    {
       I2C_START;
       I2C_WR(0xd0);
       I2C_WR(0x00);      //vi tri con tro RTC
       I2C_WR(bin2bcd(sec));   //giay
       I2C_WR(bin2bcd(min));
       I2C_WR(bin2bcd(hour));
       I2C_STOP;
    }
    
    void rtcWriteDate(char date, char mon, char year)
    {
       I2C_START;
       I2C_WR(0xd0);
       I2C_WR(0x04);      //vi tri con tro RTC   
       I2C_WR(bin2bcd(date));
       I2C_WR(bin2bcd(mon));
       I2C_WR(bin2bcd(year));
       I2C_STOP;
    }
    
    void rtcReadTime(char *hour,char *min,char *sec)
    {
     I2C_START;
     I2C_WR(0xd0);
     I2C_WR(0x00);   //vi tri con tro RTC
     I2C_START;
     I2C_WR(0xd1);
     *sec=bcd2bin(I2C_RD(0));
     *min=bcd2bin(I2C_RD(0));
     *hour=bcd2bin(I2C_RD(1));
     I2C_STOP;
    }
    
    void rtcReadDate(char *date,char *mon,char *year)
    {
     I2C_START;
     I2C_WR(0xd0);
     I2C_WR(0x04);   //vi tri con tro RTC
     I2C_START;
     I2C_WR(0xd1);
     *date=bcd2bin(I2C_RD(0));
     *mon=bcd2bin(I2C_RD(0));
     *year=bcd2bin(I2C_RD(1));
     I2C_STOP;
    }

  • #2
    Đây là mạch nguyên lýClick image for larger version

Name:	123.JPG
Views:	2
Size:	78.5 KB
ID:	1378461

    Comment


    • #3
      Mong nhận được hồi âm từ mọi người

      Comment


      • #4
        Dịch hex

        Nếu mạch chỉ hỏng em VĐK và code C trên là của con VĐK đã die thì bạn chỉ cần copy code C trên vào Keil C,thiết lập thạch anh rồi Build thế là có hex.
        Thân !

        Comment


        • #5
          nói thực ...ko biết build nữa thì về quê cho lành ...
          Website chính thức đổi địa chỉ website thành
          Mời các bạn ghé thăm !!!

          Comment


          • #6
            bạn ơi! code này minh dịch có báo lỗi nếu mình sửa được thì mình gởi lại cho bạn, ráng chờ nha;

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            Đang tải...
            X