1 4-8 IO_speaker 利用 HT66F50 中 PC4 腳位輸出特 性 控制 speaker 發聲
2 喇叭發聲原理 利用喇叭上的線圈通上電流造成薄膜振動 振動推動空氣產生聲音
3 LA 之頻率為 440KHz 每隔半音頻率增加為 倍 DO RE MI FA SOL LA TI DO’ TI=440KHz * * =493.9 Hz DO’= TI=440KHz * * * =523Hz
4 音階頻率週期 (ms) 半週期 (ms) DO DO’ RE RE’ MI FA FA’ SOL
5 方波每一週期有 HIGH LOW 各一半
6 ;PROGRAM : 4-8.ASM ;FUNCTION: Generate Tone Do~Do PC4 I/O pin #INCLUDEHT66F50.INC ; MY_DATA.SECTION'DATA' ;== DATA SECTION == DEL1 DB ? PITCH DB ? COUNT1 DB ? COUNT2 DB ? ; SPK_PORT EQU PC.4 ;define speak port SPK_PORTC EQU PCC.4 MY_CODE.SECTION AT 0 'CODE' ;== PROGRAM SECTION == ORG 00H ;HT-66F50 RESET VECTOR CLEAR SPK_PORTC;PCC.4=0
7 MAIN: MOVE A,TAB_PITCH_DURATION MOVE TBLP,A ;Initial table pointer NEXT_PITCH: TABRDL PITCH ;Load Pitch/Duration to Pitch/TBLH CLEAR ACC XOR A,TBLH ; TBLH, read only SZ Z ; Is last tone JMP MAIN ;yes, restart MOV COUNT1,A ;No, load Duration to Count1 INC TBLP LOOP: MOVE A,10 MOVE COUNT2,A ;inner loop count
8 HI: SET SPK_PORT ;Set SPK_PORT High MOVE A,PITCH CALL DELAY ;Pitch delay CLR SPK_PORT ;Reset SPK_PORT Low MOVE A,PITCH CALL DELAY ;Pitch delay SDZ COUNT2 ;inner loop ok JUMP HI ;NO. SDZ CONUT1 ;Outer loop ok JMP LOOP ;No. JMP NEXT_PITCH ;yes, next pitch
9 ACC*10us,(ACC*9+1) cycles DELAYPROC MOVDEL1,A;SET DEL1 COUNTER DEL_1: TABRDL ACC TABRDL ACC SDZDEL1 ;DEL1 DOWN COUNT JMPDEL_1 RET DELAYENDP ORG LASTPAGE
10 TAB_PITCH_DURATION: DC /(523*2*10)+(523)/(2*10))SHL 8 ;Do tone & Duration DC /(587*2*10)+(587)/(2*10))SHL 8 ;Re tone & Duration DC /(659*2*10)+(659)/(2*10))SHL 8 ;MI tone & Duration DC /(698*2*10)+(698)/(2*10))SHL 8 ;FA tone & Duration DC /(785*2*10)+(785)/(2*10))SHL 8 ;SoL tone & Duration DC /(880*2*10)+(880)/(2*10))SHL 8 ;LA tone & Duration DC /(988*2*10)+(988)/(2*10))SHL 8 ;SoL tone & Duration DC /(1047*2*10)+(1047)/(2*10))SHL 8 ;LA tone & Duration DC 0 ;Table end code END /(523*2*10) DO TONE 523/(2*10) DURATION
11 SHL SHL (TBLP 顯示 0 至 9) = (after SHL Bit 14-8 放置 TBLH 作為 DELAY)
12 音調高低之參數 F 為產生之音調頻率 半週期時間為 (2*F) -1 Delay 時間 DEL1*10us 產生 F Hz 所需之 DEL1 為 (2F) -1 /(10*10 -6 )=10 6 /(2*F*10)
13 產生 0.5 秒之頻率 F Hz 所需脈波數為 F/2 8 bit problem Two Loop 內圈 10 外圈 F/(2*10)