Thông báo

Collapse
No announcement yet.

Đồng hồ số dùng 4 LED 7 đoạn

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

  • Đồng hồ số dùng 4 LED 7 đoạn

    Mình có biết qua về thuật toán nhưng không biết đúng hết chưa,anh em ai biết chỉ dùm mình với
    Đồng hồ có dạng h1 h2 : m1 m2

    Dùng timer 0 để tạo clock
    Clock xuất ra được giờ(tính được h1 h2),phút(tính ra m1 m2)
    Dùng timer 1 để quét 4 led
    LED1 hiển thị h1
    LED2 hiển thị h2
    LED3 hiển thị m1
    LED4 hiển thị m2

    Mình có 2 í thắc mắc
    1) Có nhất thiết phải dùng timer 0 cho clock, timer 1 để quét không, hay dùng ngược lại vẫn được?
    (vì mình nghĩ timer 0 được ưu tiên hơn nên khi vào timer 0 thì quá trình quét bị dừng lại)
    2) Trong hàm ngắt timer 0 tạo clock có biểu thức tính phút=phút++;
    giờ=giờ++;
    Nếu sau mỗi khi thực hiện ngắt xong, thoát ra (để quét 4 LED tiếp) thì những giá trị này có bị reset lại như trước khi ngắt không? (nếu mà như vậy thì giá trị quét trên 4 LED sẽ không đúng nữa)
    Mong mọi người giúp đỡ!

  • #2
    Bạn nên xem mức ưu tiên ngắt mà chọn chương trình ngắt cho hợp lí.

    Comment


    • #3
      Mình có biết qua về thuật toán nhưng không biết đúng hết chưa,anh em ai biết chỉ dùm mình với
      Đồng hồ có dạng h1 h2 : m1 m2

      Dùng timer 0 để tạo clock
      Clock xuất ra được giờ(tính được h1 h2),phút(tính ra m1 m2)
      Dùng timer 1 để quét 4 led
      LED1 hiển thị h1
      LED2 hiển thị h2
      LED3 hiển thị m1
      LED4 hiển thị m2

      Mình có 2 í thắc mắc
      1) Có nhất thiết phải dùng timer 0 cho clock, timer 1 để quét không, hay dùng ngược lại vẫn được?
      (vì mình nghĩ timer 0 được ưu tiên hơn nên khi vào timer 0 thì quá trình quét bị dừng lại)
      2) Trong hàm ngắt timer 0 tạo clock có biểu thức tính phút=phút++;
      giờ=giờ++;
      Nếu sau mỗi khi thực hiện ngắt xong, thoát ra (để quét 4 LED tiếp) thì những giá trị này có bị reset lại như trước khi ngắt không? (nếu mà như vậy thì giá trị quét trên 4 LED sẽ không đúng nữa)
      Mong mọi người giúp đỡ!
      1/Không nhất thiết phải dùng timer0 cho clock, timer1 để quét LED vì đây là 2 ngoại vi độc lập với nhau của 8051. Tuy nhiên nếu bạn dùng cả ngắt timer0 và ngắt timer1 thì nên chú ý đến vấn đề ưu tiên của 2 ngắt này.
      2/Nếu các biến chứa giá trị về giờ phút nếu được khai báo là biến toàn cục, thì khi ra khỏi chương trình ngắt giá trị của nó không bị mất đi. Nhưng nếu bạn khai báo nó là biến cục bộ trong chương trình phục vụ ngắt thì khi thoát khỏi ngắt, giá trị của nó không còn.
      3/Không nhất thiết phải dùng 2 timer cho công việc này. Chỉ cần 1 timer để đếm tăng thời gian. Phần quét LED bạn có thể đưa vào vòng lặp while(1).
      4/Mạch của bạn dùng làm mạch đếm thời gian để chơi thôi, không phải là mạch đồng hồ thời gian thực. Vì timer của VDK không thể cho ta thời gian thực. Muốn có thời gian thực thì phải sử dụng các loại RTC như DS12887,DS1307...
      For a better world

      Comment


      • #4
        Chà !! Trả lời chi tiết thế này thì còn gì bằng
        Lâu ngày quá ! Ngoài Hà nội trời đẹp không bạn ?

        Comment


        • #5
          Lâu ngày quá ! Ngoài Hà nội trời đẹp không bạn ?
          Sáng nay thì trời đẹp, tranh thủ mang mấy bộ quần áo ra phơi chiều thì không bít.
          Mấy ngày nay mưa tầm tã, nó mà mưa thêm 4 năm ngày nữa thì chỉ có nước...nude
          For a better world

          Comment


          • #6
            Nguyên văn bởi Toan.Lv Xem bài viết
            1/Không nhất thiết phải dùng timer0 cho clock, timer1 để quét LED vì đây là 2 ngoại vi độc lập với nhau của 8051. Tuy nhiên nếu bạn dùng cả ngắt timer0 và ngắt timer1 thì nên chú ý đến vấn đề ưu tiên của 2 ngắt này.
            2/Nếu các biến chứa giá trị về giờ phút nếu được khai báo là biến toàn cục, thì khi ra khỏi chương trình ngắt giá trị của nó không bị mất đi. Nhưng nếu bạn khai báo nó là biến cục bộ trong chương trình phục vụ ngắt thì khi thoát khỏi ngắt, giá trị của nó không còn.
            3/Không nhất thiết phải dùng 2 timer cho công việc này. Chỉ cần 1 timer để đếm tăng thời gian. Phần quét LED bạn có thể đưa vào vòng lặp while(1).
            4/Mạch của bạn dùng làm mạch đếm thời gian để chơi thôi, không phải là mạch đồng hồ thời gian thực. Vì timer của VDK không thể cho ta thời gian thực. Muốn có thời gian thực thì phải sử dụng các loại RTC như DS12887,DS1307...
            Quét LED bằng while mình không rành lắm, co phải dùng hàm delay(..) thay cho timer phải không bạn?
            Với lại timer 0 dùng cho đếm thời gian mình khai báo
            void T0_ISR(void) interrupt 1
            có đúng không bạn?
            Mấy cái hàm ngắt này luôn luôn void ... (void) ? Vì mình thử thay là
            void T0_ISR(unsigned char h1,...) interrupt 1 nó máy lỗi là "may not receive or return..."
            Mình nghĩ về 2 cái timer đó như sau k biết thế nào
            chọn timer 0 :đồng hồ, timer 1: quét -> quét chạy bình thường, nhưng khi đủ 60s thì lại xảy ra ngắt do timer 0, do được ưu tiên nên quét bị dừng lại, vào hàm ngắt timer 0, thay đổi phút, giờ rồi thoát ra -> quét tiếp.
            chọn timer 1 :đồng hồ, timer 0: quét -> đồng hồ chạy bình thương,xuất ra các giá trị phút giờ,nhưng cứ sau 5000us(do mình đặt)thì ngắt timer 0 xảy ra, đồng hồ bị dừng lại, hàm ngắt timer 0 thực hiện quét LED.
            Như vậy:
            +nếu chọn theo cách thứ 2, đồng hồ sẽ bị ngắt nhiều lần (cả triệu lần) so với cách 1
            +ngắt quét không ảnh hường nhiều vì trong thời gian ngắn như vậy hầu như sẽ không ảnh hưởng tới quét
            còn clock bị ngắt nhiều sẽ ảnh hưởng tới việc đếm thời gian (dù ngắt trong thời gian nhỏ nhưng tích tiểu thành đại,sau vài ngày chắc cũng lêch 1s
            => chọn theo cách 1,đúng không mấy bác

            1 í nữa, lập trình xong báo lỗi bad operand type nghĩa là sao bạn, có phải do mình chon sai kiểu dữ liệu unsigned char không, hay là có phép tính nào đó sai?

            Để mình làm được cái này đã rồi sang tim hiểu thời gian thực cho biết, h nge bạn noi RTC mà có biết đâu
            Last edited by legosse; 17-05-2009, 11:43.

            Comment


            • #7
              Hàm ngắt không có tham số, và cũng không có kiểu trả về.
              Vì các biến bạn dùng là các biến toàn cục rồi, các thanh ghi, các port.
              bạn tham khảo về cấu trúc hàm ngắt đi.
              Last edited by Multi System; 17-05-2009, 11:50.

              Comment


              • #8
                Biến toàn cục chứ bạn

                Comment


                • #9
                  ai bảo là 8051 không thể tạo ra thời gian chính xác được.mình có thể tính toán dwuwocj mừ.
                  - theo tôi nhất định phải dùng một timer để định thời gian cho chuẩn,mình đã biết được tần số của thạch anh rùi như vậy sẽ tính ra đươc chu kỳ máy và mói lẹnh của 8051 sẽ thực hiện trong bao chu kỳ may mình cũng đã bít như vậy là có thể tính toán được chính xác đến 99,99 rùi

                  Comment


                  • #10
                    khuyên chân thành với bạn là sài con realtime ds1307. đừng nghe mấy bác kia rùi đồng hồ chạy sai cho mà xem

                    Comment


                    • #11
                      Nguyên văn bởi thinhminhhb Xem bài viết
                      khuyên chân thành với bạn là sài con realtime ds1307. đừng nghe mấy bác kia rùi đồng hồ chạy sai cho mà xem
                      Các bác xem dùm cái lỗi error C193: '-' : bad operand type
                      Đây là chương trình = C
                      #include <AT89x51.h>
                      #include <intrins.h>
                      //Dinh nghia I/O
                      #define LED_DATA P0
                      #define key1 P2_0
                      #define key2 P2_1
                      #define key3 P2_2
                      #define key4 P2_3
                      #define LED1 P2_4
                      #define LED2 P2_5
                      #define LED3 P2_6
                      #define LED4 P2_7
                      //Khai bao cac chuong trinh con
                      void setup_timer1(void);
                      void setup_timer0(void);
                      void quet_phim_h1(void);
                      void quet_phim_h2(void);
                      void quet_phim_m1(void);
                      void quet_phim_m2(void);
                      void delay(unsigned int number);
                      //Khai bao bien
                      unsigned char code bang_ma[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
                      unsigned char count1,count2,sec,h1,h2,m1,m2,hour,minute;
                      //Ham khai bao dung ngat timer1
                      void setup_timer1(void)
                      { TMOD=0x10;
                      TH1=0x3C;
                      TL1=0xAF;
                      ET1=1;
                      EA=1;
                      TF1=0;
                      TR1=1;
                      }
                      //Ham khai bao dung ngat timer0
                      void setup_timer0(void)
                      { TMOD=0x01;
                      TH0=0x3C;
                      TL0=0xAF;
                      ET0=1;
                      EA=1;
                      TF0=0;
                      TR0=1;
                      }
                      //Ham ngat timer1 dung de tao clock
                      void T0_ISR(void) interrupt 1
                      { TR0=0;
                      TH0=0x3C;
                      TL0=0xAF;
                      count1++;
                      if(count1==20)
                      { count1=0;
                      sec++;
                      }
                      if(sec==60)
                      { sec=0;
                      minute++;
                      if(minute==60)
                      { minute=0;
                      hour++;
                      if(hour==24) hour=0;
                      }
                      }
                      TF0=0;
                      TR0=1;
                      }
                      //Ham ngat timer0 dung de quet
                      void T1_ISR(void) interrupt 3
                      { TR1=0;
                      TH1=0xEC; //5000us
                      TL1=0x77;
                      count2++;
                      LED1=1;
                      LED2=1;
                      LED3=1;
                      LED4=1;
                      if(count2==1)
                      { LED_DATA=bang_ma[h1];
                      LED1=0;
                      }
                      if(count2==2)
                      { LED_DATA=bang_ma[h2];
                      LED2=0;
                      }
                      if(count2==3)
                      { LED_DATA=bang_ma[m1];
                      LED3=0;
                      }
                      if(count2==4)
                      { LED_DATA=bang_ma[m2];
                      LED4=0;
                      count2=0; //Khoi dong lai bien dem
                      }
                      TF1=0;
                      TR1=1;
                      }
                      //Ham quet phim
                      void quet_phim_h1(void)
                      { if(!key1-1) //Neu phim duoc an key1=0
                      { while(!key1-1); //Chong nay phim
                      delay(30); //Chong soc dien
                      hour++;
                      if(hour>23) hour=0;
                      }
                      }
                      void quet_phim_h2(void)
                      { if(!key2-1) //Neu phim duoc an key2=0
                      { while(!key2-1); //Chong nay phim
                      delay(30); //Chong soc dien
                      hour--;
                      if(hour<0) hour=23;
                      }
                      }
                      void quet_phim_m1(void)
                      { if(!key3-1) //Neu phim duoc an key3=0
                      { while(!key3-1); //Chong nay phim
                      delay(30); //Chong soc dien
                      minute++;
                      if(minute>59) minute=0;
                      }
                      }
                      void quet_phim_m2(void)
                      { if(!key4-1) //Neu phim duoc an key4=0
                      { while(!key4-1); //Chong nay phim
                      delay(30); //Chong soc dien
                      minute--;
                      if(minute<0) minute=59;
                      }
                      }
                      //Dinh nghia ham delay
                      void delay(unsigned int number)
                      { unsigned char j;
                      unsigned char i;
                      for(i=0;i<=number;i++)
                      { for(j=0;j<=1000;j++)
                      {}
                      }
                      }
                      //Chuong trinh chinh
                      void main(void)
                      { count1=0;
                      count2=0;
                      sec=0;
                      hour=0;
                      minute=0;
                      setup_timer1();
                      setup_timer0();
                      while(1)
                      {h1=hour/10;
                      h2=hour%10;
                      m1=minute/10;
                      m2=minute%10;
                      quet_phim_h1();
                      quet_phim_h2();
                      quet_phim_m1();
                      quet_phim_m2();
                      }
                      }
                      Last edited by legosse; 17-05-2009, 13:46.

                      Comment


                      • #12
                        //Thứ nhất:
                        unsigned char code bang_ma[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

                        // Thứ 2:
                        if(!key1-1); là sao hả bạn ?
                        Bạn phải thay là:
                        PHP Code:
                        //Ham quet phim
                        void quet_phim_h1(void)

                          if(
                        key1==0//Neu phim duoc an key1=0
                             

                                 while(
                        key1==0); //Chong nay phim
                                 
                        delay(30); //Chong soc dien
                                 
                        hour++;
                                 if(
                        hour>23hour=0;
                              }
                        }
                        void quet_phim_h2(void)
                        {
                            if(
                        key2==0//Neu phim duoc an key2=0
                                
                        {
                                   while(
                        key2==0); //Chong nay phim
                                   
                        delay(30); //Chong soc dien
                                   
                        hour--;
                                   if(
                        hour<0hour=23;
                                }
                        }
                        void quet_phim_m1(void)
                        {
                              if(
                        key3==0//Neu phim duoc an key3=0
                                   
                        {
                                      while(
                        key3==0); //Chong nay phim
                                      
                        delay(30); //Chong soc dien
                                      
                        minute++;
                                      if(
                        minute>59minute=0;
                                   }
                        }
                        void quet_phim_m2(void)
                        {
                            if(
                        key4==0//Neu phim duoc an key4=0
                                
                        {
                                     while(
                        key4==0); //Chong nay phim
                                     
                        delay(30); //Chong soc dien
                                     
                        minute--;
                                     if(
                        minute<0minute=59;
                                  }

                        Last edited by Multi System; 17-05-2009, 15:25. Lý do: thêm code

                        Comment


                        • #13
                          Nguyên văn bởi Multi System Xem bài viết
                          // Thứ 2:
                          if(!key1-1); là sao hả bạn ?
                          Bạn phải thay là:
                          PHP Code:
                          //Ham quet phim
                          void quet_phim_h1(void)

                            if(
                          key1==0//Neu phim duoc an key1=0
                               

                                   while(
                          key1==0); //Chong nay phim
                                   
                          delay(30); //Chong soc dien
                                   
                          hour++;
                                   if(
                          hour>23hour=0;
                                }

                          Mình cũng đang thắc mắc điểm này,mình đi học ông thầy viết thế,bảo là giải ra thì chính là key1=0
                          Mình cũng không biết giải thế nào cả

                          Nguyên văn bởi Multi System Xem bài viết
                          //Thứ nhất:
                          unsigned char code bang_ma[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
                          [/PHP]
                          0x90 là mã của số 9 đó bạn
                          Pt g f e d c b a
                          1 0 0 1 0 0 0 0 => 0x90

                          Comment


                          • #14
                            Sửa xong không báo lỗi j nữa rồi bạn à, như thế là có thể nạp cho chip để chạy được chưa bạn nhỉ
                            Nhận tiện bạn giải thích if(!key1-1) cho mình với đc không,mình đọc thứ tự ưu tiên các phép tính trong C thấy - trước !
                            Như vậy khi nút 1 được ấn thì key1=0 => key1-1=-1 => !(-1)=? (một số khác 0) vậy thì if(!key1-1) là 1 điều kiện đúng => mình nghĩ là vẫn được chứ bạn nhỉ
                            Last edited by legosse; 17-05-2009, 20:09.

                            Comment


                            • #15
                              Mình biết đấy là mã font của 7-Seg rồi, nhưng trong code của bạn có chứa dấu Space, mình đã sửa lại và gạch chân cho bạn thấy.
                              Còn về câu điều kiện:
                              Khi key được ấn, tức là nó được nối xuống 0, vậy thì điều kiện đúng ở đây là nó bằng 0 chứ không phải là khác 0.
                              Còn bạn muốn dùng cấu trúc phủ định (not) trong câu điều kiện thì bạn có thể viết như sau:
                              PHP Code:
                              //Ham quet phim
                              void quet_phim_h1(void)

                                if(!
                              key1//Neu phim duoc an key1=0
                                   

                                       while(!
                              key1); //Chong nay phim
                                       
                              delay(30); //Chong soc dien
                                       
                              hour++;
                                       if(
                              hour>23hour=0;
                                    }
                              }
                              void quet_phim_h2(void)
                              {
                                  if(!
                              key2//Neu phim duoc an key2=0
                                      
                              {
                                         while(!
                              key2); //Chong nay phim
                                         
                              delay(30); //Chong soc dien
                                         
                              hour--;
                                         if(
                              hour<0hour=23;
                                      }

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X