+ Trả Lời Ðề Tài
Trang 1/2 1 2 cuốicuối
kết quả từ 1 tới 10 trên 15

Đề tài: Đếm số lần nút nhấn hiện thị lên LED 7seg

  1. #1
    biendt - TBĐ47
    Tham gia
    Fri Feb 2009
    Bạn đang xài vB
    Gõ bàn phím, đeo tai nghe
    Bài
    446
    Thanks
    30
    Thanked 73 Times in 46 Posts

    Default Đếm số lần nút nhấn hiện thị lên LED 7seg

    /* Viet boi : biendt-Trang bi dien dien tu -DHGTVT
    Website : http://www.biendt.22web.net*/
    /*Dung nut nhan o : P1_0
    Hien thi LED 7 Seg : P2
    Viet boi : biendt - Trang bi dien - dien tu CN&GTVT K47 */

    #include <REGX51.H>
    /* Ham tao thoi gian tre*/
    unsigned int i;
    void delay(unsigned int t)
    {
    for(i=1;i<1000;i++)
    for(i=1;i<t;i++);
    }
    unsigned char n=0;
    unsigned char dongcongtac(void)
    {
    if(P1_0==0) {
    delay(3000);
    while(P1_0==0)
    {
    ;//khoong lam gi
    }
    n++;
    if(n==10)
    { n=0; }
    }
    return n;
    }
    void hienthiso(unsigned char x)
    {
    switch(x)
    {
    case 0:{P2=0xff;P2=P2&0x40;break;}
    case 1:{P2=0xff;P2=P2&0xf9;break;}
    case 2:{P2=0xff;P2=P2&0x24;break;}
    case 3:{P2=0xff;P2=P2&0x30;break;}
    case 4:{P2=0xff;P2=P2&0x19;break;}
    case 5:{P2=0xff;P2=P2&0x12;break;}
    case 6:{P2=0xff;P2=P2&0x02;break;}
    case 7:{P2=0xff;P2=P2&0xf8;break;}
    case 8:{P2=0xff;P2=P2&0x80;break;}
    case 9:{P2=0xff;P2=P2&0x10;break;}
    }
    }

    /*Ham chinh*/
    void main(void)
    {
    unsigned char m;
    while(1)
    {
    m=dongcongtac();
    hienthiso(m);
    }
    }

    Các pác hãy thảo luận bài này để hiểu rõ hoạt động và chương trình trong đóMục tiêu dành cho các Pác K47 đang học C)
    Làm gì cho hết kiếp nạn!

  2. Thành viên thấy bài viết của biendt có ích:

    gamo47 (22-02-2009)

  3. #2
    biendt - TBĐ47
    Tham gia
    Fri Feb 2009
    Bạn đang xài vB
    Gõ bàn phím, đeo tai nghe
    Bài
    446
    Thanks
    30
    Thanked 73 Times in 46 Posts

    Default

    Quên mất không gửi các pác phần mô phổng protues.
    http://www.biendt.22web.net/upload/f...07%20thanh.zip
    Làm gì cho hết kiếp nạn!

  4. #3
    Thất tinh ác ma DLinh2210's Avatar
    Tham gia
    Mon Feb 2009
    Bài
    256
    Thanks
    21
    Thanked 22 Times in 20 Posts

    Default

    cho tham gia tý cho vui nhỉ, cái hàm delay chỉ là hàm tạo trễ bình thường thôi (chắc ai cũng biết).
    còn hàm hienthiso() là hàm đưa ra hiển thị cho LED (theo các vạch của LED 7 vạch đó)
    hàm dongcongtac() là hàm lấy số lần đóng công tắc. và cứ sau 9 lần đóng thì nó sẽ reset về thành 0 --> đưa ra hiển thị từ 0 -->9.
    hoạt động của hàm là nếu công tắc được đóng (P1_0 ==0) thì sẽ gọi hàm trễ (để chắc chắn thôi mà), sau đó nếu công tắc vẫn được giữ (vẫn đóng) thì nó sẽ nhảy vào vòng lặp while và không làm gì cho đến khi nào công tắc được nhả ra thì nó sẽ thoát khỏi vòng while (kết thúc một lần đóng mở công tắc), khi đó sẽ đếm n tăng lên 1 và trả về kết quả hàm.
    như vậy thì cứ sau mỗi lần đóng mở công tắc thì sẽ đưa ra số hiển thị tăng dần từ 0->9 rồi lại về 0.
    anh tham gia có gì không đúng thì các chú thông cảm nhé, kiến thức có hạn
    TBĐ-K42
    Hãy giữ cái đầu lạnh để giải quyết những việc nóng!

  5. Thành viên thấy bài viết của DLinh2210 có ích:

    biendt (23-02-2009)

  6. #4
    biendt - TBĐ47
    Tham gia
    Fri Feb 2009
    Bạn đang xài vB
    Gõ bàn phím, đeo tai nghe
    Bài
    446
    Thanks
    30
    Thanked 73 Times in 46 Posts

    Default

    Pác nói thế là tương đối hoàn chỉnh rồi! Chắc là bọn em phải học thêm anh mới đựoc. Mong anh chỉ giáo nhé!
    Làm gì cho hết kiếp nạn!

  7. #5
    Thất tinh ác ma linh's Avatar
    Tham gia
    Sat Jan 2009
    Bài
    280
    Thanks
    43
    Thanked 35 Times in 25 Posts

    Default

    Trích biendt View Post
    /* Viet boi : biendt-Trang bi dien dien tu -DHGTVT
    Website : http://www.biendt.22web.net*/
    /*Dung nut nhan o : P1_0
    Hien thi LED 7 Seg : P2
    Viet boi : biendt - Trang bi dien - dien tu CN&GTVT K47 */

    #include <REGX51.H>
    /* Ham tao thoi gian tre*/
    unsigned int i;
    void delay(unsigned int t)
    {
    for(i=1;i<1000;i++)
    for(i=1;i<t;i++);
    }
    unsigned char n=0;
    unsigned char dongcongtac(void)
    {
    if(P1_0==0) {
    delay(3000);
    while(P1_0==0)
    {
    ;//khoong lam gi
    }
    n++;
    if(n==10)
    { n=0; }
    }
    return n;
    }
    void hienthiso(unsigned char x)
    {
    switch(x)
    {
    case 0:{P2=0xff;P2=P2&0x40;break;}
    case 1:{P2=0xff;P2=P2&0xf9;break;}
    case 2:{P2=0xff;P2=P2&0x24;break;}
    case 3:{P2=0xff;P2=P2&0x30;break;}
    case 4:{P2=0xff;P2=P2&0x19;break;}
    case 5:{P2=0xff;P2=P2&0x12;break;}
    case 6:{P2=0xff;P2=P2&0x02;break;}
    case 7:{P2=0xff;P2=P2&0xf8;break;}
    case 8:{P2=0xff;P2=P2&0x80;break;}
    case 9:{P2=0xff;P2=P2&0x10;break;}
    }
    }

    /*Ham chinh*/
    void main(void)
    {
    unsigned char m;
    while(1)
    {
    m=dongcongtac();
    hienthiso(m);
    }
    }

    Các pác hãy thảo luận bài này để hiểu rõ hoạt động và chương trình trong đóMục tiêu dành cho các Pác K47 đang học C)

    Code này viết hơi dài, và mới chỉ hiện thị 1 led, chưa phải là quét led 7 vạch. Bạn thử nâng cấp lên thành quét 2 led và đếm tới 99 xem thế nào ! Lúc quét led nếu dùng hàm while(P1_0==0) {}, và delay(3000) thì sẽ phát sinh vấn đề khá lớn đấy.
    mình cũng có 1 đoạn bắt nút này bạn xem thử nhé không biết có sai chỗ nào kô , đoạn này là mình sửa lại đoạn code ở trên đấy !
    unsigned char dongcongtac(void)
    {
    static int t;
    static char flag_button;
    if(P1_0 == 0)
    {
    if(++t > 3000) // as delay 3000 Cycle program
    flag_button = 1;
    }else
    {
    t = 0;
    if(flag_button)
    {
    if(++n >= 10)
    n = 0;
    flag_button = 0;
    }
    }
    return n;
    }
    Nói chuyện không hợp, nửa câu là nhiều.
    Tri kỷ uống rượu, như gặp lại cố nhân ...

  8. #6
    Moderator
    Tham gia
    Sat Jan 2009
    Bài
    1,260
    Thanks
    105
    Thanked 275 Times in 217 Posts

    Default

    1. Lỗi tràn biến do không có chặn trên cho t: khi nút bấm vẫn bấm thì t sẽ tăng liên tục, kể cả sau khi đã vượt 3000. Khi vượt quá max t (32767), sẽ có hiện tượng quay vòng: t = -32768 dễ gây lỗi nhấp nháy.

    2. Chương trình có khử nhiễu rung tiếp điểm: Xóa những lần tác động thừa bằng cách trễ. Tuy nhiên, thời gian trễ cố định, trễ sườn trước 3000, trong khi trễ sườn sau có 10: Quá chênh lệch
    3. Xóa cờ flagbutton quá sớm, do vậy, n sẽ không thể tăng đủ 10 được. Lệnh xóa phải để trong ngoặc cùng n=0;
    3. Trả về n: Như vậy, khi buông tay mới nhận phím -> Ngược. Thời gian trả về là 10 vòng quét có hợp lý?.

    Nhiều lỗi quá. Thở đã

  9. #7
    Thất tinh ác ma linh's Avatar
    Tham gia
    Sat Jan 2009
    Bài
    280
    Thanks
    43
    Thanked 35 Times in 25 Posts

    Default

    Trích nghia View Post
    1. Lỗi tràn biến do không có chặn trên cho t: khi nút bấm vẫn bấm thì t sẽ tăng liên tục, kể cả sau khi đã vượt 3000. Khi vượt quá max t (32767), sẽ có hiện tượng quay vòng: t = -32768 dễ gây lỗi nhấp nháy.

    2. Chương trình có khử nhiễu rung tiếp điểm: Xóa những lần tác động thừa bằng cách trễ. Tuy nhiên, thời gian trễ cố định, trễ sườn trước 3000, trong khi trễ sườn sau có 10: Quá chênh lệch
    3. Xóa cờ flagbutton quá sớm, do vậy, n sẽ không thể tăng đủ 10 được. Lệnh xóa phải để trong ngoặc cùng n=0;
    3. Trả về n: Như vậy, khi buông tay mới nhận phím -> Ngược. Thời gian trả về là 10 vòng quét có hợp lý?.

    Nhiều lỗi quá. Thở đã
    hà hà
    1 - biến t khi tăng lên quá 3000 thì sẽ bật cờ flag_button lên 1, còn sau đó ko cần quan tâm tới giá trị của t nữa, khi đó quá trình tăng n phụ thuộc vào đầu vào P1_0.
    2 - 3000 trễ đầu là để khử nhiễu rung tiếp điểm, mục đích của tác giả là để đếm n tăng và hiển thị giá trị n chứ ko phải dùng n = 10 để khử nhiễu ( xem kỹ ý đồ bạn biêndt )
    3 - sau mỗi lần tăng n thì cờ flagbutton phải xóa để cho lần ấn nút sau ( bắt sườn xung chứ ko phải bắt mức )
    4 - Ý đồ ban đầu của bạn Biêndt là bắt sườn xung lên ( ý chủ quan của tác giả nên ko bàn ), không phải thời gian trả về là 10 mà là phém đếm chỉ đến 10.
    5 - đoạn code trên là sửa lại chương trình của biêndt, sao cho tránh ko phải dùng hàm delay và while, còn lại giữ nguyên ý đồ của hàm dongcongtac(void)
    6 - mệt nghỉ tý đã
    thay đổi nội dung bởi: linh, 24-02-2009 lúc 01:07 AM
    Nói chuyện không hợp, nửa câu là nhiều.
    Tri kỷ uống rượu, như gặp lại cố nhân ...

  10. #8
    Moderator
    Tham gia
    Sat Jan 2009
    Bài
    1,260
    Thanks
    105
    Thanked 275 Times in 217 Posts

    Default

    Thế thì cũng sai: Khi tăng n lên phải xóa t về 0.

  11. #9
    Thành viên mới
    Tham gia
    Tue Feb 2009
    Bài
    10
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Default

    Trích linh View Post
    t = 0;
    if(flag_button)
    {
    if(++n >= 10)
    n = 0;
    flag_button = 0;
    }
    theo mình thì có lẽ ko cần phải thêm 1 lệnh xóa t khi tăng n nữa vì như trong đoạn code trên thì t đã được xóa trước khi có thể tăng n rùi !
    Anh yêu em như ri

  12. #10
    Moderator
    Tham gia
    Sat Jan 2009
    Bài
    1,260
    Thanks
    105
    Thanked 275 Times in 217 Posts

    Default

    Đồng ý.
    Tuy nhiên, 2 lỗi còn lại vẫn còn:
    1. t tăng không hạn chế
    2. n tăng khi buông nút, thay vì khi bấm nút?

+ Trả Lời Ðề Tài
Trang 1/2 1 2 cuốicuối

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Quyền Sử Dụng Ở Diễn Ðàn

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts