Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > частота звука


Автор: _beginner_ 1.4.2007, 19:39
как плавно увеличить частоту звука?

Автор: Kuvaldis 1.4.2007, 19:47
Если имеется в виду PC-speaker, то так (пример из Юрова):
Код

;---------Prg_7_1.asm---------------
;Программа ,имитирующая звук сирены.
;Изменение высоты звука от 450 Гц до 2100 Гц.
;Используется макрос delay (задержка).
;При необходимости
;можно поменять значение задержки (по умолчанию - для процессора Pentium).
;------------------------------------

model    small 
stack    100h
delay macro time
local    ext,iter
;макрос задержки, его текст ограничивается директивами macro и endm.
;На входе - значение задержки (в мкс)

    push    cx
    mov    cx,time
ext:
    push    cx
    mov    cx,5000
iter:
    loop    iter
    pop    cx
    loop    ext
    pop    cx
endm
.data    ;сегмент данных
tonelow    dw    2651    ;нижняя граница звучания = 450 Гц
cnt    db    0    ;счётчик для выхода из программы
temp    dw    ?    ;верхняя граница звучания
.code    ;сегмент кода
main:    ;точка входа в программу
    mov    ax,@data    ;связываем регистр ds с сегментом
    mov    ds,ax    ;данных через регистр ax
    xor    ax,ax    ;очищаем ax
go:
;заносим слово состояния 10110110b(0В6h) в командный регистр (порт 43h)
    mov    al,10110110b
    out    43h,al
    in    al,61h    ;получим значение порта 61h в al
    or    al,3    ;инициализируем динамик и подаем ток в порт 61h
    out    61h,al
    mov    cx,2083    ;количество шагов ступенчатого изменения тона
musicup:
;в ax значение нижней границы частоты 
    mov    ax,tonelow
    out    42h,al    ;в порт 42h младшее слово ax :al
    xchg    al,ah    ;обмен между al и ah
    out    42h,al    ;в порт 42h старшее слово ax:ah
    add    tonelow,1    ;повышаем тон
    delay 1    ;задержка на 1 мкс
    mov    dx,tonelow    ;в dx текущее значение высоты
    mov    temp,dx    ;temp - верхнее значение высоты 
    loop    musicup    ;повторить цикл повышения
    mov    cx,2083    ; восстановить счетчик цикла
musicdown:
    mov    ax,temp    ;в ax верхнее значение высоты
    out    42h,al    ;в порт 42h младшее слово ax :al
    mov    al,ah    ;обмен между al и ah
    out    42h,al;в порт 42h старшее слово ax :ah
    sub    temp,1    ;понижаем высоту
    delay 1    ;задержка на 1 мкс
    loop musicdown    ;повторить цикл понижения
nosound:
    in    al,61h    ;получим значение порта 61h в AL
    and    al,0FCh    ;выключить динамик
    out    61h,al    ;в порт 61h
    mov    dx,2651    ;для последующих циклов
    mov    tonelow,dx
    inc    cnt    ;увеличиваем счётчик проходов, то есть 
;количество звучаний сирены
    cmp    cnt,5    ;5 раз ? 
    jne    go    ;если нет, идти на метку go
    exit:
    mov    ax,4c00h    ;стандартный выход
    int    21h
end main    ;конец программы



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)