Thông báo

Collapse
No announcement yet.

Có thể chạy Timer ở 2 chế độ khác nhau ở 2 khoảng thời gian riêng được không?

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

  • Có thể chạy Timer ở 2 chế độ khác nhau ở 2 khoảng thời gian riêng được không?

    Em là sinh viên mới tập tọe học điện tử, xin các anh giải đáp cho em mấy vấn đề:
    Em đang làm mạch đo tần số bằng 8051 hiển thì trên PC qua cổng RS232. Em dùng T0 tạo xung mở khóa, dùng T1 đếm xung đi vào trong thời gian mở khóa. Nhưng muốn giao tiếp với cổng RS232 thì phải dùng bộ nhớ đệm SBUF mà tốc độ baud phụ thuộc vào T1. Khi này T1 phải hoạt động ở chế độ định thời. Em làm như sau: khi hết 1 xung mở khóa, em lưu giá trị T1 vào 1 biến temp rồi tăng T1 lên 255. Khi bắt đầu xung mở khóa sau thì TF1 sẽ lên 1 và ngắt. Trong hàm ngắt, e tắt cả T0 và T1 rồi chuyển TMOD=0x02 và đưa temp ra SBUF. Nhưng kết quả là T0 sau khi chạy hết chu kỳ đầu thì giữ nguyên giá trị 1, còn T1 thì chỉ đếm được 1 lần.
    Các anh chỉ bảo cho em với
    Em cám ơn các anh.
    (Em không up đựoc file mạch lên, nên đành up ảnh, các anh thông cảm)

    #include <REGX51.H>
    #include <stdio.h>

    char dem, tylexung, temp, flag=1;
    int time;

    void khoitao()
    {
    EA=0;
    TMOD=0x61;
    TH0=0x00;
    TL0=0x00;
    TH1=0x00;
    TL1=0x00;
    ET1=1;
    ET0=1;
    dem=0;
    EA=1;
    TR0=1;
    TR1=1;
    }

    void t0() interrupt 1
    {
    TR0=0;
    TF0=0;
    if(dem<tylexung+1)
    P2_0=1;
    dem++;
    if(dem==tylexung+1)
    {
    P1=TL1;
    temp=TL1;
    P2_0=0;
    TL1=255;
    }
    if(dem>tylexung) P2_0=0;
    if(dem==10) dem=0;
    TH0=0x00;
    TL0=0x00;
    TR0=1;
    }

    void t1() interrupt 2
    {
    TR1=0;
    TR0=0;
    TF1=0;
    TF0=0;
    TMOD=0x20;
    TL1=TH1=-3;
    SCON=0x50;
    TR1=1;
    time=5000;
    while(time)
    {
    while(!TI);
    TI=0;
    SBUF=temp;
    time--;
    }
    flag=1;
    }

    void main()
    {
    while(1)
    {
    if(flag)
    {
    khoitao();
    flag=0;
    P2_7=flag;
    }
    tylexung=5;
    }
    }
    Attached Files

  • #2
    Huhu, k ai giúp e ah??

    Comment


    • #3
      Nguyên văn bởi dhp11591 Xem bài viết
      Huhu, k ai giúp e ah??
      RẤT MUỐN GIÚP NHƯNG LỰC BẤT TỔN HAO "ý là không muốn giúp đó "

      Thôi thì bạn giúp ngược lại mình đi có dc không

      mình mới học 8051 được vài ngày nên mới chỉ viết dc đoạn code điều khiển led đơn = 89c51 , mình chỉ control dc có 1port à khi p1 chạy thì p2 cũng chạy song song vs nhau ,không bíêt làm cách nào mà khi port1 vưa tắt thì tới port2 rồi tới port3 , mong anh em giúp mình với ,đoạn code mình viết nè

      org 00h
      main:
      mov p1,#10101010b
      acall delay
      mov p1,#01010101b
      acall delay
      mov p2,#00001111b
      acall delay
      mov p2,#11110000b
      acall delay
      mov p2,#10000000b
      acall delay
      mov p2,#01000000b
      acall delay
      mov p2,#00100000b
      acall delay
      mov p2,#00010000b
      acall delay
      mov p2,#00001000b
      acall delay
      mov p2,#00001000b
      acall delay
      mov p2,#00000100b
      acall delay
      mov p2,#00000010b
      acall delay
      mov p2,#00000001b
      acall delay
      mov p0,#11111111b
      sjmp main
      delay:
      mov r2,#10
      loop:
      mov tmod,#00010000b
      mov tl1,#low(-1000)
      mov th1,#high(-1000)
      setb tr1
      jnb tf1,$
      clr tr1
      clr tf1
      djnz r0,loop
      ret
      end

      chúc sức khỏe các bạn

      Comment


      • #4
        Mình không rành về hợp ngữ, chỉ biết qua mấy câu đơn giản thôi nhưng mình nghĩ để điều khiển 8 LED chạy lần lượt 4 chế đô thì bạn nên dùng cổng OR và trong code nên có dòng tắt cổng 00000000b hoặc dung MUX chọn chế độ cho máu . K đc ném tạ nhẹ nha )
        Hix, các cao thủ ơi, cho em cái link nào về vấn đề này cũng được
        Nếu em tạo xung vuông bằng trực tiếp từ 1 chân bình thường ví dụ P2_0, em sẽ dùng hàm delay(t) nhưng em không bit tính chu kỳ của nó như thế nào. Các anh chỉ bảo cho em đi....
        Last edited by dhp11591; 11-03-2012, 09:29.

        Comment


        • #5
          Hay quá, đúng là em ngớ ngẩn thật, khi T1 hoạt động ở baud 9600 thì cũng có ngắt => lặp lại hàm ngắt khởi tạo baud mà em vừa đặt. Hi, em bit sai rùi, các anh chỉ em cách sửa với

          Comment


          • #6
            Cái interrupt 1 là em viết cho hàm ngắt T0. Ban đầu e cũng nghĩ là phải dùng interrupt 0 cho T0 nhưng thấy người ta ví dụ toàn dùng interrupt 1 thôi ah, em làm theo thấy xung vuông chạy ầm ầm
            Mà em không hiểu cái dùng T1 tạo tốc độ baud. Rõ ràng T1 hoạt động ở chế độ Timer thì p có hàm ngắt cho nó chứ, đây e thấy 1 bài hiển thị qua RS232 mà không thấy hàm ngắt đâu cả, vẫn chạy ầm ầm, mà không có hàm ngắt thì lấy đâu ra tần số? Các pro bảo e với
            Em học theo họ thấy cũng ra thật nhưng vấn đề là về thanh ghi SBUF và cờ T1. Đúng ra sau mỗi khi SBUF truyền xong 8 bit thì bit stop bật, trước khi bit stop bật thì cờ TI bật để báo hiệu thanh ghi sẵn sàng rồi tắt đi luôn (theo e thấy SBUF truyền bit stop cách 8 bit thông tin 1 nhịp). không biết e hiểu thế có đúng không nhưng e tính sau khi đếm xung thì hiển thị 5 lần, mà chỉ sau lần truyền cuối cùng TI mới được kích 1 xung. Các a xem giúp e với


            #include <REGX51.H>
            #include <stdio.h>

            char dem=0, tylexung;
            int time, temp;

            void khoitao1()
            {
            EA=0;
            TMOD=0x61;
            TH0=125;
            TL0=202;
            TH1=0x00;
            TL1=0x00;
            ET0=1;
            EA=1;
            TR0=1;
            TR1=1;
            }


            void khoitao2()
            {
            TR1=0;
            SCON=0x52;
            TMOD=0x20;
            TL1=TH1=253;
            TR1=1;
            time=5;
            while(time)
            {
            time--;
            P2_1=TI;
            SBUF=temp;
            while(!TI);
            TI=0;
            }
            dem++;
            }

            void t0() interrupt 1
            {
            TR0=0;
            TF0=0;
            if(dem<tylexung+1)
            P2_0=1;
            dem++;
            if(dem==(tylexung+1))
            {
            P2_0=0;
            P1=TL1;
            temp=TL1;
            TL1=0;
            }
            if(dem==10) dem=0;
            TH0=125;
            TL0=202;
            TR0=1;
            }

            void main()
            {
            khoitao1();
            do
            {
            tylexung=5;
            if(dem==(tylexung+1))
            {
            khoitao2();
            khoitao1();
            }
            }while(1);
            }







            Nhưng mà đo đầu ra TxD thấy vẫn truyền đủ cả 5 lần. Như vậy là sao Liệu có ảnh hưởng chập cheng j khi hiển thị không ạ???? Mà em viết nháp, để cho dễ nhìn nên chưa cho phần chuyển sang ký tự số. Các anh thông cảm
            Last edited by dhp11591; 12-03-2012, 12:16.

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            Đang tải...
            X