Генерування звукових сигналів різної частоти за допомогою клавіатури

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    221,9 Кб
  • Опубликовано:
    2012-12-22
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Генерування звукових сигналів різної частоти за допомогою клавіатури





 

 

 

 

 

 

 

 

Курсова робота

з дисципліни “Системне програмування”

на тему:

“Генерування звукових сигналів різної частоти за допомогою клавіатури ”

ЗМІСТ

Вступ

Розділ 1. Аналіз технічного завдання та методів його вирішення

Розділ 2. Опис методики та алгоритму вирішення задачі

Розділ 3. Опис програми та аналіз отриманих результатів

Висновок

Список використаних джерел

Додаток А

Додаток Б

ВСТУП

Сучасне комп’ютерне програмне забезпечення перетворило персональні ПК у потужні обчислювальні машини, які здатні виконувати найрізноманітніші завдання. На даний момент існує безліч програм, які здатні задовольнити потреби користувачів у різних галузях науки та повсякденному житті: фізика, математика, графіка, економіка, бізнес тощо. Також у свою чергу розвивається програмне забезпечення, призначене для створення та написання музики.

На даний момент музичні програми здатні замінити навіть живі інструменти.

Завдання курсової роботи полягає в тому, щоб скласти програму яка здатна відтворювати системним динаміком звуки різної частоти. Основою цього програмування є програмування мікросхеми таймера 8253 або 8255.

Для розв’язання поставленої задачі вибрана мова програмування Асемблер, оскільки вона має досить потужний набір інструментів для того , щоб створювати не тільки звук, але й змінювати його надаючи йому певних відтінків і тонів.

Асемблерні програми можуть бути дуже ефективними. На Асемблері можна написати програму більш компактну і швидкодіючу ніж написану на мові високого рівня. Це дійсно так для невеликих або середніх програм. По мірі зростання розмірів, програми втрачають частину своїх переваг. Це відбувається через необхідність в Асемблерній програмі уваги до дрібниць. Мова Асемблер потребує від програміста планування кожної дії. В невеликих програмах це дозволяє оптимізувати роботу програми з апаратними засобами. У великих програмах величезна кількість деталей може перешкодити эффективно працювати над самою програмою, навіть якщо окремі компоненти програми виявляться дуже непоганими. Безумовно, програмування на мові Асемблера відповідає потребам не кожної програми. Програми на Асемблер дуже точні. Оскільки ця мова дозволяє програмісту безпосередньо працювати з всім апаратним забезпеченням. Поза сумнівом, що при програмуванні пристроїв вводу-виводу, де потрібен контроль над окремими розрядами регістрів пристрою,програмування на мові Асемблер - єдиний правильний вибір. Також програми написані на Асемблері можуть з’єднуватись із програмами, написаними на мовах високого рівня, що дозволяє оптимізувати останні.

РОЗДІЛ 1. АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ ТА МЕТОДІВ ЙОГО ВИРІШЕННЯ

Завдання курсової роботи полягає в тому щоб відтворювати звуки заданої частоти. Розглядаючи вхідні дані ми можемо скласти такий їхній перелік: частота звуку, тривалість звуку. Частоту звуку можна в свою чергу розбити ще на приналежність його до певної музичної октави: мала, перша, друга, третя, та ін. Також окремим видом звуку можу бути і шум. Продумуючи програму був обраний шлях який полягає в тому що при натисканні певної клавіші на клавіатурі буде отриманий звук певної частоти, який буде відповідати частоті певної ноти (до, ре, мі, та ін.). Отже основним вихідним результатом має стати програний звук (нота) через системний динамік.

Для обробки і видачі звуків через динамік буде використовуватися програмування мікросхеми таймера. Всі ІBM PC використовують мікросхему таймера 8253 (чи 8254) для узгодження імпульсів від мікросхеми системного годинника. Число циклів системного годинника перетвориться в один імпульс, а послідовність цих імпульсів підраховується для визначення часу, чи вони можуть бути послані на гучномовець комп'ютера для генерації звуку визначеної частоти. Мікросхема 8253 має три ідентичних незалежних канали, кожний з який може програмуватися.

