Thông báo

Collapse
No announcement yet.

Đồng hồ số giúp gấp,

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

  • #16
    cậu tham khảo cái mạch đồng hồ số sử dụng LED matrix của mình đi, mình làm RTC khá nhiều rồi, mình nghĩ do code của cậu thôi!

    Cậu đọc code nên chú ý phần đọc data tử RTC nhé !DIGITAL_CLOCK_MATRIX_RTC.zip
    Attached Files

    Comment


    • #17
      bạn chumanh xem cái codo mà bạn bên trên gửi có vấn đề gì ko vậy ? mình chuyển sang file hex để nap vào nhưng mà nó vẫn ko chịu chạy cho mới bực mình chứ, có gì nhờ bạn chỉnh sửa lại hộ mình với nhé, mình gửi cả file mạch và codo của nó bạn chỉnh sửa lại giúp mình với nhé, rất mong nhận được sự giúp đỡ của bạn.cảm ơn bạn rất nhiều, cái này là dùng keiLC

      #include<AT89x51.h>
      #define LED1 P0_0
      #define LED2 P0_1
      #define LED3 P0_2
      #define LED4 P0_3
      #define LED5 P0_4
      #define LED6 P0_5
      sbit Set_key =P3^4;
      sbit Up_key = P3^3;
      sbit Dw_key =P3^6;
      sbit SDA =P1^1;
      sbit SCL= P1^0;
      sbit denled=P2^0;
      unsigned char hour, min, sec;
      unsigned char time,index,F_set,B_nhay,get_t ;
      unsigned char led7_data[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //Decimal to Led7seg
      void delay()
      {
      unsigned char i;
      for (i = 0; i < 20; i++){};
      }
      void delay1(unsigned int time)
      {
      while(time--);
      }

      //-----------------------------------------
      void SCL_high()
      {
      SCL = 1;
      delay();
      }

      //------------------------------------------
      void SCL_low()
      {
      SCL = 0;
      delay();
      }

      //-------------------------------------------
      void I2C_Start()
      {
      SDA = 1;
      SCL = 1;
      SDA = 0;
      delay();
      SCL = 0;
      SDA = 1;
      }

      //--------------------------------------------
      void I2C_Stop()
      {
      SDA = 0;
      SCL_high();
      SDA = 1;
      }

      //----------------------------------------------
      bit I2C_Write(unsigned char dat)
      {
      unsigned char i;
      bit outbit;
      for (i = 1; i <= 8; i++)
      {
      outbit=dat&0x80;
      SDA = outbit;
      dat = dat << 1;
      SCL_high();
      SCL_low();
      }
      SDA = 1; // set SDA to receive Acknowledge
      SCL_high();
      outbit = SDA; // check busy or not
      SCL_low();
      return(outbit); // if outbit=1 ,A=1: error // if outbit=0 ,A=0: ok
      }

      //----------------------------------------------------
      unsigned char I2C_Read(bit ack)
      {
      unsigned char i, dat;
      bit inbit;
      dat = 0;
      for(i=1;i<=8;i++)
      {
      SCL_high();
      inbit = SDA;
      dat = dat << 1;
      dat = dat | inbit;
      SCL_low();
      }
      if (ack) SDA = 0; // set SDA = 0 (ACK)
      else SDA = 1; // set Non ACK
      SCL_high();
      SCL = 0;
      SDA = 1; // Set SDA = 1 for next read
      delay();
      return(dat);
      }
      //-------------------------------------------------------------
      // hàm ghi d? li?u data t?i d?a ch? thanh ghi add c?a RTC
      //-------------------------------------------------------------
      void rtc_write(unsigned char add, unsigned char data1)
      {
      I2C_Start();
      I2C_Write(0xd0); // d?a ch? c?a 1307 //ch? d? ghi
      I2C_Write(add); // d?a ch? thanh ghi
      I2C_Write(((data1/10)<<4)|(data1%10)); // chuy?n thành s? th?p phân
      I2C_Stop();
      }

      //---------------------------------------------------------------
      // d?c d? li?u t?i thanh ghi có d?a ch? add c?a RTC
      //---------------------------------------------------------------
      unsigned char rtc_read(unsigned char add){
      unsigned char data1;
      I2C_Start();
      I2C_Write(0xd0); // d?a ch? c?a DS1307 // ch? d? ghi
      I2C_Write(add); // d?a ch? thanh ghi c?n d?c
      I2C_Start(); // restart
      I2C_Write(0xd1); // d?a ch? DS1307 // ch? d? d?c
      data1 = I2C_Read(0);
      I2C_stop();
      data1 = (data1 & 0x0f) + (data1>>4)*10; // chuy?n thành s? th?p phân
      return (data1);
      }

      //----------------------------------------------------------------
      void setup_timer(void) // Setup timer 0 va timer 1
      {
      TMOD=0x11; // timer0 & timer1 set che do 1
      TH0=-1000/256; TL0=-1000%256;
      TH1=0x3C; TL1=0xAF;
      ET1=1; ET0=1; EA=1;
      TF0=0; TF1=0; TR0=1; TR1=1;
      }

      //----------------------------------------------------------------
      void Fix_time(void) // Kiem tra va hieu chinh gia tri cua gio,phut,giay
      {
      //Tang
      if(sec==60) {sec=0;min++; }
      if(min==60) {min=0;hour++; }
      if(hour==24) hour=0;
      //Giam
      if(sec== -1) {sec=59;min--;}
      if(min== -1) {min=59;hour-- ;}
      if(hour== -1)hour= 23;
      }

      //-----------------------------------------------------------------
      void Keypad(void) // Kiem tra phim nhan.
      {
      if(!Set_key)
      { //phim Set duoc nhan ?
      F_set++; // Bien F_set co gia tri tu 0->2
      if(F_set>3)
      {
      F_set=0;
      rtc_write(0x00, sec);
      rtc_write(0x01,min);
      rtc_write(0x02,hour);
      }
      }
      if(F_set==1)
      { //Tang hoac giam gio neu F_set = 2
      if(!Up_key) hour++;
      if(!Dw_key) hour--;
      rtc_write(0x02,hour);
      }

      if(F_set==2)
      { //Tang hoac giam phut neu F_set = 1
      if(!Up_key) min++;
      if(!Dw_key) min--;
      rtc_write(0x01,min);
      }

      if(F_set==3)
      { //Tang hoac giam gio neu F_set = 2
      if(!Up_key) sec++;
      if(!Dw_key) sec--;
      rtc_write(0x00, sec);
      }
      Fix_time(); //kiem tra tran so
      delay1(13000);
      }

      //-------------------------------------------------------
      void T1_ISR(void) interrupt 3 //ngat timer 1 chay dong ho
      {
      TR1=0;
      TF1=0;
      TH1=0x3C; // nap lai gia tri cho thanh ghi
      TL1=0xAF;
      time++;
      if(time==5)
      {time=0; B_nhay++; get_t=1;

      if(B_nhay==4)
      B_nhay=0;
      }
      TR1=1;
      }
      /*************************************/
      void T0_ISR(void) interrupt 1 // Dung ngat timer 0 de quet led
      {
      TR0=0;
      TF0=0;
      TH0=-1000/256; // Nap lai gia tri cho thanh ghi
      TL0=-1000%256;
      index++;
      LED1=0;
      LED2=0;
      LED3=0;
      LED4=0;
      LED5=0;
      LED6=0;
      if(index==1)
      { if(F_set==3 && B_nhay==1){index++; index++;}
      else
      {
      P2=led7_data[sec%10];
      LED6=1;
      }
      } //lay so du sau khi chia 10
      if(index==2)
      {
      P2=led7_data[sec/10];
      LED5=1;
      } //xuat gia tri hang chuc

      if(index==3)
      {
      if(F_set==2 && B_nhay==1){index++; index++;}
      else
      {
      P2=led7_data[min%10];
      LED4=1;
      }
      }
      if(index==4)
      {
      P2=led7_data[min/10];
      LED3=1;
      }

      if(index==5)
      {
      if(F_set==1 && B_nhay==1){index=0;}
      else
      {
      P2=led7_data[hour%10];
      LED2=1;
      }
      }

      if(index==6)
      {
      P2=led7_data[hour/10];
      LED1=1;
      index=0;
      }

      TR0=1;
      }
      //------------------------------------------------
      void main()
      {
      time=index=0;
      hour=0;
      min=0;
      sec=10;
      F_set=0;
      get_t=0;
      setup_timer();
      rtc_write(0x07, 10); // set control register 00010000; 1Hz
      while(1)
      {
      Keypad();
      //if(F_set==0)
      //{
      if(get_t == 1)
      {
      get_t = 0;
      // d?c th?i gian t? RTC
      sec = rtc_read(0x00);
      min = rtc_read(0x01);
      hour = rtc_read(0x02);


      //}
      }
      if((sec%2)==0)
      denled=1;
      else
      denled=0;
      }
      }
      Attached Files

      Comment


      • #18
        các bác ơi giúp mình với nhé, cái này gấp lắm rồi, rất mong nhận được sự hỗ trợ của tất cả các bạn trong diễn đàn, cảm ơn các bạn rất nhiều.

        Comment


        • #19
          trong cái hàm gửi byte tới RTC, cậu gọi hàm delay là không cần thiết, điều này làm cho việc cập nhật thời gian từ RTC sẽ bị trễ rất nhiều ! chỗ phần SCL_high và SCL_low đó, thay vì dùng hàm, cậu chỉ cần sử dụng " SCL = 1;SCL = 0;" là được. Bây giờ cậu đang vướng ở chỗ nào của mạch, bởi nếu mạch không chạy còn có nhiều nguyên nhân lắm:

          - Không đọc được dữ liệu từ RTC
          - Code, mạch có vấn đề

          Cậu nên sử dụng VOM để kiểm tra thật kỹ cho phần cứng, còn phần mềm cậu có thể debug sử dụng KeilC.

          Code đã chỉnh sửa, lấy data từ RTC ok !
          Tuy nhiên cậu nên tạo một hàm gửi giờ đầu tiên vào RTC, do khi mới mua về RTC chạy mặc định là 00:00:00, nhỡ nữa là khi mạch hoạt đọng không đc chạm tay vào chân của RTC, nó sẽ làm nhiễu RTC ngay lập túc =>treo RTC
          PHP Code:
          #include <reg51.h>
          sbit LED1 P0^0;
          sbit LED2 P0^;
          sbit LED3 P0^2    ;
          sbit LED4 P0^3     ;
          sbit LED5 P0^4      ;
          sbit LED6 P0^5       ;
          sbit Set_key =P3^4;
          sbit Up_key P3^3;
          sbit Dw_key =P3^6;
          sbit SDA =P1^1;
          sbit SCLP1^0;
          sbit denled=P2^0;
          unsigned char hourminsec;
          unsigned char time,index,F_set,B_nhay,get_t ;
          unsigned char led7_data[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //Decimal to Led7seg
          void delay()
          {
          unsigned char i;
          for (
          020i++){};
          }
          void delay1(unsigned int time)
          {
          while(
          time--);
          }


          //-------------------------------------------
          void I2C_Start()
          {
          SDA 1;
          SCL 1;
          SDA 0;
          delay();
          SCL 0;
          SDA 1;
          }

          //--------------------------------------------
          void I2C_Stop()
          {
          SDA 0;
          SCL 1;
          SDA 1;
          }

          //----------------------------------------------
          bit I2C_Write(unsigned char dat)
          {
          unsigned char i;
          bit outbit;
          for (
          1<= 8i++)
          {
          outbit=dat&0x80;
          SDA outbit;
          dat dat << 1;
          SCL 1;
          SCL 0;
          }
          SDA 1// set SDA to receive Acknowledge
          SCL 1;
          outbit SDA// check busy or not
          SCL 0;
          return(
          outbit); // if outbit=1 ,A=1: error // if outbit=0 ,A=0: ok
          }

          //----------------------------------------------------
          unsigned char I2C_Read(bit ack)
          {
          unsigned char idat;
          bit inbit;
          dat 0;
          for(
          i=1;i<=8;i++)
          {
          SCL 1;
          inbit SDA;
          dat dat << 1;
          dat dat inbit;
          SCL 0;
          }
          if (
          ackSDA 0// set SDA = 0 (ACK)
          else SDA 1// set Non ACK
          SCL 1;
          SCL 0;
          SDA 1// Set SDA = 1 for next read
          delay();
          return(
          dat);
          }
          //-------------------------------------------------------------
          // hàm ghi d? li?u data t?i d?a ch? thanh ghi add c?a RTC
          //-------------------------------------------------------------
          void rtc_write(unsigned char addunsigned char data1)
          {
          I2C_Start();
          I2C_Write(0xd0); // d?a ch? c?a 1307 //ch? d? ghi
          I2C_Write(add); // d?a ch? thanh ghi
          I2C_Write(((data1/10)<<4)|(data1%10)); // chuy?n thành s? th?p phân
          I2C_Stop();
          }

          //---------------------------------------------------------------
          // d?c d? li?u t?i thanh ghi có d?a ch? add c?a RTC
          //---------------------------------------------------------------
          unsigned char rtc_read(unsigned char add){
          unsigned char data1;
          I2C_Start();
          I2C_Write(0xd0); // d?a ch? c?a DS1307 // ch? d? ghi
          I2C_Write(add); // d?a ch? thanh ghi c?n d?c
          I2C_Start(); // restart
          I2C_Write(0xd1); // d?a ch? DS1307 // ch? d? d?c
          data1 I2C_Read(0);
          I2C_Stop();
          data1 = (data1 0x0f) + (data1>>4)*10// chuy?n thành s? th?p phân
          return (data1);
          }

          //----------------------------------------------------------------
          void setup_timer(void// Setup timer 0 va timer 1
          {
          TMOD=0x11// timer0 & timer1 set che do 1
          TH0=-1000/256TL0=-1000%256;
          TH1=0x3CTL1=0xAF;
          ET1=1ET0=1EA=1;
          TF0=0TF1=0TR0=1TR1=1;
          }

          //----------------------------------------------------------------
          void Fix_time(void// Kiem tra va hieu chinh gia tri cua gio,phut,giay
          {
          //Tang
          if(sec==60) {sec=0;min++; }
          if(
          min==60) {min=0;hour++; }
          if(
          hour==24hour=0;
          //Giam
          if(sec== -1) {sec=59;min--;}
          if(
          min== -1) {min=59;hour-- ;}
          if(
          hour== -1)hour23;
          }

          //-----------------------------------------------------------------
          void Keypad(void// Kiem tra phim nhan.
          {
          if(!
          Set_key)
          //phim Set duoc nhan ?
          F_set++; // Bien F_set co gia tri tu 0->2
          if(F_set>3)
          {
          F_set=0;
          rtc_write(0x00sec);
          rtc_write(0x01,min);
          rtc_write(0x02,hour);
          }
          }
          if(
          F_set==1)
          //Tang hoac giam gio neu F_set = 2
          if(!Up_keyhour++;
          if(!
          Dw_keyhour--;
          rtc_write(0x02,hour);
          }

          if(
          F_set==2)
          //Tang hoac giam phut neu F_set = 1
          if(!Up_keymin++;
          if(!
          Dw_keymin--;
          rtc_write(0x01,min);
          }

          if(
          F_set==3)
          //Tang hoac giam gio neu F_set = 2
          if(!Up_keysec++;
          if(!
          Dw_keysec--;
          rtc_write(0x00sec);
          }
          Fix_time(); //kiem tra tran so
          delay1(13000);
          }

          //-------------------------------------------------------
          void T1_ISR(voidinterrupt 3 //ngat timer 1 chay dong ho
          {
          TR1=0;
          TF1=0;
          TH1=0x3C// nap lai gia tri cho thanh ghi
          TL1=0xAF;
          time++;
          if(
          time==5)
          {
          time=0B_nhay++; get_t=1;

          if(
          B_nhay==4)
          B_nhay=0;
          }
          TR1=1;
          }
          /*************************************/
          void T0_ISR(voidinterrupt 1 // Dung ngat timer 0 de quet led
          {
          TR0=0;
          TF0=0;
          TH0=-1000/256// Nap lai gia tri cho thanh ghi
          TL0=-1000%256;
          index++;
          LED1=0;
          LED2=0;
          LED3=0;
          LED4=0;
          LED5=0;
          LED6=0;
          if(
          index==1)
          { if(
          F_set==&& B_nhay==1){index++; index++;}
          else
          {
          P2=led7_data[sec%10];
          LED6=1;
          }
          //lay so du sau khi chia 10
          if(index==2)
          {
          P2=led7_data[sec/10];
          LED5=1;
          //xuat gia tri hang chuc

          if(index==3)
          {
          if(
          F_set==&& B_nhay==1){index++; index++;}
          else
          {
          P2=led7_data[min%10];
          LED4=1;
          }
          }
          if(
          index==4)
          {
          P2=led7_data[min/10];
          LED3=1;
          }

          if(
          index==5)
          {
          if(
          F_set==&& B_nhay==1){index=0;}
          else
          {
          P2=led7_data[hour%10];
          LED2=1;
          }
          }

          if(
          index==6)
          {
          P2=led7_data[hour/10];
          LED1=1;
          index=0;
          }

          TR0=1;
          }
          //------------------------------------------------
          void main()
          {
          time=index=0;
          hour=0;
          min=0;
          sec=10;
          F_set=0;
          get_t=0;
          setup_timer();
          rtc_write(0x0710); // set control register 00010000; 1Hz
          while(1)
          {
          Keypad();
          //if(F_set==0)
          //{
          if(get_t == 1)
          {
          get_t 0;
          // d?c th?i gian t? RTC
          sec rtc_read(0x00);
          min rtc_read(0x01);
          hour rtc_read(0x02);


          //}
          }
          if((
          sec%2)==0)
          denled=1;
          else
          denled=0;
          }

          Attached Files
          Last edited by chumanh; 27-03-2011, 13:39.

          Comment


          • #20
            Bạn chumanh bạn đã có lòng thì sửa giúp hộ cái mà khi bắt đầu mạch chạy thì là luc 12:00:00 với được ko ? bạn giúp mình với nhé, cảm ơn bạn rất nhiều.

            Comment


            • #21
              bạn chumanh ơi ! mình co nap cai code mà bạn sửa vào nhưng nó vẫn hiển thị 6 số 8 vậy hiện tượng trên là gì vậy ? bạn có thể xem giúp mình với được ko ?

              Comment


              • #22
                có ai đó từng làm cái này mà bị hiện tượng như của mình ko ? khi nạp song cắm vào cả 6 con led 7 thanh hiển thị toàn số 8 và khi ấn phím điều chỉnh thì led có nhấp nháy nhưng nhấp nháy cả 6 con luôn, mình nghĩ là do phần quét led có vấn đề, nhưng khi thử mô phỏng thì cái code lại ok, chẳng hiểu lý do làm sao nữa, chán quán các bác trong diễn đàn ai có nhiều kinh nghiệm trong vụ này giúp e với nhé, cảm ơn mọi người rất nhiều.

                Comment


                • #23
                  cậu kiểm tra lại phần cứng đi, lấy VOM dò thử xem có đứt hay chạm mạch chỗ nào không, hiện tượng như thế này là thường xuyên, hoặc có thể là do code ở phần hiển thị cái cậu gì viết ý nhờ ! mình nghĩ có thể chưa có câu lệnh tắt toàn bộ led khi chuẩn bị dịch led nên nó bị "ma lem"

                  Comment


                  • #24
                    bạn có thể xem giúp cho mình cái đoạn ngắt đó được ko ? mình mới làm về VDK lên cũng ko giỏi lắm về cái này, nhờ bạn giúp cho với nhé, giờ tất cả các led nó hiển thị toàn số 8 nhưng led báo thì vẫn chớp tắt bình thường thế mới chán chứ lại, bực mình quá, bạn giúp mình với nhé.

                    Comment


                    • #25
                      Nguyên văn bởi hahai Xem bài viết
                      bạn có thể xem giúp cho mình cái đoạn ngắt đó được ko ? mình mới làm về VDK lên cũng ko giỏi lắm về cái này, nhờ bạn giúp cho với nhé, giờ tất cả các led nó hiển thị toàn số 8 nhưng led báo thì vẫn chớp tắt bình thường thế mới chán chứ lại, bực mình quá, bạn giúp mình với nhé.
                      cậu có ở sg ko ! ghé qua mình hướng dẫn cho, tại bữa nay đang bận viết báo cáo cái đồ án nên chưa có thời gian lắm

                      Comment


                      • #26
                        không mình đang ở ngoài HN cơ, khi nào bạn có thời gian bạn giúp mình với nhé, cảm ơn bạn rất nhiều, nick yahoo của mình là: hanoimuathu20032003 rất mong được bạn hướng dẫn

                        Comment


                        • #27
                          Hình như bạn làm theo mạch bên mình thì phải , nếu đúng vậy thì nhầm cơ bản C1815 thay bằng A1015

                          Comment


                          • #28
                            Mình thấy cái code kia chắc là không có vấn đề gì rồi. Bạn có thể xem lại cái mạch lắp ráp của bạn xem.
                            + Phần reset
                            + Đã nối VCC - GND
                            + EA nối lên nguồn
                            + Dao động Cho VDK ( cậu xem kĩ lại con thạch anh và tụ xem) trước tớ cũng bị thế này hóa ra là bị hỏng con tụ. Cậu xem lại xem.

                            Comment


                            • #29
                              Gửi các bạn trong diễn đàn, mình đã cho mạch của mình chạy được rồi nhưng có thêm 1 vấn đề nữa là tất cả các led nháy rấ đau mắt và ko được sáng lắm vậy theo các bạn lý do làm sao tại code có vấn đề hay tại mạch để trở cao quá, khi mô phỏng ko để 2 con trở 10K chỗ con DS thì mạch chạy ko bị nháy nhưng khi con trở 10K vào thì nháy như chạy ngoài mạch thật, vậy các bạn ai đã bị trường hợp như của mình thì mách bảo mình với nhé, cảm ơn các bạn nhiều,

                              Comment


                              • #30
                                Nguyên văn bởi hahai Xem bài viết
                                Gửi các bạn trong diễn đàn, mình đã cho mạch của mình chạy được rồi nhưng có thêm 1 vấn đề nữa là tất cả các led nháy rấ đau mắt và ko được sáng lắm vậy theo các bạn lý do làm sao tại code có vấn đề hay tại mạch để trở cao quá, khi mô phỏng ko để 2 con trở 10K chỗ con DS thì mạch chạy ko bị nháy nhưng khi con trở 10K vào thì nháy như chạy ngoài mạch thật, vậy các bạn ai đã bị trường hợp như của mình thì mách bảo mình với nhé, cảm ơn các bạn nhiều,
                                thứ nhất nhé, cậu bỏ 2 con trở đó đi
                                thứ 2 nhé, cậu tăng tốc độ quét lên = >LED ko giựt nhưng sáng yếu.
                                thứ 3 là nguồn cấp cho LED, vấn đề nảy sinh là do tốc độ quét tăng, do đó ta phải cấp nguồn đủ cho LED thì LED mới sáng đệp được, thay mạch cấp nguồn cho LED bằng bộ darlington thay vì sử dụng 1 TRANS!

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X