Thông báo

Collapse
No announcement yet.

hỏi về hàm Delay 1s viết bằng C cho 8051

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

  • #31
    à, ban đầu định xây dựng 1 hàm hiệu chỉnh kết quả thập fân của phép cộng trước đó... nhưng sau đấy nhờ bác Toan.Lv chỉ bảo nên mình làm theo cách đơn jản hơn

    http://dientuvietnam.net/forums/showthread.php?t=24495
    |

    Comment


    • #32
      Mình dùng nguyên P0 để quét led, không dùng IC giải mã.
      Last edited by Multi System; 09-05-2009, 12:29.

      Comment


      • #33
        Nguyên văn bởi hellboy123
        mình muốn viết chương trình cho 2 công tắc nối vào một pỏt bất kì
        1 công tắc thứ nhất để chọn chế độ hoạt động (hiển thị led chẳng hạn): chế độ tự chỉnh hay tự động
        2 công tắc thứ 2 sẽ có tác dụng khi công tắc 1 đã bật qua chế độ tự chỉnh tay, (chọn 2 trạng thái hiển thị led khác nhau)
        mình không biết dùng ngắt mấy bạn hướn dẫn mình giúp, mình k dùng c mà dùng ASM.
        Bạn dùng ngắt làm gì với bài này?Bạn nói qua ý tưởng xem tại sao lại dùng ngắt trong trường hợp này?
        Học đến bao giờ mới thành tài?

        Comment


        • #34
          hi!
          minh dang lam de tai : thiet ke mot mach gom nhieu cong tac dieu khien nhieu bong den, moi cong tac dieu khien mot bong den, tai moi thoi diem chi mot bong sang. mach nay minh dinh dung IC so ma chua biet su dung con gi.moi nguoi ai biet xin giup minh .Thanks.

          Comment


          • #35
            Bạn nào biết giải thích cho mình với, chương trình tạo trễ:
            void delay(long time)
            {
            while(time--);
            }
            Gọi trễ 1s: delay(25000); tại sao lại là delay(25000) lại được trễ 1s ?

            Comment


            • #36
              Em cũng đang mầy mò nhưng cái này em biết nói bác @thanhlam1911 luôn
              gọi trễ 1s vì VDK thực hiện trừ đi 1 đơn vị 25000 lần mất 1s.
              Cái này hay vì ko phải khai timer phức tạp. Nhưng có yếu điểm là mỗi 1 VDK, mỗi 1 mạch thì tốc độ thực thi lệnh khác nhau. Nên ko coppy y nguyên được

              Comment


              • #37
                Trả lời như bạn @nghienkiev không khác gì không trả lời?

                Comment


                • #38
                  Hi hi, mình có thể trả lời lại câu trả lời của bac @nghienkiev không?
                  Thế này nhé, Khi bạn viết bằng lệnh C thì keilC có trách nhiệm biên dịch ra ngôn ngữ máy cho bạn, cụ thể là ASM.
                  Vì bạn chọn độ dài của biến time là long nên time sẽ là một số 32 bít, điều này sẽ khác với bạn chọn int 16bit hoặc char 8 bit hoặc... Mà như ta đã biết trong 89xx các thanh ghi có độ dài 8 bít, vậy để chia số 32 bit này ra phải mất 32/8= 4 lệnh mov vào các thanh ghi, ^^. tương tự như vậy với lệnh while. Cụ thể máy nó dịch như sau (dĩ nhiên là với người dịch thì sẽ gọn hơn với lệnh while òy).
                  2: void delay1(long time)
                  C:0x0023 8F0B MOV 0x0B,R7 // 1 chu kỳ máy
                  C:0x0025 8E0A MOV 0x0A,R6 // 1 chu kỳ máy
                  C:0x0027 8D09 MOV 0x09,R5 // 1 chu kỳ máy
                  C:0x0029 8C08 MOV 0x08,R4 // 1 chu kỳ máy
                  3: {
                  4: while(time--);
                  C:0x002B 7808 MOV R0,#0x08 // 1 chu kỳ máy
                  C:0x002D 74FF MOV A,#0xFF // 1 chu kỳ máy
                  C:0x002F 120005 LCALL C?LLDIIDATA8(C:0005) // 3 chu kỳ máy
                  C:0x0032 EC MOV A,R4 // 1 chu kỳ máy
                  C:0x0033 4D ORL A,R5 // 1 chu kỳ máy
                  C:0x0034 4E ORL A,R6 // 1 chu kỳ máy
                  C:0x0035 4F ORL A,R7 // 1 chu kỳ máy
                  C:0x0036 70F3 JNZ C:002B // 2 chu kỳ máy
                  5: }

                  như vậy số chu kỳ máy sẽ như thế này.

                  void delay(long time)
                  {

                  }
                  Vũ xuân Lợi
                  YM!:

                  Comment


                  • #39
                    Hi, chưa viết xong mà theo thói quen ấn tab và enter nhầm nền nó post mất, thông cảm mình viết tiếp nhé.
                    Như vậy số chu kỳ máy sẽ nhw thế này:
                    void delay(long time)
                    {
                    4 chu kỳ máy;
                    {
                    10 chu kỳ máy;
                    }
                    }
                    như vậy tổng số chu kỳ máy để thực hiện hàm delay() trên là 4*10=40 chu kỳ máy.
                    Giả sử ta chọn Thạch Anh là 12M (hi, thực ra phải 12M thì mới đẹp) vậy là thời gian thực hiện một chu kỳ máy là 1us.
                    thế nên khi ta gọi delay(25000); nghĩa là 40*1*25000=1000000 us và vừa đẹp= 1s. hehe
                    Vũ xuân Lợi
                    YM!:

                    Comment


                    • #40
                      Các anh ơi giúp em cái này với ạ
                      So sánh 2 phương pháp lập trình tạo trễ trong 8051 là
                      1. Dùng Timer.
                      2. Dùng vòng lặp.
                      Em cảm ơn các anh trước ạ.

                      Comment


                      • #41
                        HIx có ai không ạ giúp em với huhu

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X