Мікросхема 8253 працює незалежно від процесора. Процесор програмує мікросхему і потім звертається до інших справ. У такий спосіб 8253 діє як годинник реального часу - вона рахує свої імпульси незалежно від того, що відбувається в комп'ютері. Однак, максимальний програмувальний інтервал складає приблизно1/12 секунди. Для підрахунку інтервалів часу в годин та хвилин потрібні якісь інші засоби. Саме з цієї причини імпульси від нульового каналу мікросхеми таймера накопичуються в перемінній , що знаходиться в області даних BІOS.

РОЗДІЛ 2. ОПИС МЕТОДИКИ ТА АЛГОРИТМУ ВИРІШЕННЯ ЗАДАЧІ

Генерація звуку за допомогою адаптера інтерфейсу з периферією 8255 складається у включенні і вимиканні з бажаною частотою біта порту B, що зв'язаний з динаміком (біт 1). Порт B має адреса 61H. Якщо програма переключає значення біта з максимально можливою частотою, то частота занадто висока, щоб бути потрібною. Тому між двома переключеннями треба вставляти порожній цикл. Пам’ятайте , що біт 0 порту B керує воротами каналу 2 мікросхеми таймера, що у свою чергу зв'язаний з динаміком. Тому цей біт повинний бути скинутий, від'єднуючись від каналу таймера.

Ми будемо використовувати той метод , який забезпечує відтворення звуку з іншими діями які відбуваються на РС. Ми використовуємо адрес порту мікросхеми 8255 який знаходиться по адресу 61Н , а для того щоб отримати звук нам потрібно послати число з потрібною частотою в канал 2 який знаходиться по адресу 42Н, а також після цього вимкнути динамік.

В ініціалізаційні частині - області програми, де описані змінні та константи містяться стрічки повідомлень:    db     'Space-RESTART',13,10,'$'    db     'Enter-HELP',13,10,'$'    db         'Esc-EXIT',13,10,'$'db 'Matiyshun Yura$'db 'Vuberity trivalisty zvuchannya$'db 'Zvyk notu :$',

стрічки назв нот(n1 - n15).db 'DO$'db 'RE$'db 'MI$'db 'FA$'db 'SOL$'db 'LA$'db 'SI$'db 'DO1$'db 'RE1$'db 'MI1$'db 'FA1$'db 'SOL1$'db 'LA1$'db 'SI1$'db 'DO2$',

тривалості звучання нот:db '1$'db '2$'db '3$'db '4$'db '5$'db '6$',

та текст меню допомоги        db     ' Klavisha - Nota Klavisha - Nota',13,10       '         z - Do              s - Do(verhnye)',13,10    '         x - Re                   d - Re(verhnye)',13,10    '         c - Mi               f - Mi(verhnye)',13,10     '         v - Fa          g - Fa(verhnye)',13,10     '         b - Sol         h - Sol(verhnye)',13,10    '         n - La          j - La(verhnye)',13,10      '         m - Si          k - Si(verhnye)',13,10,'$'

Також сюди входять змінні NOTE та DELAY.dw ('?')db ('?')

Ці змінні мають розмір відповідно два та один байт. У змінну NOTE під час виконання програми заноситься частота ноти, яка має програватись, а змінна DELAY призначена для зберігання часу тривалості звучання ноти. Після опису цих даних йде ініціалізація стеку розміром 128 байт:

.stack 128

Нижче розглянемо приклад отримання звуку певної частоти і певної тривалості:AL,61h - получаємо поточну адресу порту ВAL,00000011B - дозволяємо таймер і динамік61h,AL

Після цього встановлюємо режим для 2-го каналу. Керуюче слово пересилаємо у порт 43Н, який є командним регістром.AL,0B6H43h, AL

Після цього пересилаємо частоту ноти, яка знаходиться у змінній NOTE, у порт 42Н побайтово, використовуючи регістр AL.DX, NOTEAL, DL42H, ALAL, DH42H, AL

