Programování reproduktoru
Při programování zvuku používáme bitovou instrukci (pracuje s jedním bitem).
Příklad P1.0 - nultý bit portu 1:
SETB P1.0
CLR P1.0
CPL P1.0
Princip generování zvuku dané frekvence
Analogový signál nahrazujeme v číslicové technice obdélníkovým signálem, tedy vysíláním jedničky a nuly po dobu půlperiody. Délku půlperiod si vypočítáme ze zadané frekvence.
Obr. 1: Perioda
Plynulý tón dané frekvence vytvoříme vysíláním jedničky a nuly po dobu půlperiody.
Reproduktor je ovládán pouze jedním bitem (kromě dvou napájecích vodičů).
Reproduktor je v našem případě připojen na nultý bit portu P1.
Plynulý tón f = 500 Hz (TON500)
Řešení :
Z frekvence vypočítáme periodu T = 1/f, T = 1/500 = 2 ms.
Z periody vypočítáme půlperiodu T/2 = 1 ms.
Po dobu půlperiody vysíláme 1, po dobu půlperiody vysíláme 0.
Program:
TON500: SETB P1.0 ; vysíláme jedničku na P1.0
CALL MS1 ; doba půlperiody pro f = 500 Hz
CLR P1.0 ; vysíláme nulu na P1.0
CALL MS1 ; doba půlperiody pro f =500 Hz
JMP TON500 ; plynulý tón f = 500 Hz
include(CAS.ASM) ; podprogram vlastních časů, kde máme ;1ms
END
Časy realizující půlperiody v tónech můžeme includovat přímo z již vytvořených podprogramů, (pokud jsou v nich obsaženy), nebo si časy vytvoříme jako podprogramy pod hlavním programem.
Úpravou vytvoříme program pro plynulý tón 1000 Hz (TON1000)
TON1000: SETB P1.0 ; vysíláme jedničku na P1.0
CALL M5S ; doba půlperiody pro f = 1000 Hz
CLR P1.0 ; vysíláme nulu na P1.0
CALL M5S ; doba půlperiody pro f =1000 Hz
JMP TON1000 ; plynulý tón f = 1000 Hz
Include(CAS.ASM) ; podprogram vlastních časů
END
Princip generování zvuku danou dobu
Pro zadanou dobu určitého tónu je potřeba vypočítat počet period, které budeme za sebou generovat. Jsou dvě možnosti výpočtu počtu period. Buď frekvenci vynásobíme délkou tónu, nebo délku tónu vydělíme délkou periody.
Příklad: Pro délku tónu 0,2 s a frekvenci 500 Hz je počet period 100.
Musíme tedy vyslat za sebou 100 period, aby tón trval 0,2 s.
Princip generování symetrického tónu 0,2 s zvuk a 0,2 s ticho
Obr. 2: Příklad signálu pro zvuk
Řešení:
Hlavní program si rozdělíme na dva podprogramy, první řeší tón 0,2 s frekvence 500 Hz, druhý řeší prodlevu – ticho délky 0,2 s.
ST: CALL TON ; realizace 100 T tónu 500 Hz
CALL TICHO ; realizace ticha 200 ms
JMP ST ; opakování dokola
TON: MOV R7,#100 ; počet opakování period 0,2 s x 500 = 100
HLP: CALL PER ; realizace jedné periody
DJNZ R7,HLP ; opakování 100 x
RET
PER: SETB P1.0 ; vysíláme jedničku na P1.0
CALL MS1 ; doba půlperiody pro f = 500 Hz
CLR P1.0 ; vysíláme nulu na P1.0
CALL MS1 ; doba půlperiody pro f =500 Hz
RET; jen jedna perioda f = 500 Hz
TICHO: CALL MS200
RET
include(CAS:ASM)
END
K realizaci jedné periody jsme využili předešlý program pro plynulý tón, ze kterého jsme vytvořili podprogram pro jednu periodu. K opakování počtu period jsme použili registr R7. Kdybychom použili registr R0 nebo R1, který využívá podprogram CAS.asm, docházelo by k přepisování registrů. Časy, které potřebujeme, si samozřejmě můžeme vytvořit samostatně jako podprogramy - třeba i časovačem.
Princip generování symetrického tónu 0,25 s zvuk a 0,25 s ticho – stále dokola
ST: CALL TON ; realizace 125 T tónu 500 Hz
CALL TICHO ; realizace ticha 200 ms
JMP ST ; opakování dokola
TON: MOV R7,#125 ; počet opakování period 0,25 s x 500 = 125
HP: CALL PER ; realizace jedné periody
DJNZ R7,HP ; opakování 125 x
RET
PER: SETB P1.0 ; vysíláme jedničku na P1.0
CALL MS1 ; doba půlperiody pro f = 500 Hz
CLR P1.0 ; vysíláme nulu na P1.0
CALL MS1 ; doba půlperiody pro f =500 Hz
RET ; jen jedna perioda f = 500 Hz
TICHO: CALL MS200 ; časová smyčka 200 ms
CALL MS50 ; časová smyčka 50 ms
RET
MS50: MOV R2,#50 ; časová prodleva 50 ms
KS: CALL MS1 ; nutno použít jiný registr než R0
DJNZ R2,KS
RET
include(CAS.ASM)
END
Princip generování nesymetrického tónu
Generování nesymetrického tónu: 0,25 s tón a 0,25 s ticho, 0,75 s tón a 0,75 s ticho – stále dokola (f = 500 Hz) – princip telefonního oznamovacího tónu.
Obr. 3: Nesymetrický tón
První část tónu (0,25,-0,25) je již vyřešena v předcházejícím programu.
Druhá část tónu (0,75- 0,75) se v tomto případě dá vytvořit z prvního tónu.
NS: CALL TON1 ; první část tónu (0,25 s – 0,25 s)
CALL TON2 ; druhá část tónu (0,75 s – 0,75 s)
JMP NS ; stále dokola zní dva různě dlouhé tóny
TON1: CALL TON ; realizace 125 T tónu 500 Hz
CALL TICHO ; realizace ticha 250 ms
RET ; opakování dokola
TON: MOV R7,#125 ; počet opak. period 0,25 s x 500 = 125
HOP: CALL PER ; realizace jedné periody
DJNZ R7,HOP ; opakování 125 x
RET
PER: SETB P1.0 ; vysíláme jedničku na P1.0
CALL MS1 ; doba půlperiody pro f = 500 Hz
CLR P1.0 ; vysíláme nulu na P1.0
CALL MS1 ; doba půlperiody pro f =500 Hz
RET ; jen jedna perioda f = 500 Hz
TICHO: CALL MS200 ; časová smyčka 200 ms
CALL MS50 ; časová smyčka 50 ms
RET
MS50: MOV R2,#50 ; časová prodleva 50 ms
SK: CALL MS1
DJNZ R2,SK ; zajistí opakování
RET
TON2: CALL TON ; realizace 125 T tónu 500 Hz
CALL TON ; realizace 125 T tónu 500 Hz
CALL TON ; realizace 125 T tónu 500 Hz
CALL TICHO; realizace ticha 250 ms
CALL TICHO ; realizace ticha 250 ms
CALL TICHO ; realizace ticha 250 ms
RET
include(CAS:ASM)
END
Princip generování nesymetrického tónu dvou frekvencí
Obr. 4: Tón 2 frekvencí
Generujte nesymetrický tón dvou frekvencí tón f = 1000 Hz délky 0,4 s a 0,4 s ticho, ihned potom vygenerujte tón f = 2000 Hz délky 0,1 s a 0,1 s ticho. Vše na portu P1.
Doporučuji řešit 2 podprogramy!!!!
Všechna zadaná a vypočítaná data si přehledně zobrazíme v tabulce.
Tabulka 15
frekvence | perioda | půlperioda | délka tónu | počet realizovaných period | délka prodlevy |
1000 Hz | 1 ms | 0,5 ms | 0,4 s | 400 = provedu 2x 200 | 0,4s = 2x 0,2s |
2000 Hz | 0,5 ms | 0,25 ms | 0,1 s | 200 | 0,1 s |
Pokud byste chtěli kombinovat zvuk s jiným přípravkem, připisujete jenom další podprogramy a hlídáte si porty.
Kdybyste třeba chtěli k předešlému programu 2 tónu přidat rotaci LED, připíšete do hlavního programu další podprogram, který vyřešíte.
ST: CALL FR1 ; f = 1000 Hz délky 0,4 s a ticha 0,4 s
CALL FR2 ; f = 2000 Hz délky 0,1 s a ticha 0,1 s
CALL ROTACE ; realizace rotace LED na druhém portu
JMP ST