Thông báo

Collapse
No announcement yet.

Dành cho các bạn mới hoc avr (7seg)

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

  • Dành cho các bạn mới hoc avr (7seg)

    đây là một chương trình mẫu ,đã qua chạy thử ,mong các bạn hãy đưa box avr lớn mạch hơn,thân ái.
    //----------------------------------------------------------------------
    //LAP TRINH : HIEN THI 4 LED 7SEG
    //TH : PHAN THE BINH
    //CN : DIEU KHIEN TU DONG
    //NTH : 19/10/2007
    //NHT : 19/10/2007
    //-----------------------------
    //-----------------------------
    #include <mega8.h>
    #include <delay.h>
    //-----------------------------
    #define led1 PORTC.3
    #define led2 PORTC.2
    #define led3 PORTC.1
    #define led4 PORTC.0
    //-----------------------------
    #define led_7seg PORTD
    //-----khai bao cac bien-------
    int h_don_vi,h_chuc,h_tram,h_nghin;
    int sodem,n_dv,n_c,n_t,n_n,n_7seg;
    //-----chuong trinh con--------
    void giai_ma_7_seg(int n_7seg);

    //----chuong trinh chinh-------
    void main(void)
    {
    //------khai bao cong ra-------
    DDRC =0xff;
    DDRD =0xff;
    //----nhap gia tri hien thi----
    sodem=1357;
    //-----------------------------
    //xu li giai ma so dem

    h_don_vi=sodem % 10;
    n_dv=sodem / 10;

    h_chuc=n_dv % 10;
    n_c=n_dv / 10;

    h_tram=n_c % 10;
    n_t=n_c / 10;

    h_nghin=n_t%10;
    n_n=n_t/10;
    //-----------------------------
    //----vong lap hien thi so----
    while (1)
    {

    //------------------
    n_7seg=h_don_vi;
    giai_ma_7_seg(n_7seg);
    led1=1;
    led2=1;
    led3=1;
    led4=0;
    delay_ms(5);
    //------------------
    n_7seg=h_chuc;
    giai_ma_7_seg(n_7seg);
    led1=1;
    led2=1;
    led3=0;
    led4=1;
    delay_ms(5);
    //------------------
    n_7seg=h_tram;
    giai_ma_7_seg(n_7seg);
    led1=1;
    led2=0;
    led3=1;
    led4=1;
    delay_ms(5);
    //-------------------
    n_7seg=h_nghin;
    giai_ma_7_seg( n_7seg);
    led1=0;
    led2=1;
    led3=1;
    led4=1;
    delay_ms(5);
    };
    }
    //-------------------------------
    //--------giai ma 7seg-----------
    //-------------------------------
    void giai_ma_7_seg(int n_7seg)
    {

    switch (n_7seg)
    {
    case 0:
    led_7seg=0xa0;
    break;
    case 1:
    led_7seg=0xbb;
    break;
    case 2:
    led_7seg=0x62;
    break;
    case 3:
    led_7seg=0x2a;
    break;
    case 4:
    led_7seg=0x39;
    break;
    case 5:
    led_7seg=0x2c;
    break;
    case 6:
    led_7seg=0x24;
    break;
    case 7:
    led_7seg=0xba;
    break;
    case 8:
    led_7seg=0x20;
    break;
    case 9:
    led_7seg=0x28;
    break;
    }
    }
    //----------------------------
    //---KET THUC CHUONG TRINH----
    //----------------------------

  • #2
    Chương trình hay.
    nhân đây NANO tặng các bạn chương trình đếm ngược từ 1 số bất kì (<=999).

    Code:



    Code:
    #include <mega8.h>
    #include <delay.h>
    // Declare your global variables here
    
    void hienthi(unsigned int data)  // ham hien thi tren led 7 thanh thuc hien ham get 10 mili giay
    {
      unsigned int a,b,c;
      
      a=data/100;
      b=(data-a*100)/10;
      c=data-a*100-b*10;
      
      PORTD=a;            //hien thi phan tram
      if (a==0) PORTD.5=0;
      else PORTD.5=1;    
      delay_ms(3);
      
      PORTD=b;              //hien thi phan chuc
      PORTD.5=0;
      if (a==0) 
       {
        if (b==0) PORTD.6=0;
        else PORTD.6=1;
       }
      else PORTD.6=1;
      delay_ms(3);
      
      PORTD=c;             //hien thi phan don vi
      PORTD.6=0;
      PORTD.7=1;
      delay_ms(4);
    }
    
    
    void demnguoc(unsigned int data)
    {
      unsigned char i;
      while (data!=0)
        {
         for (i=1; i<=100; i++)
           hienthi(data);        // tao 1s
         data--;
        }
      if (data==0) 
        {
          for (i=1; i<=100; i++)
            hienthi(0);
        } 
    }       
    
    // chuong trinh chinh cua chung ta
    void main(void)
    {
    // khoi tao cong PORT B
    PORTB=0x00;
    DDRB=0x00;
    
    // khoi tao cong PORT B
    PORTC=0x00;
    DDRC=0x00;
    
    // khoi tao cong PORT B
    PORTD=0x00;
    DDRD=0xFF;
    // khoi tao Timer 0
    TCCR0=0x00;
    TCNT0=0x00;
    
    // khoi tao Timer 1
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // khoi tao Timer 2
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    MCUCR=0x00;
    
    TIMSK=0x00;
    
    // bo so sanh
    ACSR=0x80;
    SFIOR=0x00;
    
    while (1)
          {                  
             demnguoc(999);
          };
    }
    chúc bạn thành công cùng AVR.
    Last edited by NANO PRO; 19-10-2007, 19:45.

    Comment


    • #3
      Khà khà... Cũng hay. Chỉ có điều các bác đưa chương trình mà không có mạch thì nhìn vào chương trình có khác gì nhìn vào bức vách???
      Để em thử miêu tả mạch của bác hikari2007 xem có đúng không nhé:
      + Dùng PORTD để nối với các chân dữ liệu của Led7seg
      + Dùng PORTC.0...3 để nối với 3 con tran để điều khiển cấp nguồn cho Led7seg
      Đúng không pác?
      Còn chương trình của bác Nano pro thì lại có vẻ phức tạp hơn. Nhưng nếu em nếu muốn cho nó chạy từ một số bất kì thì lại phải nạp lại à? Nếu không thay đổi con số 999 trong chương trình của bác thì nó sẽ luôn đếm ngược từ 999 về 000. Nếu muốn lúc thì nó đếm từ 999 lúc nó đếm từ 111 rồi lúc nó đếm từ xxx ngẫu nhiên thì sao? Làm ngẫu nhiên vui hơn chứ nhỉ.
      Dùng hàm: data = rand(); xem sao nhé
      Vui ghê há

      Comment


      • #4
        Còn chương trình của bác Nano pro thì lại có vẻ phức tạp hơn.
        để cho pác chê cười roài, cái mạch của em dễ ợt.
        1. dùng 4 bit thấp của PORTD vào giải mã 7447 ==> Led 7 thanh(chung bus)
        2. dùng 3 bit cao nhất của PORTD nối qua Trans kích cho mấy con Led 7 thanh

        dễ nhỉ các pác !!!

        Comment


        • #5
          he he tui cũng muốn đóng góp chút đây. cái của tui đơn giản hơn nhiều đó là cái modul hiển thị led7, dùng con tiny điều khiển hiển thị 4 led (hoặc nhiều hơn tùy thích) số cần hiển thị gửi qua uart
          sau đây la code và lib.c của modul hiển thị và hàm gửi số

          code modul hiển thị
          Project :
          Version :
          Date : 9/24/2007
          Author : TST
          Company :
          Comments:


          Chip type : ATtiny2313
          Clock frequency : 16.000000 MHz
          Memory model : Tiny
          External SRAM size : 0
          Data Stack size : 32
          ************************************************** ***/

          #include <tiny2313.h>
          #include<d:/delay.h>
          char i,j,k;
          char view_buffer[4];
          char led_num=0;
          char receive_num=0;
          flash char kitu[17]={ 0b11000000
          ,0b11111001
          ,0b10100100
          ,0b10110000
          ,0b10011001
          ,0b10010010
          ,0b10000010
          ,0b11111000
          ,0b10000000
          ,0b10010000
          ,0b11111111 // ki tu null " "
          ,0b10111111 //dau tru "-"
          ,0b11110111 //dau nhac "_"
          ,0b01111111}; // dau cham "."

          interrupt [8] void receive_overflow (void)
          {
          char num,data,buffer;
          buffer=UDR;
          data=buffer&0x0f;
          num=buffer&0xf0;
          num=num>>4;
          view_buffer[num]=kitu[data];
          receive_num++;
          }


          void main(void)
          {


          CLKPR=0x80;
          CLKPR=0x00;



          PORTA=0x00;
          DDRA=0x00;
          Func0=In
          State0=T
          PORTB=0xff;
          DDRB=0xff;

          PORTD=0xf8;
          DDRD=0xf8;

          TCCR0A=0x00;
          TCCR0B=0x00;
          TCNT0=0x00;
          OCR0A=0x00;
          OCR0B=0x00;

          TCCR1A=0x00;
          TCCR1B=0x00;
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x00;
          OCR1AL=0x00;
          OCR1BH=0x00;
          OCR1BL=0x00;


          GIMSK=0x00;
          MCUCR=0x00;

          TIMSK=0x02;

          USICR=0x00;

          UCSRB=0x90;
          UCSRC=0x06;
          UBRRH=0x00;
          UBRRL=0x67;

          ACSR=0x80;

          #asm("sei")
          while (1)
          {
          PORTB=0xff;
          PORTD=0xf8;
          k = 0b00001000<<led_num;
          PORTD &=~k ;
          PORTB =view_buffer[led_num];
          led_num++;
          if (led_num ==4)
          led_num=0;
          delay_us(100);
          }

          }

          LIB.c gửi số
          void send_digits(int num)
          {
          char i;
          int j;
          char flag_zero=1;
          i=num/1000;
          if((i==0)&(flag_zero==1) ) {i=10;} else { flag_zero=0;}
          while ( !( UCSRA & (1<<5)) );
          UDR =i|0x00;
          num%=1000;
          i=num/100;
          if((i==0)&(flag_zero==1) ){i=10;} else { flag_zero=0;}
          while ( !( UCSRA & (1<<5)) );
          UDR =i|0x10;
          num%=100;
          i=num/10;
          if((i==0)&(flag_zero==1)) {i=10;} else { flag_zero=0;}
          while ( !( UCSRA & (1<<5)) );
          UDR =i|0x20;
          num%=10;
          if((num==0)&(flag_zero==1) ){num=10;} else { flag_zero=0;}
          while ( !( UCSRA & (1<<5)) );
          UDR =num|0x30;

          }

          Comment


          • #6
            để cho pác chê cười roài, cái mạch của em dễ ợt.
            1. dùng 4 bit thấp của PORTD vào giải mã 7447 ==> Led 7 thanh(chung bus)
            2. dùng 3 bit cao nhất của PORTD nối qua Trans kích cho mấy con Led 7 thanh

            dễ nhỉ các pác !!!
            Bác nói thế em ngại quá. Tại em chưa từng dùng con 7447 bao giờ nên đọc mãi không hiểu và nói vậy thôi. Mong bác thông cảm
            Tóm lại, dù là mạch ghép nối kiểu gì thì chu trình quét led vẫn không bao giờ thay đổi cả:
            1. Đưa dữ liệu tới các chân A (nếu là loại K chung và ngược lại)
            2. Cấp nguồn nuôi cho led
            3. Trễ 1 khoảng thời gian
            4. Cắt nguồn nuôi led.
            5. Cho chạy chương trình xem có hiển thị đúng không, nếu không đúng theo ý thì là do mình quét sai hoặc mạch sai (cái này em cho thêm vào đấy, 1 chu kỳ quét cứ đủ 4 bước trên là ok, không sai được đâu )

            Comment


            • #7
              Chào bạn NANO!
              Mình là lính mới vào nghề thôi. Mình đã đọc và thực hành thử chương trình của bạn rồi.
              Chương trình của bạn rất hay. Tuy nhiên mình thấy cái đoạn tạo timer 1s của bạn hình như là không có tác dụng gì thì phải. Bởi vì, mình đã bỏ hết phần tạo timer và vòng lặp i rồi nhưng chương trình vẫn chạy bt.

              Comment


              • #8
                Có mỗi code ko có sơ đồ mạch thì người cũ đọc còn khó chứ nói chi người mới.
                AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                Xem thêm tại Online Store ---> Click here
                Mob: 0982.083.106

                Comment


                • #9
                  Code đã post roài.
                  Và đây là mạch cho anh em mới bắt đầu:
                  Mạch chính và modul hiển thị Led:







                  @Hqkhaibt: Đoạn code này ah?

                  Code:
                  
                  void demnguoc(unsigned int data)
                  {
                    unsigned char i;
                    while (data!=0)
                      {
                       for (i=1; i<=100; i++)
                         hienthi(data);        // tao 1s
                       data--;
                      }
                    if (data==0) 
                      {
                        for (i=1; i<=100; i++)
                          hienthi(0);
                      } 
                  }
                  Thật ư? thật khó hiểu!
                  Hiện giờ cặp Led 7 thanh đang ko có nhà ko là test lại ngay!
                  cái này nhằm cho đếm từ 999==>0 mỗi lần nhảy là 1s đúng!

                  Comment


                  • #10
                    hic, của bác nano em hiểu hết. Em góp ý thêm phần cứng của bác tý nhé. Dữ liệu dùng 7447 vậy là chỉ mất 4 chân data, nếu bác dùng con demux để quét chân enable của led thì lại tiết kiệm thêm. Còn bác t3h làm cũng hay, khi nào cần thay đổi giá trị của led thì send giá trị ra, còn nếu không thì kệ modul led 7 thích làm gì thì làm. CPU có thời gian làm việc khác. Điểm này giống với LCD., em nói vậy đúng không các bác. He he
                    Phone: 0978536011

                    Comment


                    • #11
                      Nguyên văn bởi NANO PRO Xem bài viết
                      Code đã post roài.
                      Và đây là mạch cho anh em mới bắt đầu:
                      Mạch chính và modul hiển thị Led:







                      @Hqkhaibt: Đoạn code này ah?

                      Code:
                      
                      void demnguoc(unsigned int data)
                      {
                        unsigned char i;
                        while (data!=0)
                          {
                           for (i=1; i<=100; i++)
                             hienthi(data);        // tao 1s
                           data--;
                          }
                        if (data==0) 
                          {
                            for (i=1; i<=100; i++)
                              hienthi(0);
                          } 
                      }
                      Thật ư? thật khó hiểu!
                      Hiện giờ cặp Led 7 thanh đang ko có nhà ko là test lại ngay!
                      cái này nhằm cho đếm từ 999==>0 mỗi lần nhảy là 1s đúng!
                      Mach của cậu rất hay , 1 cách khác để hiện thị được nhiều led 7 thanh và không cần dùng thêm nhiểu trans , mạch của cậu có thể bỏ đi 3 con trans , dùng led chung Katot ( anot ) va 1 con IC giải mã 4511 (7447 ), với kiểu mac mạch là led được nói với IC giải mã 4511 qua 1 con trở ; chân điều khiển led ( chân GND ) được nối với AVR , muốn cho led sáng cấp mức 0 và led tắt mức 1 , mình đã mô phỏng và có thể dùng đến 9 con led 7 thanh ( có thể dùng hơn nếu muốn ) . Sơ đồ mình đã post rùi , trong bài hỏi của mình về AVR ,nếu có điều kiện cậu có thể xem qua

                      Chúc vui !

                      Comment


                      • #12
                        Mach của cậu rất hay
                        dám để cho bạn chê cười roài.

                        1 cách khác để hiện thị được nhiều led 7 thanh và không cần dùng thêm nhiểu trans , mạch của cậu có thể bỏ đi 3 con trans , dùng led chung Katot ( anot ) va 1 con IC giải mã 4511 (7447 ), với kiểu mac mạch là led được nói với IC giải mã 4511 qua 1 con trở ; chân điều khiển led ( chân GND ) được nối với AVR , muốn cho led sáng cấp mức 0 và led tắt mức 1 , mình đã mô phỏng và có thể dùng đến 9 con led 7 thanh ( có thể dùng hơn nếu muốn ) . Sơ đồ mình đã post rùi , trong bài hỏi của mình về AVR ,nếu có điều kiện cậu có thể xem qua
                        cái này mình bít nhưng chưa làm, đang làm cái khác. Mà cái mạch trên mình mới vẽ hôm qua nên ....
                        Những bài của bạn mình sẽ coi qua! cảm ơn trước!

                        Comment


                        • #13
                          Nguyên văn bởi NANO PRO Xem bài viết
                          Chương trình hay.
                          nhân đây NANO tặng các bạn chương trình đếm ngược từ 1 số bất kì (<=999).

                          Code:



                          Code:
                          #include <mega8.h>
                          #include <delay.h>
                          // Declare your global variables here
                          
                          void hienthi(unsigned int data)  // ham hien thi tren led 7 thanh thuc hien ham get 10 mili giay
                          {
                            unsigned int a,b,c;
                            
                            a=data/100;
                            b=(data-a*100)/10;
                            c=data-a*100-b*10;
                            
                            PORTD=a;            //hien thi phan tram
                            if (a==0) PORTD.5=0;
                            else PORTD.5=1;    
                            delay_ms(3);
                            
                            PORTD=b;              //hien thi phan chuc
                            PORTD.5=0;
                            if (a==0) 
                             {
                              if (b==0) PORTD.6=0;
                              else PORTD.6=1;
                             }
                            else PORTD.6=1;
                            delay_ms(3);
                            
                            PORTD=c;             //hien thi phan don vi
                            PORTD.6=0;
                            PORTD.7=1;
                            delay_ms(4);
                          }
                          
                          
                          void demnguoc(unsigned int data)
                          {
                            unsigned char i;
                            while (data!=0)
                              {
                               for (i=1; i<=100; i++)
                                 hienthi(data);        // tao 1s
                               data--;
                              }
                            if (data==0) 
                              {
                                for (i=1; i<=100; i++)
                                  hienthi(0);
                              } 
                          }       
                          
                          // chuong trinh chinh cua chung ta
                          void main(void)
                          {
                          // khoi tao cong PORT B
                          PORTB=0x00;
                          DDRB=0x00;
                          
                          // khoi tao cong PORT B
                          PORTC=0x00;
                          DDRC=0x00;
                          
                          // khoi tao cong PORT B
                          PORTD=0x00;
                          DDRD=0xFF;
                          // khoi tao Timer 0
                          TCCR0=0x00;
                          TCNT0=0x00;
                          
                          // khoi tao Timer 1
                          TCCR1A=0x00;
                          TCCR1B=0x00;
                          TCNT1H=0x00;
                          TCNT1L=0x00;
                          ICR1H=0x00;
                          ICR1L=0x00;
                          OCR1AH=0x00;
                          OCR1AL=0x00;
                          OCR1BH=0x00;
                          OCR1BL=0x00;
                          
                          // khoi tao Timer 2
                          ASSR=0x00;
                          TCCR2=0x00;
                          TCNT2=0x00;
                          OCR2=0x00;
                          
                          MCUCR=0x00;
                          
                          TIMSK=0x00;
                          
                          // bo so sanh
                          ACSR=0x80;
                          SFIOR=0x00;
                          
                          while (1)
                                {                  
                                   demnguoc(999);
                                };
                          }
                          chúc bạn thành công cùng AVR.
                          Bác Nano ơi!cho em hỏi tí.Em đang tập dùng Codevision,cop thử cái chương trình của bác vào.Lúc compile thì bị báo lỗi "multiple declaration for 'main'.Thế là thế nào vậy?Đang tập sự nên còn gà lắm

                          Comment


                          • #14
                            Bác Nano ơi!cho em hỏi tí.Em đang tập dùng Codevision,cop thử cái chương trình của bác vào.Lúc compile thì bị báo lỗi "multiple declaration for 'main'.Thế là thế nào vậy?Đang tập sự nên còn gà lắm
                            Ko ai cop hoàn toàn mà đem ra complie cả.
                            Hãy hiểu cách làm đã roài mới viết chương trình, sau đó complie cái mình modify hoàn chỉnh nhé.
                            Chúc thành công!

                            Mình cũng mới học thôi.

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X