За допомогою функції 0Н переривання 1АН одержуємо значення лічильника, яке буде використовуватись для затримки звучання ноти. Далі змінну DELAY, у якій міститься час затримки звучання ноти, пересилаємо у регістр CL. Після цього заносимо молодший байт лічильника у регістр ВХ. Сумуємо його із даним часом затримки. Далі виконується переривання INT 1AH і у регістрі DX буде міститися текуче значення лічильника, яке перевіряється із вмістимим регістру BX.AH, 01AHCL, DELAYCH, 0BX, DXBX, CX

PLAY:1AHDX, BX

Якщо вмістиме обох регістрів однакове, то відбувається вимкнення системного динаміка за допомогою команди AND AL, 0FCH і OUT 61H, AL, які пересилають керуюче слово у порт 61Н, чим у свою чергу вимикають системний динамік. Після цього завершується підпрограма міткою endp.PLAYAL, 61HAL, 0FCH61H, AL

Алгоритм роботи програми можна описати такими пунктами:

1.       Відображення на екрані текстового інтерфейсу

2.       Вивід на екран повідомлення про можливість введення тривалості ноти

.        Читання коду клавіші яка натиснута

.        Перевірка на натиснення клавіш 1-6 (задання тривалості звучання ноти)

.        Якщо клавіша ESC з програми то до пункту 15

.        Якщо клавіша Enter то до пункту 14

.        Якщо клавіша Space 1

.        Читання коду клавіші яка натиснута

.        Перевірка на натиснення клавіш

.        Якщо клавіша ESC з програми то до пункту 15

.        Якщо клавіша Enter то до пункту 14

.        Якщо клавіша Space 1

.        Відтворення звуку після цього до пункту 2

.        Відображення на екрані інтерфейсу довідки, після натиску потрібної клавіші (ESC )переходимо на пункт 1

.        Вихід із програми

Графічне відображення алгоритму роботи міститься в Додатку А

РОЗДІЛ 3. ОПИС ПРОГРАМИ ТА АНАЛІЗ ОТРИМАНИХ РЕЗУЛЬТАТІВ

звук генерація інтерфейс клавіатура

Дана програма призначена для роботи в текстовому режимі в операційній системі MS-DOS. Вона забезпечує програвання нот двох октав, використовуючи клавіатуру в якості емулятора клавіатури музичного інструмента. Також користувач за допомогою цифрових клавіш може керувати тривалістю звучання нот. Програма не вимоглива до апаратного забезпечення та ресурсів комп’ютера, містить надпростий зручний текстовий інтерфейс. Для завершення програми досить натиснути клавішу Esc.

Оскільки ми розробляємо програму яка програє звуки після того як буде нажата потрібна клавіша то ми вносимо потрібні функції які дають змогу зчитувати код натиснутої клавіші, була використана функція 7Н переривання 21Н.ah,721h

Очистка екрану від посторонніх символів здійснюється за допомогою переривання int 10h функції 6Н.AH,6AL,24CH,0CL,0DH,24DL,79BH,910H

Далі на екран виводяться повідомлення за допомогою переривання int 21h функції 9Нdx,OFFSET stringah,921h

Для задання тривалості звучання ноти йде цілий блок порівняння вмістимого регістру із клавішами '1'...'6'. За допомогою команди cmp al, 49 порівнюється вмітиме регістра al із значенням 49. Якщо вони нерівні, то відбувається перехід на мітку наступного порівняння, якщо рівні - у змінну DELAY заноситься число, яке відповідає за тривалість звучання ноти.al, 49NEXTDELAY,1:

Якщо код відповідає одній із натиснених клавіш, то у змінну DELAY відповідно заноситься певне значення тривалості звучання ноти. Якщо ж код не відповідає даним клавішам, то у змінну DELAY заноситься значення «6» .

Таким самим шляхом, ми зчитуємо наступну натиснуту клавішу, яка повинна відповідати певній ноті.

Таблиця 2.1 відповідності клавіш та нот

Клавіша

Нота звучання

Частота

z

DO

2300

RE

2031

c

MI

1809

v

FA

1709

b

SOL

1521

n

LA

1353

m

SI

1207

,

DO1

1139

s

DO1

1139

d

RE1

1015

f

MI1

905

g

FA1

854

h

SOL1

760

j

LA1

676

k

SI2

