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

  • Nguyên văn bởi hiodong Xem bài viết
    Đơn giản chỉ là cấp điện cho cái led dấu phẩy đó , thích phẩy ở đâu thì phẩy
    Bạn đọc kỹ câu hỏi của bạn Mr_Vung đưa ra chưa mà bảo thích phẩy ở đâu thì cấp điện cho dấu phẩy của led đó.
    Giả sử tớ có hàm: display(float x) để hiển thị ra led. Nếu tớ chuyền 1 số thực bất kì vào hàm trên thì đều hiển thị dc! Vấn đề là ở đó, thuật toán để hiển thị ra?
    Mình nghĩ bạn nên làm phép so sánh
    Vd: Ta có số ABCD (giả sử chỉ hiển thị được 4 số, 10000>ABCD>=0)
    Nếu 10000>ABCD>=1000 -> i=1 (ABCD)
    Nếu 1000>ABCD>=100 -> i=2 (ABC,D)
    Nếu 100>ABCD>=10 -> i=3 (AB,CD)
    Nếu 10>ABCD>=0 -> i=4 (A,BCD)
    Dựa vào kết quả của biến i mà bạn cho dấu phẩy xuất hiện ở vị trí nào.
    Ví dụ trên của mình đưa ra là số thập phân không cố định, nếu bạn nhập vào 9.5 -> hiển thị 9.500, nếu 95.5 ->95.50
    Muốn bạn muốn hiển thị số thập phân nhỏ hơn 0, có thể làm tương tự!
    Không TÔI là kẻ phàm phu
    Cái TÔI quá lớn làm ngu muội mình!
    - 0983.886.113

    Comment


    • Nguyên văn bởi khiem Xem bài viết
      các pro ơi!cứu em với, em mới học về VXL mà thầy đã giao cho 1 đống bài tập lớn.cụ thể các đề như sau:
      1-thiết kế hệ thống hiển thị sử dụng màn hình LCD character 40*4 hiển thị dòng chữ"hell world"với họ no-chíp 8051.
      2-thiết kế đồng hồ thời gian sử dụng on-chíp 8051
      3-thiết kế hệ thống điều khiển motor bước sử dụng họ on-chíp 8051
      4-thiết kế mấy đo chiều cao sử dụng on chíp 8051
      5-thiết kế hệ thống điều khiển nhiệt độ sử dụng họ on-chíp 8051

      bác nào có mạch và code thì cho em với.
      chân thành cảm ơn các bac!!!!!!
      Trường bạn giỏi thật đó, mới học VXL mà đã cho nhiều bài tập như thế cho 1 SV, chắc đến khi ra trường, mọi thứ liên quan đến VXL các SV của trường bạn đều làm được hết quá!
      Không TÔI là kẻ phàm phu
      Cái TÔI quá lớn làm ngu muội mình!
      - 0983.886.113

      Comment


      • Nguyên văn bởi trong123 Xem bài viết
        Mình mới sửa một số lỗi, bạn test lại thử xem.
        Thử so sánh 2 code, tìm ra chỗ sai (If)
        Code:
        #include<regx51.h>
        #include<stdio.h>
        sbit led1 = P2^0; //
        sbit led2 = P2^1; //
        sbit button = P2^3; // 
        unsigned int code1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//code bcd
        int i,d;
        void delay(d)
        	{
        	for (i=0;i<d;i++);
        	}
        void main()
        	{
        	button=1;// cái này có bắt buộc không vậy bác?
        	int a=0,ch,dv;
        	while(a!=100)
        		{
        		if(button==0)
        			{
        			a++;
        			ch=a/10;  //sao lại để phần tách số ở đây bác???
        			dv=a%10;
        			}
        		led1=0;led2=1;
        		P0=code1[ch];
        		delay(10); //Nhỏ quá ???(ko hiểu)
        		led2=0;led1=1;                          // delay khoảng bao nhiêu là được thế bác       
        		P0=code1[dv];
        		delay(10);
        		}
        	}
        Chương trình bạn Post lên nhiều lỗi cú pháp thế mà bạn bảo chạy rồi (nhưng không đếm được)???
        cảm ơn bác đã sửa lỗi cho em ,nhưng 1 số chỗ em vẫn ko hiểu tại sao,mong bác chỉ giáo thêm.thank bác nhiều

        làm theo cách của em là không tối ưu đúng không bác.vì phải mất cả 1 P0 để xuất ra giá trị điều khiển led 7seg.nếu dùng IC 7447 để chuyển mã thì chỉ cần 4 chân là có thể xuất các giá trị rồi,tức là bài này em chỉ cần dùng 1 port thôi,nhưng mà em vẫn không thể hình dung được làm thế nào để có thể xuất các giá trị ra IC 7447 được ,mong các bác chỉ giáo giùm
        Last edited by rongconn2t; 15-04-2008, 16:27.

        Comment


        • Nguyên văn bởi rongconn2t Xem bài viết
          cảm ơn bác đã sửa lỗi cho em ,nhưng 1 số chỗ em vẫn ko hiểu tại sao,mong bác chỉ giáo thêm.thank bác nhiều
          1. unigneed: từ khóa này mình chưa thấy bao giờ-> unsigned
          2. code: từ khóa của C, không dùng làm biến được -> code1
          3. tr=a%10: không có khai báo biến tr -> dv
          4. Hàm If:
          - Nếu bạn để đoạn code trong Else, thì khi bạn nhấn nút, đoạn code trong If thực hiện, sau đó thoát khỏi hàm If mà bỏ qua đoạn code thực hiện phép chia trong Else.
          - Theo cách viết của bạn, thì khi nhấn nút, chưa kịp thả nút ra, giá trị của a đã có thể lên đến 100 và thoát khỏi vòng lặp While.
          - Phần phép chia phải để trong If, bởi vì khi nào nhấn nút (a++) thì phép chia mới thực hiện, nếu để bên ngoài, phép chia luôn được thực hiện dù không nhấn nút, như vậy code không tối ưu.
          5. button=1: không bắt buộc, bởi sau khi Reset P2=0FFH, nên để vẫn chặt chẽ hơn.
          6. delay(10) ->delay(500)
          Bây giờ bạn tăng delay lên rồi test lại CT mình đã sửa nhé.
          ...nhưng mà em vẫn không thể hình dung được làm thế nào để có thể xuất các giá trị ra IC 7447 được
          Nối các chân P0.3, P0.2, P0.1, P0.0 vào các chân D,B,C,A của 7447
          MOV P0,#00H -> hiển thị số 0
          MOV P0,#01H -> ---------- 1
          MOV P0,#09H -> ---------- 9
          Last edited by trong123; 15-04-2008, 23:59.
          Không TÔI là kẻ phàm phu
          Cái TÔI quá lớn làm ngu muội mình!
          - 0983.886.113

          Comment


          • Mình thấy các bài viết của các bạn rất có ích. Nhưng cho mình hỏi xíu, nếu dùng ngôn ngữ lập trình cấp cao để lập trình cho 8051 hay 8951 thì có lẽ khá dễ dàng. Nhất là hầu hết các bạn khá quen thuộc với các ngôn ngữ lập trình C,C++ hay Baíc.
            Tuy nhiên nếu được yêu cầu lập trình bằng ngôn ngữ Asembly thì lại khá rắc rối. Các bạn có thể đưa các ví dụ vừa bằng ngôn ngữ C vừa bằng ngôn ngữ Asembly được không.
            Theo mình biết thì một số chức năng hay chương trình điều khiển không thể viết bằng các ngôn ngữ khác mà phải viết bằng Asm rồi nhúng đoạn code đó vào chương trình viết bằng các ngôn ngữ khác.
            Không biết ý kiến của mình có chính xác không, monh mọi người góp ý thêm.
            Lần sau mình sẽ post một số đoạn code để các bạn tham khảo.

            Comment


            • Các bạn thử dùng ngôn ngữ Asm xem sao

              Comment


              • cảm ơn bác về bài giảng,thực sự thì có những đoạn mà bác không nói thì em không thể hình dung ra.
                hiện em đang tập sử dụng encoder để đo lường,vẫn biết nguyên tắt hoạt động của nó nhưng khi em ghép vào thì không thể hình dung được cái giải thuật như thế nào,em nghĩ như thế này bác xem có được không nhá

                #define encoder P2_0
                long unsigned int dem;
                ........
                {
                .......
                while(encoder!=0)
                {while(encoder!0)
                {
                dem+=1;
                }
                }
                }
                .......

                Comment


                • Nguyên văn bởi hphuong_spkt Xem bài viết
                  Các bạn thử dùng ngôn ngữ Asm xem sao
                  Trước đây, mình dùng ASM, mới tìm hiểu về C trong thời gian gần đây. Mình thấy viết bằng C đơn giản hơn ASM.
                  Vd: Trong ASM, mình phải nhớ thanh ghi nào đã sử dụng và chưa sử dụng, để làm biến đếm...Trong C, chỉ cần khai báo các biến (vd: a,b,c,d...) mà không phải quan tâm đến thanh ghi...
                  Mình thấy đa số các công ty đều dùng C bởi tính đơn giản và dễ quản lý code hơn so với ASM. Nhưng C có 1 khuyết điểm so với ASM, nếu cùng tạo chương trình (vd: đèn chớp tắt) thì file Hex từ C sẽ chiếm nhiều dung lương nhớ hơn so với file Hex từ ASM. Những chương trình lớn thì mình không chắc nhưng những chương trình nhỏ như thế này thì mình thấy điều đó đúng.
                  Nguyên văn bởi hphuong_spkt Xem bài viết
                  Theo mình biết thì một số chức năng hay chương trình điều khiển không thể viết bằng các ngôn ngữ khác mà phải viết bằng Asm rồi nhúng đoạn code đó vào chương trình viết bằng các ngôn ngữ khác.
                  Việc này mình chưa thử nên không biết nhưng có một số bạn đã làm điều đó. Các bạn đã thực hiện thành công, xin góp ý! Thanks!
                  Last edited by trong123; 17-04-2008, 23:40.
                  Không TÔI là kẻ phàm phu
                  Cái TÔI quá lớn làm ngu muội mình!
                  - 0983.886.113

                  Comment


                  • Nguyên văn bởi rongconn2t Xem bài viết
                    #define encoder P2_0
                    long unsigned int dem;
                    ........
                    {
                    .......
                    while(encoder!=0)
                    {while(encoder!0)
                    {
                    dem+=1;
                    }
                    }
                    }
                    .......
                    while(encoder!0)
                    Lệnh này bạn có viết sai không, mình không hiểu?
                    Nếu while(encoder!=0) thì lặp lại vòng lặp trên?
                    Nếu while(encoder=0) mâu thuân với vòng lặp trên?
                    Bạn nên xem lại chỗ này nhé!
                    Last edited by trong123; 17-04-2008, 23:39.
                    Không TÔI là kẻ phàm phu
                    Cái TÔI quá lớn làm ngu muội mình!
                    - 0983.886.113

                    Comment


                    • các bác à!! em cũng mới tập tọe về VDK thôi nhưng em không hiểu các lệnh ngắt lắm. vậy các bác giúp em chút đc không ???
                      rất mong tin từ các bạc tiến bối giúp em với!!
                      thnk !!!
                      nickname: vinh_tb20002000
                      hay SDT: 0983665311

                      Comment


                      • Nguyên văn bởi hero8x Xem bài viết
                        các bác à!! em cũng mới tập tọe về VDK thôi nhưng em không hiểu các lệnh ngắt lắm.
                        Chuyện bình thường thôi!
                        Mình khuyên bạn nên đọc sách, tài liệu, không hiểu chỗ nào thì hãy hỏi mọi người.
                        Không TÔI là kẻ phàm phu
                        Cái TÔI quá lớn làm ngu muội mình!
                        - 0983.886.113

                        Comment


                        • Nguyên văn bởi trong123 Xem bài viết
                          while(encoder!0)
                          Lệnh này bạn có viết sai không, mình không hiểu?
                          Nếu while(encoder!=0) thì lặp lại vòng lặp trên?
                          Nếu while(encoder=0) mâu thuân với vòng lặp trên?
                          Bạn nên xem lại chỗ này nhé!
                          sorry bác là

                          while(encoder!=0)
                          {
                          while(encoder!=1)
                          {
                          dem+=1;
                          }
                          }


                          nhưng mà làm thế này thì khi encoder ở vị trí 0 thì nó sẽ +dem mãi và có khi là trong cùng 1 xung đưa đến nó có thể +dem nhiều lần

                          ==>không ổn
                          bác có cách nào có thể đếm được xung encoder không?
                          thank bác

                          Comment


                          • Mình thử đưa lên một đoạn code

                            Các bạn thảo luận đều sử dụng ngôn ngữ C,mình thử đưa lên một đoạn code điều khiển LED viết bằng Asembly để mọi người cho ý kiến nha

                            LED equ p1 ; gán po rt1 của 8951 là ngõ ra kết nối led

                            org 0000h ; bắt đầu chương trình tại địa chỉ 0000h
                            loop1: mov r0,#01h ;đặt giá trị ban đầu là 00000001b cho thanh ghi r0
                            loop: jb p1.7,loop1 ;vòng lặp để lặp lại khi led thứ 8 đã sáng
                            mov LED,r0 ; xuất giá trị ra led
                            rl r0 ; xoay trái thanh ghi r0 nghĩa là nếu r0=00000001b thì sau đo là 0000010b
                            sjmp loop ;thực hiện tiếp vòng lặp
                            ret

                            Đây là một chương trình nhỏ để điều khiển 8 LED đơn sáng tuần tự từ phải sang trái. Chương trình còn thiếu một đoạn nữa, rất mong các bạn góp ý bổ xung hoặc chữa lại dùm mình.

                            Comment


                            • Nguyên văn bởi trong123 Xem bài viết
                              Trước đây, mình dùng ASM, mới tìm hiểu về C trong thời gian gần đây. Mình thấy viết bằng C đơn giản hơn ASM.
                              Vd: Trong ASM, mình phải nhớ thanh ghi nào đã sử dụng và chưa sử dụng, để làm biến đếm...Trong C, chỉ cần khai báo các biến (vd: a,b,c,d...) mà không phải quan tâm đến thanh ghi...
                              Mình thấy đa số các công ty đều dùng C bởi tính đơn giản và dễ quản lý code hơn so với ASM. Nhưng C có 1 khuyết điểm so với ASM, nếu cùng tạo chương trình (vd: đèn chớp tắt) thì file Hex từ C sẽ chiếm nhiều dung lương nhớ hơn so với file Hex từ ASM. Những chương trình lớn thì mình không chắc nhưng những chương trình nhỏ như thế này thì mình thấy điều đó đúng.

                              Việc này mình chưa thử nên không biết nhưng có một số bạn đã làm điều đó. Các bạn đã thực hiện thành công, xin góp ý! Thanks!
                              Cho mình hỏi nếu dùng ngôn ngữ C thì phải dùng chương trình nào để biên dịch ra file Hex. Do từ trước tới giờ mình chưa dùng C để viết cho 8951

                              Comment


                              • Nguyên văn bởi hphuong_spkt Xem bài viết
                                Cho mình hỏi nếu dùng ngôn ngữ C thì phải dùng chương trình nào để biên dịch ra file Hex. Do từ trước tới giờ mình chưa dùng C để viết cho 8951
                                Bạn có thể dùng Keil C,proView... để biên dịch ra file HEX

                                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