Thông báo

Collapse
No announcement yet.

Dành cho người mới tìm hiểu 8051

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

  • //tri hoan 'h' giờ:
    void delay_hour(unsigned char h)
    {
    unsigned int m;
    do{
    m=3600; //60x60
    do{delay_ms(1000);}
    while(--m);
    }
    while(--h);
    }

    void main(void)
    {
    P1=255;
    while(1)
    {
    P11=~P11;
    delay_hour(4);
    }
    }
    Last edited by zemen; 12-09-2008, 09:10.
    !e

    Comment


    • Nguyên văn bởi tallht Xem bài viết
      với keil C thì có bác nào biết rằng 1 lệnh nó thực hiện bao lâu ko?
      Cái này còn tùy vào dao động của mạch và từng câu lệnh chứ bạn. 1 lệnh đơn giản như P1=255; //1Tck nhưng lệnh P1=biến * 2; hay while(--biến){ ...}; thì sẽ tốn nhiều hơn, có khi cả chục Tck. Bạn đọc C51/help của KeilC thì nó có nói rõ hơn về mấy vòng lặp. Hoặc bạn viết 1 chương trình đơn giản, biên dịch (F7) và chạy mô phỏng (Ctrl-F5), rôi mở cửa sổ Disassembly. KielC sẽ cho bạn biết từng lệnh trong C sẽ tương ứng với bao nhiêu lệnh trong ASM.
      !e

      Comment


      • Nguyên văn bởi tranvannam59
        Các bạn vui lòng cho mình biết làm thế nào để tăng điện áp port ra của 89c52 (làm cho đèn led sáng dần và tắt dần ) từ 0.1v>0.2v>0.3v.......đến 5v và ngược lại, mỗi lần thay đổi tử 0,5v hoặc 0,1v cũng được theo chu kỳ và biên độ volt phải được thay đổi chính xác(nếu viết code bằng Asm thì phải viết như thế nào?).

        Cái này đã có chủ đề bàn đến rồi, bạn có thể dùng ch.năng 'Search' để tìm ra. Mình xin nói ngắn gọn nguyên lí: dùng PWM (d.chế độ rộng xung) để làm thay đổi dòng trung bình qua led (thực tế thì điện áp DC o thể nào có mức 0,1; 0,2;... 4,9V được vì ngõ ra vdk là dạng số mà, do đó ta chỉ có quy đổi tương đương áp tr.bình từ dòng tr.bình thôi)
        !e

        Comment


        • Nguyên văn bởi zemen Xem bài viết
          //tri hoan 'h' giờ:
          void delay_hour(unsigned char h)
          {
          unsigned int m;
          do{
          m=3600; //60x60
          do{delay_ms(1000);}
          while(--m); //đây là vòng lặp 1 giờ kô?
          }
          while(--h); //đây là vòng lặp n giờ kô?
          }

          void main(void)
          {
          P1=255; //chỗ này có phải là set P11 lên HIGH kô
          while(1)
          {
          P11=~P11;
          delay_hour(4);
          }
          }
          Bạn có thể mô tả lại cho tôi được rõ không.
          while(--m); //đây là vòng lặp 1 giờ kô?
          }
          while(--h); //đây là vòng lặp n giờ kô?
          }
          P1=255; //chỗ này có phải là set P11 lên HIGH kô
          delay_hour(4); //chỗ này là trễ 4 giờ à?
          }
          Tôi mới làm quen với C nên có thể những câu hỏi này rất buồn cười với các cao thủ, nhưng bỏ quá và hãy giúp tôi.
          Cảm ơn

          Comment


          • P1=255 chính là đưa các chân ở Port1 lên mức 1 đó bạn! (dạng hex là 0xff)
            con mấy chỗ bạn hỏi là đúng vậy đó!(hì hì chỉ thay bác zemen trả lời thôi nha)
            SỰ HỌC LÀ MÃI MÃI......!!!!

            Comment


            • còn một câu hỏi nữa. Hình như trong chương trình không có chương trình trễ 1 s chính xác nếu với thạnh anh 12MHz nhỉ

              Comment


              • /*
                Đã làm quen với 8051 rồi thì bạn có thể viết hàm trễ 1ms được mà. Sau đó x1000 lên là đc 1s
                V.dụ dưới đây là viết hàm delay_ms(x) với thạch anh 12MHz, sai số dương <5%, bạn có thể tham khảo thêm.
                */

                #define hfxtal 12000000
                #define hdelay0 (hfxtal/12000)
                #define hdelay2 (unsigned char)(hdelay0/256)
                #define hdelay1 (unsigned char)(hdelay0/(2*hdelay2))

                void delay_ms(unsigned int ms)
                {
                unsigned char delay1,delay2;
                lap:
                delay1=hdelay1;
                lap1:
                delay2=hdelay2;
                lap2:
                if(--delay2!=0) goto lap2;
                if(--delay1!=0) goto lap1;
                if(--ms) goto lap;
                }
                !e

                Comment


                • Nguyên văn bởi zemen Xem bài viết
                  /*
                  Đã làm quen với 8051 rồi thì bạn có thể viết hàm trễ 1ms được mà. Sau đó x1000 lên là đc 1s
                  V.dụ dưới đây là viết hàm delay_ms(x) với thạch anh 12MHz, sai số dương <5%, bạn có thể tham khảo thêm.
                  */

                  #define hfxtal 12000000
                  #define hdelay0 (hfxtal/12000)
                  #define hdelay2 (unsigned char)(hdelay0/256)
                  #define hdelay1 (unsigned char)(hdelay0/(2*hdelay2))

                  void delay_ms(unsigned int ms)
                  {
                  unsigned char delay1,delay2;
                  lap:
                  delay1=hdelay1;
                  lap1:
                  delay2=hdelay2;
                  lap2:
                  if(--delay2!=0) goto lap2;
                  if(--delay1!=0) goto lap1;
                  if(--ms) goto lap;
                  }
                  Cảm ơn bạn. Nhưng viết bằng C thì mình chưa rõ lắm

                  Comment


                  • bạn cần tìm hiểu về phương thức điều chế độ rộng xung
                    VDK xuất ra mức 1 thì bạn đo được gần 5v
                    mức 0 thì cũng là gần 0 v,như vậy nếu bạn muốn lấy ra điện áp 3,5v chẳng hạn thì phải làm sao! bạn không thể lấy mức 1 , cũng như mức 0.
                    phương án được đưa ra là , lấy 1 phần của mức 1 đó thôi
                    ví dụ là 50% của mức 1 sẽ là 0,5x5v=2.5,
                    tiếp : ví dụ mức 1 ( điện áp là gần 5 v) được "băm " thành 2 xung âm và dương
                    gọi T =T(âm)+T(dương)
                    thì điện áp trung bình được tính : U(tb)=(T(dương)/T)x5V
                    .....................khó diễn giải quá mong là giúp bạn được phần nào!
                    0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
                    ||
                    PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

                    Comment


                    • độ rộng xung của T(dương) sẽ quyết định đến mức áp trung bình
                      và khi tăng hoặc giảm T(dương) thì luôn phải đảm bảo T=T(am)+T(dương)
                      (để cho tần số xung không đổi đó mà)
                      0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
                      ||
                      PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

                      Comment


                      • bạn xem thử một chương trình :
                        INCLUDE 8051.mc
                        MAIN:

                        SETB P1.0 ' THIET LAP MUC CAO
                        MOV 30H,#5
                        ACALL DELAY ' GOI HAM DELAY VOI R1 = 5( R1MUC_CAO)
                        CLR P1.0 ' THIET LAP MUC THAP
                        MOV 30H,#2
                        ACALL DELAY ' GOI HAM DELAY VOI R1 = 2(R1MUC_THAP)
                        SJMP MAIN
                        DELAY:

                        MOV R1,30H
                        LOOP1:
                        MOV R3,#20
                        LOOP2:
                        MOV R4,#40
                        LOOP3:
                        DJNZ R4,LOOP3
                        DJNZ R3,LOOP2
                        DJNZ R1,LOOP1
                        RET
                        ' DE TAN SO KHONG THAY DOI KHI BAN THAY DOI T(AM) VAT(DUONG) THI
                        ' R1MUC_CAO+R1MUC_THAP= 1 HANG SO(CONST)
                        0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
                        ||
                        PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

                        Comment


                        • co anh em nao giup em voi
                          em cần làm đồ án môn học với đề tài này mà đang mắc quá chừng . Thanks nhiều nha
                          de tai la :"thiet ke he dieu hanh thoi gian dieu khien boi 5 led nhap nhay voi 5 tan so khac nhau"

                          Comment


                          • Mình có bài tập lớn là đo vận tốc hiển thị ra LCD
                            Mình chưa thể nào viết đựoc hàm nào có thể xuât một biến kiểu float ra màn màn hinh LCD
                            .: Lê Tiến Mạnh :.
                            Phone number : 0989 735 804
                            YM,Skype,mail : [leemanhj916]@gmail.com

                            Comment


                            • Có ai biết không?
                              .: Lê Tiến Mạnh :.
                              Phone number : 0989 735 804
                              YM,Skype,mail : [leemanhj916]@gmail.com

                              Comment


                              • Ở đây mình phải viết thêm hàm hiển thị số dạng long thôi

                                PHP Code:
                                void ghi_so(unsigned long number){
                                    
                                int j,m;
                                    
                                unsigned char d[20];
                                    for(
                                j=j<20 j++){
                                        
                                d[j] = number%10;
                                        
                                number /= 10;
                                        if(
                                number==0){
                                            
                                j;
                                            break;
                                        }
                                    }
                                    for(
                                j=j>=j--){
                                        if(
                                == 1)
                                            
                                ghi_kytu(',');
                                        
                                ghi_kytu(d[j]+0x30);
                                    }

                                Sau đó viết thêm dấu "," vào thôi
                                .: Lê Tiến Mạnh :.
                                Phone number : 0989 735 804
                                YM,Skype,mail : [leemanhj916]@gmail.com

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X