Thông báo

Collapse
No announcement yet.

cần giúp mạch đồng hồ 89c2051

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

  • cần giúp mạch đồng hồ 89c2051

    Tình hình là thế này các Bác ạ, Em đang quyết tâm học 8051, đang còn dư 2 con 89S52 , 1 con 89c2051, led 7 thanh đủ lắp 1 cái đồng hồ, Loay hoay tìm mãi trên mạng thấy có mạch đồng hồ 89c2051 của Bác Duy phi là dễ nhất và đơn giản nhất, (chỉ gồm có 1 con 89c2051 và 4 led 7 đoạn, 4trans, 1IC 7805), Backup time bằng 3 pin 1,5V, không cần IC RTC, nhưng lại không có mạch nạp 89c2051 (Em không có con IC74LS373 để lắp mạch nạp này), vậy có thể thay 89c2051 bằng 89s52 được không, khi đó phải thay đổi sơ đồ mạch ntn? thay đổi code những gì?. Cám ơn các bác nhé!
    Email:
    Đau đầu vì điện tử

  • #2
    đc, bạn chỉ cần ráp đúng các chân như trong mạch 892051 qua bên con 8952 rồi treo chân 31 của 8952 lên Vcc. Lưu ý mạch này sẽ khá là sai số, có thể sai mỗi ngày 1 hoặc 2 giây

    Comment


    • #3
      có cần phải thay đổi lại code không vậy bạn?
      #include c:\mc51\8051io.h
      #include c:\mc51\8051reg.h
      extern register char cputick;
      unsigned register char
      sec100,sec,sec5,min,hour,flag1,command,ACC,temp,op to;
      /* above must be defined as register for tiny model */
      unsigned register char i,digit,buffer[4],onHour1,onMin1,offHour1,offMin1;
      register char key,delay,count1;
      char convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f };
      main()
      {
      opto = 0xff;
      cputick = 0;
      hour = 18;
      min = 0;
      sec = 0;
      key = -1;
      flag1 = 0;
      onHour1 = 18; /* 18:30 turn lamp on */
      onMin1 = 01;
      offHour1 = 18; /* 21:30 turn off */
      offMin1 = 02;
      count1 = 0;
      buffer[0] = 0x40;
      buffer[1] = 0x40;
      buffer[2] = 0x40;
      buffer[3] = 0x40;
      serinit(9600); /* must be invoked for tiny model */
      while(1)
      {
      while ( cputick < 1)
      scanLED();
      cputick = 0;
      /*------------- the following tasks execute every 10ms ------*/
      time();
      timeToBuffer();
      blink();
      offmsd();
      keyexe();
      keydelay();
      comparetime();
      /*-----------------------------------------------------------*/
      }
      }
      /* ****************** change constant below for other X-tal ********/
      time ()
      /* update real-time clock */
      {
      sec100++;
      if (sec100 >= 100) /* 100 * 10 ms = 1 s */
      {sec100 = 0;
      flag1 |= 0x05; /* set bit 0, bit 2 */
      temp = 50;
      sec++;
      if (sec >= 60)
      {sec = 0;
      flag1 |= 0x02; /* set bit 1 */
      min++;
      if (min >= 60)
      {min = 0;
      hour++;
      if (hour >= 24)
      {hour = 0;
      }
      }
      }
      }
      }
      scanLED() /* scan 4-digit LED and 4-key switch, if key pressed key = 0-3
      else key = -1 */
      {
      int i;
      digit = 0x08;
      key = -1;
      for( i = 0; i < 4; i++) /* 4-DIGIT scanning */
      {
      P3 = ~digit & opto; /* send complement[digit] */
      P1 = ~buffer[i]; /* send complement[segment] */
      pause(1); /* delay a while */
      P1 = 0xff; /* off LED */
      if ((P3 & 0x10) == 0) /* if key pressed P3.4 became low */
      key = i; /* save key position to key variable */
      digit>>=1; /* next digit */
      }
      }
      timeToBuffer()
      {
      buffer[0] = convert[min%10];
      buffer[1] = convert[min/10];
      buffer[2] = convert[hour%10];
      buffer[3] = convert[hour/10];
      }
      blink()
      {
      if((flag1 & 0x04) != 0) /* check bit 2 if set decrement temp until zero
      */
      {temp--;
      if (temp != 0)
      {
      buffer[1] |= 0x80;
      buffer[2] |= 0x80;
      }
      else( flag1 &= ~0x04);
      }
      }
      keyexe()
      {
      if (key != -1)
      {
      if ((flag1 & 0x80) == 0) /* within 0.5 sec after 1st press
      the following execution is not allowed
      */
      {
      flag1 |= 0x80;
      delay = 50;
      switch(key){
      case (0): /* key position 0 */
      manualOnOff(); /* service key 0 */
      break;
      case (1): /* key position 1 */
      savetimeOnOff1(); /* service key 1 */
      break;
      case (2): /* key position 2 */
      setmin(); /* service key 2 */
      break;
      case (3): /* key position 3 */
      sethour();
      }
      }
      }
      }
      sethour()
      {
      hour++;
      if ( hour== 24)
      hour = 0;
      }
      setmin()
      {
      min++;
      sec = 0;
      if( min == 60 )
      min = 0;
      }
      savetimeOnOff1()
      {
      count1++;
      if (count1 == 1)
      {
      onHour1 = hour;
      onMin1 = min;
      buffer[0] = 0x00;
      buffer[1] = 0x68;
      buffer[2] = 0x78;
      buffer[3] = 0x71;
      showOnce();
      }
      else
      {
      count1 = 0;
      savetimeOff1();
      }
      }
      savetimeOff1()
      {
      offHour1 = hour;
      offMin1 = min;
      buffer[0] = 0x63;
      buffer[1] = 0x63;
      buffer[2] = 0x78;
      buffer[3] = 0x71;
      showOnce();
      }
      manualOnOff()
      {
      opto= ~opto | 0x7f; /* complement bit 7 which in turn activates P3.7
      */
      if ((opto & 0x80) == 0)
      {
      buffer[0] = 0;
      buffer[1] = 0;
      buffer[2] = 0x68;
      buffer[3] = 0x78;
      showOnce();
      }
      else
      {
      buffer[0] = 0;
      buffer[1] = 0x63;
      buffer[2] = 0x63;
      buffer[3] = 0x78;
      showOnce();
      }
      }
      showOnce()
      {
      int i;
      for(i=0;i<500;i++)
      scanLED();
      }
      keydelay()
      {
      if ((flag1 & 0x80) !=0)
      {
      delay--;
      if(delay == 0)
      flag1 &= ~0x80;
      }
      }
      comparetime()
      {
      if((flag1 & 0x01) != 0 )
      {
      flag1 &= ~0x01;
      if(hour == onHour1 && min == onMin1)
      opto = 0x7f; /* clear P3.7 turning opto on */
      if(hour == offHour1 && min == offMin1)
      opto = 0xff; /* set bit P3.7 turning opto off */
      }
      }
      offmsd()
      {
      if (buffer[3] == 0x3f) /* if msd = '0' then put blank unstead */
      buffer[3] = 0x00;
      }
      pause(j)
      int j;
      {
      int i;
      for (i = 0; i < j; i++)
      ;
      }
      Ví dụ như chỗ
      #include c:\mc51\8051io.h
      #include c:\mc51\8051reg.h
      thì phải thay đổi thành 89c52 chứ nhỉ?, Mình hiểu lơ mơ lắm, giúp mình nhé!
      Email:
      Đau đầu vì điện tử

      Comment


      • #4
        mình ko biết nhiều về C nhưng mà code của 8951 thì hoàn toàn có thể nạp cho 8952 mà ko cần sửa gì

        Comment


        • #5
          Thanhks! mình xẽ mô phỏng , làm mạch thật để chạy, có gì không hiểu mình sẽ tiếp tục hỏi sau.
          Email:
          Đau đầu vì điện tử

          Comment


          • #6
            bạn làm vậy thì khi cúp điện lấy đâu ra nguồn nuôi cho 89S52 liệu máy cục pin kia được bao lâu thời gian,hết pin resert.lại phải chỉnh lại giờ,tốt nhất làm có RTC DS1307 là hay nhất
            _--------------------------------------------------

            **** ------------------------------------------***

            Comment


            • #7
              từ từ nâng cấp lên, đừng vội vàng làm chi
              - - -

              Comment


              • #8
                Nguyên văn bởi romance_qt Xem bài viết
                bạn làm vậy thì khi cúp điện lấy đâu ra nguồn nuôi cho 89S52 liệu máy cục pin kia được bao lâu thời gian,hết pin resert.lại phải chỉnh lại giờ,tốt nhất làm có RTC DS1307 là hay nhất
                Đúng! mình cũng nghĩ vậy, theo Bác Duy Phi thì 3 pin chỉ cấp điện cho 89c2051 thôi, không cấp dòng cho led7 đoạn, nên có thể backup thời gian được cả tuần nếu mất điện, nhưng đối với 89s52 thì dòng tĩnh của nó là bao nhiêu mA? còn cấp nguồn cho nó mà dùng 3 quả pin, chỉ được có 4,5V và lại bị sụt áp qua diode mất 0,5V đến 0,7V nữa thì lúc đó nguồn cho nó chỉ còn dưới 4V, vậy nó còn hoạt động chính xác nữa hay ko?, vì vậy mình sẽ lắp trên testboard thôi, khi nào có RTC mình mới làm mạch cụ thể, mục đích là để học thôi mà.
                Email:
                Đau đầu vì điện tử

                Comment


                • #9
                  Mình dùng 89s52, mô phỏng bằng proteus7.1 nó ko chạy là sao nhỉ, sao Bác Phi viết bài mà ko kiểm tra lại, ở chỗ led7 chung anode trong hình bác lại viết là catod chung là sao?

                  còn cái code của nó nữa, liệu có sai sót gì không?
                  Email:
                  Đau đầu vì điện tử

                  Comment


                  • #10
                    Nguyên văn bởi lowpass Xem bài viết
                    Mình dùng 89s52, mô phỏng bằng proteus7.1 nó ko chạy là sao nhỉ, sao Bác Phi viết bài mà ko kiểm tra lại, ở chỗ led7 chung anode trong hình bác lại viết là catod chung là sao?

                    còn cái code của nó nữa, liệu có sai sót gì không?
                    đưa mạch và code lên đây mình hô biến cho ^^!

                    Comment


                    • #11
                      Nguyên văn bởi chung1608 Xem bài viết
                      đưa mạch và code lên đây mình hô biến cho ^^!
                      Mình gửi file mô phỏng bằng proteus7.1
                      và đây là hướng dẫn
                      code ở bài trên mình đã post, giúp mình với!
                      Attached Files
                      Last edited by lowpass; 08-10-2011, 18:24.
                      Email:
                      Đau đầu vì điện tử

                      Comment


                      • #12
                        tình hình là code C, mạch muốn led sáng phải thay trans PNP thành cỗng NOT (protues mô phỏng quét led ko dùng trans được )

                        Comment


                        • #13
                          Nguyên văn bởi chung1608 Xem bài viết
                          tình hình là code C, mạch muốn led sáng phải thay trans PNP thành cỗng NOT (protues mô phỏng quét led ko dùng trans được )
                          code C hay ASM thì cũng chuyển sang file .hex chứ nhỉ? mình chẳng hiểu, còn cái cổng NOT lắp thế nào vậy? mình chạy mô phỏng bằng file .hex copy được ở trong bài hướng dẫn ấy, mà nó vẫn không chạy, toàn báo lỗi?
                          Email:
                          Đau đầu vì điện tử

                          Comment


                          • #14
                            Nguyên văn bởi lowpass Xem bài viết
                            code C hay ASM thì cũng chuyển sang file .hex chứ nhỉ? mình chẳng hiểu, còn cái cổng NOT lắp thế nào vậy? mình chạy mô phỏng bằng file .hex copy được ở trong bài hướng dẫn ấy, mà nó vẫn không chạy, toàn báo lỗi?
                            cấu trúc file hex là mỗi đầu dòng phải có dấu : Bạn phải lùi những dòng nào bị xuống hàng mà ko có dấu : lại dòng trên đó
                            Cổng NOT thay cho trans, chân B của trans là chân vào cổng NOT chân C của trans là chân ra của công NOT

                            Comment


                            • #15
                              Mình đã vẽ lại rồi dùng IC cổng NOT 74LS05, mạch chạy không báo lỗi nữa, nhưng không có led nào sáng, chỉ thấy các cổng có tín hiệu nhấp nháy, giúp mình một lần nữa đi nhé, nếu không mô phỏng được thì mình làm mạch thật thôi vậy.
                              Attached Files
                              Email:
                              Đau đầu vì điện tử

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X