603

l

DO2

569

al, 'x'GO_dx,OFFSET n1NOTE, 2300bym_:

Якщо код клавіші співпав із кодом ноти, то при цьому у змінну NOTE заноситься частота звучання відповідної ноти mov NOTE, 2300, у регістр DX заноситься зміщення стрічки, яка є назвою ноти і буде відображатися на екрані і відбувається перехід на підпрограму опрацювання змінних NOTE та DELAY, тобто відбувається перехід на мітку BYM програвання даної ноти із даною затримкою звучання.

Якщо ж код клавіші не співпав із кодами нот та цифрами, то він перевіряється із кодом клавіші Esc.al, 27EXITCONTINUE

Якщо він співпав, то відбувається перехід на мітку завершення програми EXIT. Під час завершення відбувається очищення екрану та вивід повідомлення EXIT_MESSAGE і програма завершується. Якщо код клавіші не співпав із клавішею Esc, то відбувається перехід на мітку CONTINUE і все повторюється спочатку.

При натисненні додаткових клавіш програма виконує додаткові дії.

Так при натисненні клавіші «enter» викликається інформація меню HELP, в якому описано відповідність нажатої клавіші клавіатури та ноти яка повинна прозвучати. Порівняння і відображення довідки відбувається за допомогоюal,0dhhelp1::ah,0al,210hah,9hdx,offset help21h23,69ah,9dx,offset slovo321hah,721hal,1bhznovpov

Повернутися в програму можна нажавши клавішу “esc”, при натисненні будь-якої іншої клавіші довідка відображається знову.

Також при натисненні клавіші “space” основна програма запускається ще раз, тобто за допомогою мітки переходить на початок програми.al,20hznov

Після вдалого запуску програми ви будете бачити вікно програми яке буде мати вигляд який представлений на рис. 3.1

Рис. 3.1

Користувач сам може задати тривалість звучання нот. На екран виводиться позначення ноти, яку натиснув користувач. У будь-який момент програми можна визвати інформаційну допомогу (Рис.3.2) за допомогою клавіші Enter, ознайомившись з довідкою можна повернутися в попереднє меню натиснувши Esc; розпочати виконання програми заново, натиснувши клавішу Space; та вийти з програми натиснувши Esc.

Рис. 3.2

ВИСНОВКИ

Результатом даної курсової роботи є створений програмний продукт на мові Асемблер який забезпечує можливість програвання звуків (нот) різної частоти. Вона містить зручний інтерфейс, використовує клавіатуру для програвання нот та системний динамік для їх озвучення. Забезпечує програвання двох октав з можливістю регулювання тривалості звучання ноти. Дана програма працює тільки під середовищем MS-DOS.

Якщо продовжувати модернізацію даної програми можна добитися різних результатів, наприклад можна запропонувати користувачеві вести порядок програвання звуків певної мелодії, яка запишеться в пам'ять і потім може бути програна, можна також вести звуки півтонів що теж дасть хороший результат. Впродовж всього програмування ми використовували безпосереднє програмування мікросхем 8253 та 8255.

Отже бачимо що мова Асемблер має потужний набір функцій для осягнення такої області культури як музика.

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Роберт Журден Справочник программиста персональных компьютеров типа IBM , 1992. - 541c.

. К.Г.Финогенов. Самоучитель по системным функциям MS-DOS. - М.: “Малип”, 1993. - 262с.

. Зубков С.В. Assembler для DOS, Windows и UNIX. - М.:ДМК Пресс, 2000. - 608 с.

4.Орловский Г.В. Введение в архітектуру микропроцесора 80386.- Санкт-Петербург: ИНФОКОМ, 1992.-240с.

.Юров В. Assembler. -СПб.:Питер, 2001.-624с

6. Юров В. Assembler. Практикум. Питер, 2006 г.- 400

.Владислав Пирогов. Ассемблер для Windows - СПб.: БХВ-Петербург, 2002. - 896 с



ДОДАТОК Б

КОД ПРОГРАМИsmall

