| Author | Pesan |
|---|
semikonduktor
Joined: 04 Apr 2003 Posts: 294 Helped: 3 Lokasi: Perancis
| 27 April 2005 18:02 timeout di 89C51/89C52 | | |
|
| Aku ditugaskan program latihan untuk sebuah pintu otomatis AT89C51 untuk proyek.
Aku sedang menghadapi masalah: TIMEOUT
jika sensor mendeteksi orang luar yang tersedia, itu akan membuka pintu dan menunggu sensor mendeteksi batin orang yang tersedia. Setelah 20-an, jika tidak ada sinyal yang terdeteksi, secara otomatis menutup pintu dan kembali ke awal program (menunggu sinyal dari pintu luar.
dengan AT89C51, aku pemrograman di C, tapi aku tidak tahu bagaimana merancang algoritma TIMEOUT dengan AT89C51 (20 detik).
Dapatkah seseorang merekomendasikan saya solusi? |
|
| Kembali ke atas | |
 |
Google AdSense

| 27 April 2005 18:02 Iklan | | |
|
|
|
|
| Kembali ke atas | |
 |
IanP
Joined: 05 Oct 2004 Posts: 6.490 Helped: 1542 Lokasi: West Coast
| April 28, 2005 1:25 Re: timeout di 89C51/89C52 | | |
|
| Menggunakan Timer1 dalam MODE1 (16-bit counter) untuk menghitung (Fclock/12): FFFFh. Jika kristal yang mengganggu 11.0952MHz akan terjadi setiap (11095200/12) / 65536 = 14,108 .. kali per detik. Buat variabel TimeH dan TimeL. Meningkatkan TimeHTimeL setiap menyela. Untuk mencapai 20 detik, Anda akan memerlukan ≈ 282 potong dan yang akan meninggalkan TimeHTimeL = 01 1A (h) = 0.282 (d). Sekarang Anda dapat me-reset 20-an counter (TimeHTimeL) dan melaksanakan apa pun yang harus dilakukan setelah 20-an ..
Good luck .. |
|
| Kembali ke atas | |
 |
mrcube_ns
Joined: 10 April 2002 Posts: 429 Helped: 11 Lokasi: Dark side of the Moon
| 28 April 2005 21:17 Re: timeout di 89C51/89C52 | | |
|
| Completly IanP adalah benar,
tapi, saya sarankan untuk menggunakan kristal 12MHz, jadi satu siklus 1us.
Kemudian, Anda menggunakan Timer 1 sebagai timer 16-bit dan membuat 50ms timer (T1H = 0x3C T1L = 0xAF), sehingga Anda memiliki 20 dihitung dalam satu detik => untuk kaya 20sec Anda harus persis 400 penting.
Salam,
Mr.Cube |
|
| Kembali ke atas | |
 |
Hero
Joined: 06 Mar 2002 Posts: 145 Helped: 2
| April 29, 2005 3:51 Re: timeout di 89C51/89C52 | | |
|
| Hai,
Untuk jangka waktu yang lama perlu Sotware counter.
Gunakan perangkat keras 16-bit counter untuk generasi intterupt periodik.
Dalam rutin layanan interupsi CNT_FLAG mengatur variabel.
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 ();
while (1) ( ... cnt_process (); tidur (); / / modus tidur ) )
void cnt_process () ( if (CNT_FLAG) ( CNT_FLAG = 0; if (TIMEOUT_ENABLED) ( if (cnt <TIMEOUT_THRESHOLD) cnt ; TIMEOUT = (cnt == TIMEOUT_THRESHOLD); ) ) )
Ketika cnt mencapai TIMEOUT TIMEOUT_THRESHOLD akan ditetapkan.
Solusi lain adalah kenaikan cnt dalam rutin interupsi
void interrupt_routine () ( if (TIMEOUT_ENABLED) ( if (cnt <TIMEOUT_THRESHOLD) cnt ; TIMEOUT = (cnt == TIMEOUT_THRESHOLD); ) ) |
|
| Kembali ke atas | |
 |