>, kā dizains timeout algoritmu ar AT89C51?

P

pusvad

Guest
Es esmu piešķirts izmantot programmas AT89C51 automātiskai durvju projektu.

Es esmu saskaras problēma: taimautu

ja ārējais sensors konstatē cilvēkiem pieejamas, tā atvērsies durvis un gaida iekšējo sensors konstatē cilvēkiem pieejama.Pēc 20s, ja signāls tiek atklāts, tas automātiski aizvērt durvis un atgrieztos sākuma programmas (gaida signālu no ārējās durvis.

ar AT89C51, es esmu plānošanas C, bet es nezinu, kā projektēt timeout algoritmu ar AT89C51 (20 sekundes).

Var kāds ieteikt man risinājumi?

 
counter bit Lietošana TIMER1 jo MODE1 (16), lai skaits (Fclock/12): FFFFh.
Ja kristāls ir 11.0952MHz pārtraukt notiks reizi (11095200/12) / 65536 = 14,108 ..reizes sekundē.
Izveidot mainīgs TimeH un TimeL.
Palielināt TimeHTimeL reizi pārtraukt.Lai sasniegtu 20 sekundes jums būs nepieciešams ≈ 282 pārtrauc, un ka atstās TimeHTimeL = 01 1.A (h) = 0.282 (d).
Tagad jūs varat atiestatīt 20s skaitītājs (TimeHTimeL) un izpildīt kāda jāveic pēc 20s ..

Good luck ..

 
IanP ir completly tiesības,

bet, es iesaku izmantot 12MHz kristāla, tādējādi vienā ciklā, ir 1us.

Tad jūs izmantojat taimeris 1, 16-bitu taimeri un kas 50ms taimeris (T1H = 0x3C T1L = 0xAF), tāpēc jums ir 20 skaits vienā sekundē =>, lai bagāts 20sec jums ir nepieciešams tieši 400 skaitu.Best regards,Mr.Cube

 
Hi,

Uz ilgu laiku jums ir nepieciešams sotware counter.

Izmantot 16-bitu aparatūras counter periodiskas intterupt paaudzei.

Kas pārtrauc pakalpojuma ikdienas noteikts CNT_FLAG mainīgs.

neparakstīts char CNT_FLAG;
neparakstīts garš cnt;
neparakstīts char Noildze;
neparakstīts char TIMEOUT_ENABLED;

# Define TIMEOUT_THRESHOLD 1024

par spēkā neesošu interrupt_routine ()
(
CNT_FLAG = 1;
)

par spēkā neesošu galvenais ()
(
init ();

kamēr (1) (
...
cnt_process ();
miega (); / / iet gulēt režīms
)
)

par spēkā neesošu cnt_process ()
(
ja (CNT_FLAG) (
CNT_FLAG = 0;
ja (TIMEOUT_ENABLED) (
ja (cnt <TIMEOUT_THRESHOLD)
cnt ;
Noildze = (cnt == TIMEOUT_THRESHOLD);
)
)
)

Kad cnt sasniegt TIMEOUT_THRESHOLD timeout tiks noteiktas.

Vēl viens risinājums ir pieauguma cnt pārtraukt rutīnas

par spēkā neesošu interrupt_routine ()
(
ja (TIMEOUT_ENABLED) (
ja (cnt <TIMEOUT_THRESHOLD)
cnt ;
Noildze = (cnt == TIMEOUT_THRESHOLD);
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top