.datadb 'PROHRAM$'db 'Vuberity trivalisty zvuchannya$'db 'Zvyk notu :$'db 'DO$'db 'RE$'db 'MI$'db 'FA$'db 'SOL$'db 'LA$'db 'SI$'db 'DO1$'db 'RE1$'db 'MI1$'db 'FA1$'db 'SOL1$'db 'LA1$'db 'SI1$'db 'DO2$'db '1$'db '2$'db '3$'db '4$'db '5$'db '6$'db ' $'    db         'Space-RESTART',13,10,'$'    db     'Enter-HELP',13,10,'$'    db     'Esc-EXIT',13,10,'$'         db     ' Klavisha - Nota Klavisha - Nota',13,10       '         z - Do                   s - Do(verhnye)',13,10         '         x - Re                   d - Re(verhnye)',13,10    '         c - Mi          f - Mi(verhnye)',13,10          '         v - Fa          g - Fa(verhnye)',13,10     '         b - Sol                  h - Sol(verhnye)',13,10         '         n - La          j - La(verhnye)',13,10      '         m - Si          k - Si(verhnye)',13,10,'$'dw ('?')db ('?')

.stack 128

.386

.codeax,@datads,ax       macro x,yah,2bh,0dh,xdl,y10h:AH,6AL,24CH,0CL,0DH,24DL,79BH,110HAH,2DH,1DL,22BH,010Hdx,OFFSET mesah,921h 23,69ah,9hdx,offset slovo221h 23,34ah,9hdx,offset slovo121h 23,1ah,9hdx,offset slovo321hAH,2DH,3DL,1BH,010Hdx,OFFSET stringah,921hax, axAH,2DH,3DL,40BH,010Hah,721haxal,0dhhelp1al,1dhexital,49NEXTDELAY,1dx,OFFSET t1print_t:al,50NEXT1DELAY,2dx,OFFSET t2print_t:al,51NEXT2DELAY,3dx,OFFSET t3print_t:al, 52NEXT3DELAY, 4dx,OFFSET t4print_t:al, 53NEXT4DELAY, 5dx,OFFSET t5print_t:al, 54DELAY, 6dx,OFFSET t6print_t_t:ah,921hAH,2DH,5DL,1BH,010Hdx,OFFSET string1ah,921h:ax, axAH,2DH,5DL,40BH,010Hah,721haxdx, offset SPACEah,921hAH,2DH,5DL,40BH,010Haxal,0dhhelp1al,20hznoval, 'x'GO_dx,OFFSET not1NOTE, 2300bym_:al, 'c'GO1_dx,OFFSET not2NOTE, 2031bym_:al, 'v'GO2_dx,OFFSET not3NOTE, 1809bym_:al, 'b'GO3_dx,OFFSET not4NOTE, 1709bym_:al, 'n'GO4_dx,OFFSET not5NOTE, 1521bym_:al, 'm'GO5_dx,OFFSET not6NOTE, 1353bym_:al, ','GO6_dx,OFFSET not7NOTE, 1207bym_:al, '.'GO7_dx,OFFSET not8NOTE, 1139bym_:al, 'd'GO8_dx,OFFSET not9NOTE, 1015bym_:al, 'f'GO9_dx,OFFSET not10NOTE, 905bym_:al, 'g'GO10_dx,OFFSET not11NOTE, 854bym_:al, 'h'GO11_dx,OFFSET not12NOTE, 760bym_:al, 'j'GO12_dx,OFFSET not13NOTE, 676bym_:al, 'k'GO13_dx,OFFSET not14NOTE, 603bym_:al, 'l'GO14_dx,OFFSET not15NOTE, 569bym_:al, 's'GO15_dx,OFFSET not8NOTE, 1139bym_:al, 27EXITCONTINUE:ah,921hzvykCONTINUE::ah,0al,210hah,9hdx,offset help21h23,69ah,9dx,offset slovo321hah,721hal,1bhznovpov:ax, 4c00h21hprocAL,61hAL,00000011B61h,ALAL,0B6H43h,ALDX, NOTEAL, DL42H, ALAL, DH42H, ALAH, 01AHCL, DELAYCH, 0BX, DXBX, CX:1AHDX, BXPLAYAL, 61HAL, 0FCH61H, ALendp


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!