在IC 2051的组装中产生声音

时间:2014-10-06 14:27:41

标签: assembly embedded 8051

1)我是iPhone开发人员,但需要在汇编方面做一些工作,我必须使用汇编语言编写代码来生成声音(假设发出哔哔声)

2)然后我必须将此.asm文件转换为.hex文件并将其写入编程IC 2051之后,我必须将其连接到生成声音的硬件(我有)

我坚持第一部分,任何帮助将受到高度赞赏,因为我被困在其中几周

以下是我的示例代码

section .text
    global _start         ;must be declared for using gcc

_start:                 ;tell linker entry point

    mov edx, len        ;message length
    mov ecx, msg        ;message to write
    mov ebx, 1          ;file descriptor (stdout)
    mov eax, 4          ;system call number (sys_write)
    int 0x80            ;call kernel

    mov eax, 1          ;system call number (sys_exit)
    int 0x80            ;call kernel

section .data

MOV     DX,2000          ; Number of times to repeat whole routine.

MOV     BX,1             ; Frequency value.

MOV     AL, 10110110B    ; The Magic Number (use this binary number only)
OUT     43H, AL          ; Send it to the initializing port 43H Timer 2.

NEXT_FREQUENCY:          ; This is were we will jump back to 2000 times.

MOV     AX, BX           ; Move our Frequency value into AX.

OUT     42H, AL          ; Send LSB to port 42H.
MOV     AL, AH           ; Move MSB into AL  
OUT     42H, AL          ; Send MSB to port 42H.

IN      AL, 61H          ; Get current value of port 61H.
OR      AL, 00000011B    ; OR AL to this value, forcing first two bits high.
OUT     61H, AL          ; Copy it to port 61H of the PPI Chip
                         ; to turn ON the speaker.

MOV     CX, 100          ; Repeat loop 100 times
DELAY_LOOP:              ; Here is where we loop back too.
LOOP    DELAY_LOOP       ; Jump repeatedly to DELAY_LOOP until CX = 0


INC     BX               ; Incrementing the value of BX lowers 
                         ; the frequency each time we repeat the
                         ; whole routine

DEC     DX               ; Decrement repeat routine count

CMP     DX, 0            ; Is DX (repeat count) = to 0
JNZ     NEXT_FREQUENCY   ; If not jump to NEXT_FREQUENCY
                         ; and do whole routine again.

                         ; Else DX = 0 time to turn speaker OFF

IN      AL,61H           ; Get current value of port 61H.
AND     AL,11111100B     ; AND AL to this value, forcing first two bits low.
OUT     61H,AL           ; Copy it to port 61H of the PPI Chip
                         ; to turn OFF the speaker.

了解详情:http://www.intel-assembler.it/portale/5/make-sound-from-the-speaker-in-assembly/8255-8255-8284-asm-program-example.asp#ixzz3FNK0E1U2

1 个答案:

答案 0 :(得分:2)

发布的链接是关于x86硬件和8255 PPI - 鉴于您的硬件,这两者都不是您感兴趣的。作为如何在硬件上执行此操作的示例,您的“示例代码”对您没什么用处,它是不同的指令集和不同的硬件。此外,在任何情况下,它都是一种非常粗糙且在CPU中非常昂贵的产生声音的方法。

你的芯片有两个16位定时器/计数器,每个可以直接驱动一个引脚 - 你不需要汇编器;你也可以使用高级语言(C最适合该平台)。无论哪种方式,您都可以简单地编程一个定时器,以所需的频率输出信号,运行时软件开销为零,然后在所需的时间段后停止定时器(您可以使用第二个定时器/计数器)。

如果必须使用汇编程序,那么首先需要学习8051指令集,然后根据您将使用的汇编程序/链接程序工具链,会有轻微的语法和指令差异。其次,您需要熟悉零件和电路板的硬件规格,并了解扬声器如何与其连接和驱动。

基本上你选择以不相关的信息作为起点从错误的地方开始。


[编辑]

我对AT89C2051并不熟悉,因为我使用了任何类型的MCS-51已经很长时间了,但它可能无法使用硬件PWM,在这种情况下你可以切换GPIO引脚。定时器中断,如汇编程序和C示例here中所述。无论哪种方式,这些示例都非常接近您目前正在尝试使用的内容!