Thông báo

Collapse
No announcement yet.

Điều khiển LED bằng Proteus

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

  • Điều khiển LED bằng Proteus

    E thử làm vài bài quét led sử dụng con 89C51, viết code rồi nạp file hẽ để mô phỏng nhưng không hiểu sao không chạy. Mọi người xem giùm em coi lỗi gì nhé.
    Bài 1:
    Phần cứng:

    Code C: Em biên dịch ra file hex bằng keilC
    Code:
    #include<reg52.h>
    sbit led1=P0^0;
    sbit led2=P0^1;
    int k,dem;
    unsigned char led_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    void delay_ms(int t)
    {    int m,n;
        for(m=0;m<=100;m++)
        for(n=0;n<=t;n++);
    }
    void hienthi()
    {
        led2=1;
        P2=led_data[k/10];delay_ms(10);led2=0;
        led1=1;
        P2=led_data[k/10];delay_ms(10);led1=0;
    }
    void main()
    {    
        while(1)
        {
        TMOD=0x10;
        IE=0x88;EA=1;
        IP=0;
        TH1=-25000/256;
        TL1=-25000/256;
        TR1=1;TF1=0;
        hienthi();
        }
    }
    void ngat_T1() interrupt 3
    {    
        TH1=-25000/256;
        TL1=-25000/256;
         dem++;
        if(dem>10) {dem=0;k++;};
        if(k>99) k=0;
    }
    Bài 2:
    Phần cứng

    Code C:
    Code:
    // Chuong trinh 8 led ket noi port1 chay cac kieu
    #include <regx51.h> // khai bao chuong trinh thu vien 8051
    #define led P1 // Led ket noi port 1
    void delay (unsigned int ms) // Ham tao thoi gian tre ms
    {
    unsigned int i ;
    unsigned char j ; //Khai bao bien 1 byte
    for (i=0;i<ms;i++)
    {
    for (j=0;j<125;j++)
    // 1vong lap for mat 8us
    //Nhu vay ta co: ms*(125*8)=1000*1000 ~= 1ms
    // *********************************************
    {} // Khong lam gi ca
    }
    }
    void sangdon(void)
    {
    P1=0x00;//0x00=00000000
    delay(1000);// ham tre 1000ms=1s
    P1=0xff;//0xff=11111111
    delay(1000);
    }
    
    void sangdan(void)
    {
    P1=0x00;// hien thi 0 led;
    delay(1000);// tre 1000ms=1s;
    P1=0x01;//hien thi 1 led;
    delay(1000);
    P1=0x03;//hien thi 2 led;
    delay(1000);
    P1=0x07;//hien thi 3 led;
    delay(1000);
    P1=0x0f;//hien thi 4 led;
    delay(1000);
    P1=0x1f;//Hien thi 5 led;
    delay(1000);
    P1=0x3f;//hien thi 6 led;
    delay(1000);
    P1=0x7f;//hien thi 7 led;
    delay(1000);
    P1=0xff;//hien thi 8 led
    delay(1000);
    }
    
    void sangduoi(void)
    {
    
    P1=0X01;delay(1000);
    P1=0X02;delay(1000);
    P1=0X04;delay(1000);
    P1=0X08;delay(1000);
    P1=0X10;delay(1000);
    P1=0X20;delay(1000);
    P1=0X40;delay(1000);
    P1=0X80;delay(1000);
    }
    main ()
    {
    while (1)
    {
    sangdon();delay(1000);
    sangdan();delay(1000);
    sangduoi();delay(1000);
    }
    }
    Em đọc kĩ thì thấy code không có vấn đề gì, lỗi ở keilC chăng, em viết 1 VD đơn giản bằng ASM thì mô phỏng được còn C thì không

  • #2
    Bạn sửa lại chỗ này xem sao?
    TL1=-25000/256;

    led1=1;
    P2=led_data[k/10];

    bài dưới thì nhìn nó hơi đơn sơ+ dàn trải nên mình chịu, hi, mà vòng lặp của bạn mới tính cho vòng trong thôi, thế vòng ngoài thì sao? còn nữa, i là số 16 bit, j là số 8 bít, vậy phải mất 3 lệnh mov nó vào thanh ghi rồi, vậy nguyên cho 2 khai báo của bạn đã mất ít nhất 3 chu kỳ máy ở vòng ngoài chưa kể mấy lệnh clr thanh ghi A nữa cũng nữa, mình nghĩ là nó khá lớn đấy chứ => đó có phải là trễ 1s không?
    mình tính thử nhé, theo keilC nó biên dịch là như thế này.

    void delay()
    {

    11 chu kỳ máy
    {
    8 chu kỳ máy
    }

    }
    vầy là: 8*125*11*ms. ở đây bạn cho nó là 1000
    vầy là: 8*125*11*1000= 11000000us =11s chứ nhỉ?
    Vũ xuân Lợi
    YM!:

    Comment


    • #3
      Bạn cố gắng chờ nó lâu lâu xem nó có nháy không nha, mình không mô phỏng nên không biết, chỉ đoán mò thế thoai, hi hi,
      Vũ xuân Lợi
      YM!:

      Comment


      • #4
        chờ hơn 1p rồi không nháy gì hết chứ đừng nói 11s, hix. Để nghiên cứu asm rồi viết lại bằng asm coi được không. Bạn có bài nào quet led viết bằng asm thì cho mình tham khảo nhé. Thanks
        Last edited by bodyguy; 18-11-2010, 23:41.

        Comment


        • #5
          COUNT EQU 20H
          HDV EQU 21H
          HC EQU 22H
          SEC EQU 23H
          PHUT EQU 24H
          GIO EQU 25H

          ORG 00H
          LJMP MAIN
          ORG 0BH
          LJMP XULYNGAT
          ORG 030H
          MAIN:
          MOV TMOD,#01H
          MOV TH0,#0ECH
          MOV TL0,#87H
          MOV IE,#82H
          SETB TR0
          MOV COUNT,#0
          MOV SEC,#0
          MOV PHUT,#0
          MOV GIO,#0
          LAP:
          ACALL HIENTHI1
          ACALL HIENTHI2
          ACALL HIENTHI3
          SJMP LAP
          XULYNGAT:
          MOV TH0,#0ECH
          MOV TL0,#87H
          INC COUNT
          MOV A,COUNT
          CJNE A,#200,EXIT
          MOV COUNT,#0
          INC SEC
          MOV A,SEC
          CJNE A,#60,EXIT
          MOV SEC,#0
          INC PHUT
          MOV A,PHUT
          CJNE A,#60,EXIT
          MOV PHUT,#0
          INC GIO
          MOV A,GIO
          CJNE A,#23,EXIT
          MOV GIO,#0
          EXIT:
          RETI
          HIENTHI1:
          MOV A,SEC
          ACALL TACH
          ACALL THUCHIEN1
          CLR A
          RET
          HIENTHI2:
          MOV A,PHUT
          ACALL TACH
          ACALL THUCHIEN2
          RET
          HIENTHI3:
          MOV A,GIO
          ACALL TACH
          ACALL THUCHIEN3
          RET
          THUCHIEN1:

          MOV DPTR,#TABLE
          MOV DPL,HC
          CLR A
          MOVC A,@A+DPTR
          MOV R7,#2H
          MOV P2,R7
          MOV P0,A
          ACALL DELAY

          MOV DPL,HDV
          CLR A
          MOVC A,@A+DPTR
          MOV R7,#1H
          MOV P2,R7
          MOV P0,A
          ACALL DELAY
          RET
          THUCHIEN2:
          MOV DPTR,#TABLE
          MOV DPL,HC
          CLR A
          MOVC A,@A+DPTR
          MOV R7,#8H
          MOV P2,R7
          MOV P0,A
          ACALL DELAY

          MOV DPL,HDV
          CLR A
          MOVC A,@A+DPTR
          MOV R7,#4H
          MOV P2,R7
          MOV P0,A
          ACALL DELAY
          RET
          THUCHIEN3:
          MOV DPTR,#TABLE
          MOV DPL,HC
          CLR A
          MOVC A,@A+DPTR
          MOV R7,#20H
          MOV P2,R7
          MOV P0,A
          ACALL DELAY

          MOV DPL,HDV
          CLR A
          MOVC A,@A+DPTR
          MOV R7,#10H
          MOV P2,R7
          MOV P0,A
          ACALL DELAY
          RET
          TACH:
          MOV B,#10
          DIV AB
          MOV HC,A
          MOV HDV,B
          RET
          DELAY:
          MOV R5,#1
          RP1:
          MOV R1,255
          RP2:
          DJNZ R1,RP2
          DJNZ R5,RP1
          RET
          ORG 200H
          TABLE:
          DB 0C0H;0
          DB 0F9H;1
          DB 0A4H;2
          DB 0B0H;3
          DB 99H ;4
          DB 92H ;5
          DB 82H ;6
          DB 0F8H;7
          DB 80H ;8
          DB 98H ;9
          END
          Pác tham khảo cái đồng ồ timer này nhá! chạy ngon, tui thử roài!

          Comment


          • #6
            Nguyên văn bởi bodyguy Xem bài viết
            chờ hơn 1p rồi không nháy gì hết chứ đừng nói 11s, hix. Để nghiên cứu asm rồi viết lại bằng asm coi được không. Bạn có bài nào quet led viết bằng asm thì cho mình tham khảo nhé. Thanks
            ASM thì mình có học qua nhưng không mấy quan tâm, nên mình không nhớ, mình biết C chỉ vì vui thích thui, hi hi, => mình viết thử lại bài trên xem nhé?
            #include <regx51.h> // khai bao chuong trinh thu vien 8051

            unsigned char i;
            void delay (unsigned long ms) // Ham tao thoi gian tre ms

            {
            while(ms--);
            }
            void sangdon(void)
            {
            P1=~P1; delay(25000); tre 1s
            }

            void sangdan(void)
            {
            for(i=0;i<8;i++)
            {
            P1|=1<<i;delay(25000);
            }
            }

            void sangduoi(void)
            {

            for(i=0;i<8;i++)
            {
            P1=1<<i; delay(25000);
            }
            }
            main ()
            {
            P1=0;
            while (1)
            {
            sangdon();
            sangdan();
            sangduoi();
            }
            }
            Vũ xuân Lợi
            YM!:

            Comment


            • #7
              Quên, còn bài 1 thì bạn sửa cái đoạn mình nói thành % là có thể được rồi nhỉ? ví dụ, TL1=-25000%256
              Vũ xuân Lợi
              YM!:

              Comment


              • #8
                dùng phương pháp quét với led 7đoạn

                Comment


                • #9
                  Hình như không thể mô phỏng quét led 7 đoạn bằng Proteus được vì Animation của Proteus chỉ cho chạy tối đa 50frames/s trong khi 1 chu kỳ lệnh chỉ có 1us (nếu chạy được 10^6 frames/s và mỗi frame dài 1us thì mới mô phỏng chính xác).
                  Thứ 2 là hình như mấy con led 7 đoạn trong Proteus bị lỗi hay sao đó, cùng 1 mạch nếu xài 2 con led 7 đơn thì mô phỏng khác với 1 cặp led 7 chung vỏ.
                  Ai đã từng mô phỏng quét led 7 đoạn thành công (bài đơn giản cho 2 led 7 sáng cùng lúc không nháy thôi cũng được rồi) trên Proteus thì cho mình xin file Proteus + file Hex, file asm hoặc C nha.

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X