| Tác giả | Thông báo |
|---|
bán dẫn
Tham gia ngày: 04 tháng 4 năm 2003 Bài viết: 294 Đă giúp: 3 Địa điểm: Pháp
| 27 Tháng Tư 2005 18:02 timeout trong 89C51/89C52 | | |
|
| Tôi đang được giao một bài tập cho một chương tŕnh AT89C51 cho dự án cửa tự động.
Tôi đang phải đối mặt với một vấn đề: TIMEOUT
nếu các cảm biến phát hiện người bên ngoài có sẵn, nó sẽ mở cửa và chờ đợi cảm biến bên trong phát hiện người dân có sẵn. Sau 20s, nếu không có tín hiệu được phát hiện, nó sẽ tự động đóng cửa và trở về đầu của chương tŕnh (chờ đợi tín hiệu từ các cửa bên ngoài.
với AT89C51, tôi là lập tŕnh C nhưng tôi không biết làm thế nào để thiết kế TIMEOUT thuật toán với AT89C51 (20 giây).
Ai đó có thể giới thiệu cho tôi giải pháp? |
|
| Trở về đầu trang | |
 |
IanP
Tham gia: ngày 05 tháng 10 năm 2004 Bài viết: 6.490 Đă giúp: 1542 Địa điểm: West Coast
| 28 tháng 4 năm 2005 01:25 Re: timeout trong 89C51/89C52 | | |
|
| Sử dụng TIMER1 trong Mode1 (16-bit truy cập) để đếm (Fclock/12): FFFFh. Nếu tinh thể là 11.0952MHz ngắt sẽ xảy ra mỗi (11095200/12) / 65536 = 14,108 .. lần thứ hai. Tạo biến TimeH và TimeL. Tăng TimeHTimeL mọi gián đoạn. Để đạt đến 20 giây, bạn sẽ cần ≈ 282 ngắt và sẽ rời khỏi TimeHTimeL = 01 1A (h) = 0282 (d). Bây giờ bạn có thể thiết lập lại 20s truy cập (TimeHTimeL) và thực hiện bất cứ điều ǵ nên được thực hiện sau khi 20s ..
Chúc may mắn .. |
|
| Trở về đầu trang | |
 |
mrcube_ns
Tham gia ngày: 10 Tháng 4 năm 2002 Bài viết: 429 Đă giúp: 11 Địa điểm: Dark side of the Moon
| 28 tháng 4 năm 2005 21:17 Re: timeout trong 89C51/89C52 | | |
|
| IanP là hoàn toàn đúng,
nhưng, tôi khuyên bạn nên sử dụng 12MHz tinh thể, do đó, một chu kỳ là 1us.
Sau đó, bạn sử dụng bộ đếm thời gian là 1 giờ 16-bit và làm 50ms hẹn giờ (T1H = 0x3C T1L = 0xAF), v́ vậy bạn có 20 số lần trong một 20sec thứ hai => để giàu bạn cần đếm chính xác 400.
Lời chúc mừng tốt đẹp nhất,
Mr.Cube |
|
| Trở về đầu trang | |
 |
Google AdSense

| 28 tháng 4 năm 2005 21:17 Quảng cáo | | |
|
|
|
|
| Trở về đầu trang | |
 |
Anh hùng
Tham gia: ngày 06 tháng 3 năm 2002 Bài viết: 145 Đă giúp: 2
| 29 Tháng Tư 2005 03:51 Re: timeout trong 89C51/89C52 | | |
|
| Chào,
Đối với khoảng thời gian dài bạn cần sotware truy cập.
Sử dụng phần cứng 16-bit truy cập cho các thế hệ intterupt định kỳ.
Trong gián đoạn dịch vụ thường lệ đặt biến CNT_FLAG.
unsigned char CNT_FLAG; unsigned long cnt; unsigned char TIMEOUT; unsigned char TIMEOUT_ENABLED;
# define TIMEOUT_THRESHOLD 1024
void interrupt_routine () ( CNT_FLAG = 1; )
void main () ( init ();
trong khi (1) ( ... cnt_process (); ngủ (); / / go to sleep mode ) )
void cnt_process () ( nếu (CNT_FLAG) ( CNT_FLAG = 0; nếu (TIMEOUT_ENABLED) ( if (cnt <TIMEOUT_THRESHOLD) cnt ; TIMEOUT = (cnt == TIMEOUT_THRESHOLD); ) ) )
Khi cnt đạt TIMEOUT_THRESHOLD TIMEOUT sẽ được thiết lập.
Giải pháp khác là cnt tăng trong ngắt thường lệ
void interrupt_routine () ( nếu (TIMEOUT_ENABLED) ( if (cnt <TIMEOUT_THRESHOLD) cnt ; TIMEOUT = (cnt == TIMEOUT_THRESHOLD); ) ) |
|
| Trở về đầu trang | |
 |