chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用51單片機(jī)實(shí)現(xiàn)音樂(lè)播放的程序資料概述

Wildesbeast ? 來(lái)源:?jiǎn)纹瑱C(jī)教程網(wǎng) ? 作者:?jiǎn)纹瑱C(jī)教程網(wǎng) ? 2020-06-21 11:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

利用單片機(jī)(或單板機(jī))奏樂(lè)大概是無(wú)線電愛(ài)好者感興趣的問(wèn)題之一。本文從單片機(jī)的基本發(fā)間實(shí)驗(yàn)出發(fā),談?wù)勔魳?lè)程序的設(shè)計(jì)原理,并給出具體實(shí)例,以供參考。下面提供2個(gè)列子,大家根據(jù) 需要自行選擇

單片機(jī)最小系統(tǒng),兩位LED數(shù)碼管由串口輸出接兩個(gè)164驅(qū)動(dòng),Lout,Rout為左右聲道輸出,

SET, ALT0, ALT1為三個(gè)按鍵,也可自己在開(kāi)始的I/O定義改成你想用的I/O口;12M晶振

若用89C51則只可裝下約14首歌曲,用89C52則可裝下近40曲

源程序

; Electronic Music

; Version 4.50

; Copyright (c) XAJ 2001

;============================

LOUT BIT P1.0 ;左聲道輸出

ROUT BIT P1.2 ;右聲道輸出

SET BIT P3.3 ;SET按鍵

ALT0 BIT P3.6 ;ALT0按鍵

ALT1 BIT P3.7 ;ALT1按鍵

;REPNUM EQU 09H重復(fù)段編號(hào)

STATU EQU 0AH;狀態(tài)寄存器

LDYDSR EQU 0BH;左低音度數(shù)

RDYDSR EQU 0CH;右低音度數(shù)

LDYAR EQU 0DH;左低音協(xié)助

RDYAR EQU 0EH;右低音協(xié)助

JPCLK EQU 0FH;節(jié)拍時(shí)鐘

GENCLK EQU 10H;通用時(shí)鐘

SNSDCLK EQU 11H;搜、存顯示時(shí)鐘

GEN16T0 EQU 12H;通用16位時(shí)鐘

GEN16T1 EQU 13H;

SETST0 EQU 14H;設(shè)置狀態(tài)

SETST1 EQU 15H; 定時(shí)時(shí)鐘

DISNUM0 EQU 16H;顯示數(shù)值

DISNUM1 EQU 17H;寄存器(2位)

CSN EQU 18H;當(dāng)前曲曲號(hào)

REP0L EQU 19H;0號(hào)重復(fù)段地址

REP0H EQU 1AH;

REP1L EQU 1BH;1號(hào)重復(fù)段地址

REP1H EQU 1CH;

REP2L EQU 1DH;2號(hào)重復(fù)段地址

REP2H EQU 1EH

REP3L EQU 1FH;3號(hào)重復(fù)段地址

REP3H EQU 23H;

COSPEEDN EQU 24H;

SPENR EQU 25H;

LOCF BIT 00H;左聲道開(kāi)關(guān)標(biāo)志

ROCF BIT 01H;右聲道開(kāi)關(guān)標(biāo)志

SECHSTOF BIT 02H;搜索、存儲(chǔ)標(biāo)志

NEXTSF BIT 03H;下一曲標(biāo)志

CSBESTOF BIT 04H;當(dāng)前曲鎖存/釋放

CUYFD BIT 05H;當(dāng)前音符顯示

KSETF BIT 06H;SET鍵按下標(biāo)志

KALT0F BIT 07H;ALT0鍵按下標(biāo)志

KALT1F BIT 08H;ALT1鍵按下標(biāo)志

SPEEDF BIT 09H;速度增/減標(biāo)志

TONEF BIT 0AH;音調(diào)增/減標(biāo)志

YPBIT BIT 0BH;音頻邏輯輸出

KBDISF BIT 0CH;鍵盤(pán)顯示標(biāo)志

REP0F BIT 0DH;0號(hào)重復(fù)段控制

REP1F BIT 0EH;1號(hào)重復(fù)段控制

REP2F BIT 0FH;2號(hào)重復(fù)段控制

REP3F BIT 10H;3號(hào)重復(fù)段控制

SBOTM EQU 25H;堆棧區(qū)(棧底)

BUFF0 EQU 43H;鎖存曲數(shù)

BUFF EQU 44H;鎖存曲緩沖區(qū)

;============================

;=========BEGIN==============

ORG 0000H

LJMP MAIN

;---------T0INT--------------

ORG 000BH

LJMP T0INT

;---------T1INT--------------

ORG 001BH

LJMP T1INT

;1.音頻發(fā)生器

;---------YPFSQ(01)----------

ORG 0030H

T0INT: MOV TL0,R4

MOV TH0,R5

PUSH PSW

PUSH ACC

PUSH 01H

JB LOCF,ROPER

MOV R1,#00H

MOV A,LDYAR

T0LLOP: RRC A

MOV YPBIT,C

XCH A,R1

CJNE A,LDYDSR,T0LNEXT

MOV C,YPBIT

MOV LOUT,C

INC LDYAR

; INC P0

SJMP ROPER

T0LNEXT: XCH A,R1

INC R1

SJMP T0LLOP

ROPER: JB ROCF,T0RETI

MOV R1,#00H

MOV A,RDYAR

T0RLOP: RRC A

MOV YPBIT,C

XCH A,R1

CJNE A,RDYDSR,T0RNEXT

MOV C,YPBIT

MOV ROUT,C

INC RDYAR

; INC P2

SJMP T0RETI

T0RNEXT: XCH A,R1

INC R1

SJMP T0RLOP

T0RETI: POP 01H

POP ACC

POP PSW

RETI

;2.通用時(shí)鐘

;---------CLOCK(02)----------

T1INT: MOV TL1,#0F0H

MOV TH1,#0D8H

PUSH PSW

PUSH ACC

INC JPCLK

INC GENCLK

INC SNSDCLK

MOV A,SNSDCLK

CJNE A,#0FFH,T1NEXT

CLR SECHSTOF

T1NEXT: INC GEN16T0

MOV A,GEN16T0

CJNE A,#100,T1NEXT0

MOV GEN16T0,#00H

INC GEN16T1

T1NEXT0: INC SETST0

MOV A,SETST0

CJNE A,#100,T1RETI

MOV SETST0,#00H

INC SETST1

MOV A,SETST1

CJNE A,#20,T1RETI

MOV SETST1,#00H

MOV STATU,#00H

T1RETI: POP ACC

POP PSW

RETI

;3.顯示子程序

;---------DISPLAY(03)--------

DISPLAY: PUSH ACC

PUSH DPL

PUSH DPH

MOV DPTR,#T_FIGCODE

MOV A,DISNUM0

MOVC A,@A DPTR

MOV SBUF,A

JNB TI,$

CLR TI

MOV A,DISNUM1

MOVC A,@A DPTR

MOV SBUF,A

JNB TI,$

CLR TI

POP DPH

POP DPL

POP ACC

RET

T_FIGCODE:

DB 088H,0EBH,04CH,049H

; 0 1 2 3

DB 02BH,019H,018H,0CBH

; 4 5 6 7

DB 008H,009H,00AH,038H

; 8 9 A B

DB 09CH,068H,01CH,01EH

; C D E F

DB 080H,0E3H,044H,041H

; 0. 1. 2. 3.

DB 023H,011H,010H,0C3H

; 4. 5. 6. 7.

DB 000H,001H,002H,030H

; 8. 9. A. B.

DB 094H,060H,014H,016H

; C. D. E. F.

DB 0FFH,02FH,098H,07FH

; 熄滅 # G -

DB 07CH,078H,0BCH,00AH

; c o L R

DB 029H

; Y

;4.主程序MAIN

;---------MAIN(04)-----------

MAIN: MOV R0,#01H

CLR A

CLRAM: MOV @R0,A

INC R0

CJNE R0,#80H,CLRAM

MOV R0,A

MOV SP,#SBOTM

MOV 08H,#BUFF

;MOV 09H,#BUFF

MOV SCON,#00H

MOV TMOD,#11H

MOV TL1,#0F0H

MOV TH1,#0D8H

SETB EA

SETB ET0

SETB ET1

SETB TR1

START: MOV DPTR,#T_SONGS

RYF: LCALL RYFSUP

MOV A,R7

JZ START

CJNE R7,#0FFH,SYF

JBC NEXTSF,NEXTSCL

MOV A,STATU

JNZ GONSBQ

MOV A,BUFF0

JNZ MPSQCL

LCALL PAQSCL

SJMP MQNFD

MPSQCL: LCALL PSQSCL

MQNFD: LCALL QNFDSUP

MOVPJRYF: INC DPTR

INC DPTR

SJMP RYF

NEXTSCL: LCALL CSBESTOJG

JB CSBESTOF,CALLPSCL

LCALL PAQSCL

SJMP MOVPJRYF

CALLPSCL: LCALL PSQSCL

SJMP MOVPJRYF

GONSBQ: LCALL CSDPTR

INC DPTR

INC DPTR

SJMP MOVPJRYF

SYF: CJNE R6,#0FFH,CALLPLAY

LCALL REPCLSUP

SJMP MOVPJRYF

CALLPLAY: LCALL YFDSUP

LCALL PLAY

SJMP MOVPJRYF

;5.讀音符子程序

;---------RYFSUP(05)--------

RYFSUP: CLR A

MOVC A,@A DPTR

MOV R6,A

MOV A,#01H

MOVC A,@A DPTR

MOV R7,A

RET

;6.統(tǒng)唱曲首處理

;---------PAQSCL(06)--------

PAQSCL: MOV CSN,R6

INC DPTR

INC DPTR

LCALL RYFSUP

MOV 02H,R6

MOV 03H,R7

RET

;7.存唱曲首處理

;---------PSQSCL(07)--------

PSQSCL: PUSH PSW

SETB RS0

CLR RS1

PSQC7E: CJNE R0,#7EH,PSQNEXT

PSQNEXT: JC PSQNEXT1

MOV R0,#BUFF

SJMP PSQC7E

PSQNEXT1: MOV A,@R0

JNZ PSQNEXT2

INC R0

INC R0

INC R0

SJMP PSQC7E

PSQNEXT2: MOV CSN,@R0

INC R0

MOV 02H,@R0

INC R0

MOV 03H,@R0

INC R0

POP PSW

LCALL CSDPTR

INC DPTR

INC DPTR

RET

;8.曲號(hào)閃顯子程序

;---------QNFDSUP(08)-------

QNFDSUP: PUSH ACC

MOV GEN16T0,#00H

MOV GEN16T1,#00H

QNGON: LCALL CSNSDISN

LCALL DISPLAY

MOV GENCLK,#00H

QNWAIT: MOV A,GENCLK

CJNE A,#35,QNWAIT

MOV DISNUM0,#20H

MOV DISNUM1,#20H

LCALL DISPLAY

MOV GENCLK,#00H

QNWAIT1: MOV A,GENCLK

CJNE A,#15,QNWAIT1

MOV A,GEN16T1

CJNE A,#02,QNGON

POP ACC

RET

;9.曲號(hào)送顯示寄存器

;---------CSNSDISN(09)------

CSNSDISN: MOV A,CSN

ANL A,#0FH

LCALL CSBESTOJG

JNB CSBESTOF,NADP

ADD A,#10H

NADP: MOV DISNUM0,A

MOV A,CSN

SWAP A

ANL A,#0FH

MOV DISNUM1,A

RET

;10.當(dāng)前曲是否被存儲(chǔ)判斷

;---------CSBESTOJG(10)-----

CSBESTOJG:PUSH ACC

PUSH PSW

MOV A,BUFF0

JZ CLRCSTOF

MOV R0,#BUFF

CSBCMPCSN:MOV A,@R0

CJNE A,CSN,CSBGSCAN

SETB CSBESTOF

SJMP CSBRET

CSBGSCAN: INC R0

INC R0

INC R0

CJNE R0,#7EH,CSBNEXT

CSBNEXT: JC CSBCMPCSN

CLRCSTOF: CLR CSBESTOF

MOV R0,#BUFF

CSBCMP0: MOV A,@R0

JZ CSBRET

INC R0

INC R0

INC R0

CJNE R0,#7EH,CSBNEXT1

CSBNEXT1: JC CSBCMP0

CSBRET: POP PSW

POP ACC

RET

;11.找當(dāng)前曲首址

;---------CSDPTR(11)--------

CSDPTR: MOV DPTR,#T_SONGS

CSDSCAN: LCALL RYFSUP

CJNE R7,#0FFH,CSDNEXT

MOV A,R6

CJNE A,CSN,CSDNEXT

SJMP CSDRET

CSDNEXT: INC DPTR

INC DPTR

SJMP CSDSCAN

CSDRET: RET

;12.重復(fù)段處理子程序

;---------REPCLSUP(12)------

REPCLSUP: MOV A,R7

ANL A,#0FH

CJNE A,#02H,CMPA3

MOV A,R7

SWAP A

ANL A,#0FH

JNZ H4CMP1

JNB REP0F,REPRET0

CLR REP0F

MOV DPL,REP0L

MOV DPH,REP0H

REPRET0: RET

H4CMP1: CJNE A,#01H,H4CMP2

JNB REP1F,REPRET

CLR REP1F

MOV DPL,REP1L

MOV DPH,REP1H

RET

H4CMP2: CJNE A,#02H,H4CMP3

JNB REP2F,REPRET

CLR REP2F

MOV DPL,REP2L

MOV DPH,REP2H

RET

H4CMP3: CJNE A,#03H,REPRET

JNB REP3F,REPRET

CLR REP3F

MOV DPL,REP3L

MOV DPH,REP3H

RET

CMPA3: CJNE A,#03H,REPRET

MOV A,R7

SWAP A

ANL A,#0FH

JNZ H4VS1

SETB REP0F

MOV REP0L,DPL

MOV REP0H,DPH

SJMP SREPHAD

H4VS1: CJNE A,#01H,H4VS2

SETB REP1F

MOV REP1L,DPL

MOV REP1H,DPH

SJMP SREPHAD

H4VS2: CJNE A,#02H,H4VS3

SETB REP2F

MOV REP2L,DPL

MOV REP2H,DPH

SJMP SREPHAD

H4VS3: CJNE A,#03H,REPRET

SETB REP3F

MOV REP3L,DPL

MOV REP3H,DPH

SREPHAD: MOV 09H,A

LCALL CSDPTR

REPGON: INC DPTR

INC DPTR

LCALL RYFSUP

CJNE R6,#0FFH,REPGON

MOV A,R7

SWAP A

ANL A,#0FH

CJNE A,09H,REPGON

REPRET: RET

;13.音符顯示子程序

;---------YFDSUP(13)--------

YFDSUP: MOV A,STATU

JNZ YFDRET

JB SECHSTOF,YFDRET

JNB CUYFD,YFSLED

XZFCLD: MOV DISNUM0,#20H

MOV DISNUM1,#20H

SJMP YFDSPLAY

YFSLED: MOV A,R6

JZ XZFCLD

ANL A,#0FH

PUSH DPL

PUSH DPH

MOV DPTR,#T_YFDCOD

MOVC A,@A DPTR

MOV DISNUM0,A

POP DPH

POP DPL

MOV A,R6

SWAP A

ANL A,#0FH

MOV DISNUM1,A

YFDSPLAY: LCALL DISPLAY

YFDRET: RET

T_YFDCOD: DB 20H ;--

DB 01H ; 1

DB 02H ; 2

DB 03H ; 3

DB 04H ; 4

DB 05H ; 5

DB 06H ; 6

DB 07H ; 7

DB 11H ;#1

DB 12H ;#2

DB 14H ;#4

DB 15H ;#5

DB 16H ;#6

;14.唱音符子程序

;---------PLAY(14)----------

PLAY: MOV A,R6

JZ PCOSPECL

PUSH DPL

PUSH DPH

MOV DPTR,#T_SD

ANL A,#0FH

MOVC A,@A DPTR

XCH A,R6

SWAP A

ANL A,#0FH

MOV B,#12

MUL AB

ADD A,R6

ADD A,R2

RL A

MOV R6,A

MOV DPTR,#T_RAN

MOVC A,@A DPTR

MOV TH0,A

MOV R5,A

MOV A,R6

INC A

MOVC A,@A DPTR

MOV TL0,A

MOV R4,A

POP DPH

POP DPL

SETB TR0

PCOSPECL: LCALL COSPECL

PJPWAIT: MOV JPCLK,#00H

PDELAY: LCALL KCXCL

JB NEXTSF,PRET

MOV A,JPCLK

CJNE A,01H,PNEXT

PNEXT: JC PDELAY

DJNZ R7,PJPWAIT

PRET: CLR TR0

RET

;---------TABSD-------------

T_SD: DB 01h ;useless

DB 01H

DB 03H

DB 05H

DB 06H

DB 08H

DB 0AH

DB 0CH

DB 02H

DB 04H

DB 07H

DB 09H

DB 0bH

;---------TABRAN------------

T_RAN: DW 0F111H ;useless

dw 0f111h ; area 0

dw 0f1e8h

dw 0f2b2h

dw 0f373h

dw 0f426h

dw 0f4eeh

dw 0f571h

dw 0f609h

dw 0f699h

dw 0f71fh

dw 0f79fh

dw 0f817h

dw 0f889h ; area 1

dw 0f8f4h

dw 0f95ah

dw 0f9b9h

dw 0fa13h

dw 0fa68h

dw 0fab9h

dw 0fb04h

dw 0fb4ch

dw 0fb90h

dw 0fbcfh

dw 0fc0ch

dw 0fc45h ;area 2

dw 0fc7ah

dw 0fcadh

dw 0fcdch

dw 0fd0ah

dw 0fd34h

dw 0fd5ch

dw 0fd82h

dw 0fda6h

dw 0fdc8h

dw 0fde8h

dw 0fe06h

dw 0fe22h ; area 3

dw 0fe3dh

dw 0fe56h

dw 0fe6eh

dw 0fe85h

dw 0fe9ah

dw 0feaeh

dw 0fec1h

dw 0fed3h

dw 0fee3h

dw 0fef4h

dw 0ff02h

dw 0ff11h ;area 4

dw 0ff1fh

dw 0ff2bh

dw 0ff37h

dw 0ff42h

dw 0ff4dh

dw 0ff57h

dw 0ff60h

dw 0ff6ah

dw 0ff72h

dw 0ff7ah

dw 0ff81h

dw 0ff89h ; 5

;15.共速處理

;---------COSPECL(15)-------

COSPECL: MOV R1,03H

MOV A,COSPEEDN

JZ COSPRET

PUSH COSPEEDN

MOV A,R1

COSPEGON: MOV B,#08H

MUL AB

CLR C

SUBB A,R1

JNC COSPNEXT

DEC B

COSPNEXT: MOV R6,#03H

DIV8: CLR C

XCH A,B

RRC A

XCH A,B

RRC A

DJNZ R6,DIV8

MOV R1,A

DJNZ COSPEEDN,COSPEGON

POP COSPEEDN

MOV A,R1

JNZ COSPRET

MOV R1,#01H

COSPRET: RET

;16.鍵盤(pán)查詢處理

;---------KCXCL(16)---------

KCXCL: LCALL KSET

LCALL KALT0

LCALL KALT1

JNB KSETF,KNEXT0

LCALL KSETCL

KSETSTC: MOV SETST0,#00H

MOV SETST1,#00H

SETB KBDISF

SJMP KDIS

KNEXT0: JNB KALT0F,KNEXT1

LCALL KALT0CL

SJMP KSETSTC

KNEXT1: JNB KALT1F,KDIS

LCALL KALT1CL

SJMP KSETSTC

KDIS: MOV A,STATU

JNZ KSSNSD

JNB SECHSTOF,KRET

KSSNSD: JNB KBDISF,KRET

CLR KBDISF

LCALL DISPLAY

KRET: RET

;17.KSET鍵是否按下查詢

;---------KSET(17)----------

KSET: SETB SET

JB SET,CSETRET

MOV GENCLK,#00H

SETLOP: MOV A,GENCLK

CJNE A,#02,SETLOP

SETB SET

JB SET,CSETRET

CLR TR0

SETWAIT: SETB SET

JNB SET,SETWAIT

MOV GENCLK,#00H

SETLOP1: MOV A,GENCLK

CJNE A,#02,SETLOP1

SETB TR0

SETB KSETF

RET

CSETRET: CLR KSETF

RET

;18.KALT0鍵是否按下查詢

;---------KALT0(18)---------

KALT0: SETB ALT0

JB ALT0,CALT0RET

MOV GENCLK,#00H

ALT0LOP: MOV A,GENCLK

CJNE A,#02,ALT0LOP

SETB ALT0

JB ALT0,CALT0RET

CLR TR0

ALT0WAIT: SETB ALT0

JNB ALT0,ALT0WAIT

MOV GENCLK,#00H

ALT0LOP1: MOV A,GENCLK

CJNE A,#02,ALT0LOP1

SETB TR0

SETB KALT0F

RET

CALT0RET: CLR KALT0F

RET

;19.KALT1鍵是否按下查詢

;---------KALT1(19)---------

KALT1: SETB ALT1

JB ALT1,CALT1RET

MOV GENCLK,#00H

ALT1LOP: MOV A,GENCLK

CJNE A,#02,ALT1LOP

SETB ALT1

JB ALT1,CALT1RET

CLR TR0

ALT1WAIT: SETB ALT1

JNB ALT1,ALT1WAIT

MOV GENCLK,#00H

ALT1LOP1: MOV A,GENCLK

CJNE A,#02,ALT1LOP1

SETB TR0

SETB KALT1F

RET

CALT1RET: CLR KALT1F

RET

;20.SET鍵處理

;---------KSETCL(20)--------

KSETCL: INC STATU

MOV A,STATU

CJNE A,#07H,STATUDIS

MOV STATU,#00H

STATUDIS: MOV DISNUM0,#23H

MOV DISNUM1,STATU

RET

;21.KALT0鍵處理

;---------KALT0CL(21)-------

KALT0CL: MOV A,STATU

JNZ CASEB1

KA0S0GO: INC DPTR

INC DPTR

LCALL RYFSUP

MOV A,R7

JNZ EQUFF

MOV DPTR,#T_SONGS

SJMP KA0NEXT

EQUFF: INC A

JNZ KA0S0GO

KA0NEXT: LCALL RYFSUP

MOV CSN,R6

LCALL CSNSDISN

MOV A,DPL

CLR C

SUBB A,#02H

JNC KA0NEXT1

DEC DPH

KA0NEXT1: MOV DPL,A

CLR REP0F

CLR REP1F

CLR REP2F

CLR REP3F

SETB NEXTSF

SETB SECHSTOF

RET

CASEB1: CJNE A,#01H,CASEB2

INC LDYDSR

MOV A,LDYDSR

CJNE A,#04H,LDYDSL4

MOV LDYDSR,#00H

LDYDSL4: MOV DISNUM0,LDYDSR

MOV DISNUM1,#26H

RET

HCOSPEEDN EQU 12H

CASEB2: CJNE A,#02H,CASEB3

MOV A,COSPEEDN

CJNE A,#HCOSPEEDN,KA0NEXT4

KA0NEXT4: JNC KA0NEXT5

INC COSPEEDN

KA0NEXT5: MOV SPENR,COSPEEDN

LCALL SPENSDISN

RET

CASEB3: CJNE A,#03H,CASEB4

CLR SPEEDF

LCALL SPEEDCL

RET

CASEB4: CJNE A,#04H,CASEB5

CLR TONEF

LCALL TONECL

RET

CASEB5: CJNE A,#05H,CASEB6

CPL LOCF

JNB LOCF,KA0NEXT2

MOV DISNUM0,#24H

SJMP KA0NEXT3

KA0NEXT2: MOV DISNUM0,#25H

KA0NEXT3: MOV DISNUM1,#26H

RET

CASEB6: CJNE A,#06H,KA0RET

CPL CUYFD

JNB CUYFD,KA0NEXT6

MOV DISNUM0,#24H

SJMP KA0NEXT7

KA0NEXT6: MOV DISNUM0,#25H

KA0NEXT7: MOV DISNUM1,#28H

KA0RET: RET

;22.速度數(shù)送顯示寄存器

;---------SPENSDISN(22)----

SPENSDISN:MOV A,SPENR

ANL A,#0FH

MOV DISNUM0,A

MOV A,SPENR

SWAP A

ANL A,#0FH

MOV DISNUM1,A

RET

;23.速度處理

;---------SPEEDCL(23)------

HSPEED EQU 02H;

LSPEED EQU 50H;

SPEEDCL: JB SPEEDF,DNSPEED

CJNE R3,#HSPEED,SCLNEXT

SCLNEXT: JC SCLNEXT1

DEC R3

SJMP SCLNEXT1

DNSPEED:

CJNE R3,#LSPEED,SCLNEXT2

SCLNEXT2: JNC SCLNEXT1

INC R3

SCLNEXT1: LCALL CSBESTOJG

JNB CSBESTOF,SCLNEXT3

INC R0

INC R0

MOV @R0,03H

SCLNEXT3: LCALL COSPECL

MOV SPENR,R1

LCALL SPENSDISN

RET

;24.音調(diào)處理

;---------TONECL(24)---------

;LTONE EQU 00 ;C

HTONE EQU 11 ;B

TONECL: JB TONEF,DNTONE

CJNE R2,#HTONE,TCLNEXT0

TCLNEXT0: JNC TCLNEXT

INC R2

SJMP TCLNEXT

DNTONE: MOV A,R2

JZ TCLNEXT

DEC R2

TCLNEXT: LCALL CSBESTOJG

JNB CSBESTOF,TCLNEXT1

INC R0

MOV @R0,02H

TCLNEXT1: PUSH DPL

PUSH DPH

MOV DPTR,#T_TONDISC

MOV A,R2

RL A

MOVC A,@A DPTR

MOV DISNUM1,A

MOV A,R2

RL A

INC A

MOVC A,@A DPTR

MOV DISNUM0,A

POP DPH

POP DPL

RET

T_TONDISC:DW 200CH ; C

DW 210CH ;#C

DW 200DH ; D

DW 210DH ;#D

DW 200EH ; E

DW 200FH ; F

DW 210FH ;#F

DW 2022H ; G

DW 2122H ;#G

DW 200AH ; A

DW 210AH ;#A

DW 200BH ; B

;25.KALT1鍵處理

;---------KALT1CL(25)--------

KALT1CL: MOV A,STATU

JNZ CASE1

LCALL CSBESTOJG

JNB CSBESTOF,KA1NEXT

MOV @R0,#00H

DEC BUFF0

SJMP KA1NEXT2

KA1NEXT: CJNE R0,#7EH,KA1NEXT1

KA1NEXT1: JNC KA1NEXT2

MOV @R0,CSN

INC R0

MOV @R0,02H

INC R0

MOV @R0,03H

INC BUFF0

KA1NEXT2: LCALL CSNSDISN

SETB SECHSTOF

RET

CASE1: CJNE A,#01H,CASE2

INC RDYDSR

MOV A,RDYDSR

CJNE A,#04H,RDYDSL4

MOV RDYDSR,#00H

RDYDSL4: MOV DISNUM0,RDYDSR

MOV DISNUM1,#27H

RET

CASE2: CJNE A,#02H,CASE3

MOV A,COSPEEDN

JZ KA1NEXT5

DEC COSPEEDN

KA1NEXT5: MOV SPENR,COSPEEDN

LCALL SPENSDISN

RET

CASE3: CJNE A,#03H,CASE4

SETB SPEEDF

LCALL SPEEDCL

RET

CASE4: CJNE A,#04H,CASE5

SETB TONEF

LCALL TONECL

RET

CASE5: CJNE A,#05H,CASE6

CPL ROCF

JNB ROCF,KA1NEXT3

MOV DISNUM0,#24H

SJMP KA1NEXT4

KA1NEXT3: MOV DISNUM0,#25H

KA1NEXT4: MOV DISNUM1,#27H

RET

CASE6: CJNE A,#06H,KA1RET

MOV DISNUM0,#23H

MOV DISNUM1,#06H

KA1RET: RET

;========= 樂(lè)曲表============

;---------SONGS--------------

T_SONGS: 樂(lè)曲表表首

dw 01ffh,;song1:xiao la ba.。.

dw 0b05h,

dw 2504h,

dw 2604h,

dw 2506h,

dw 0002h,

dw 2504h,

dw 2604h,

dw 2506h,

dw 0002h,

dw 2504h,

dw 2604h,

dw 2504h,

dw 2304h,

dw 2204h,

dw 2104h,

dw 2206h,

DW 16FFH;SONG16:Liang Zhi Lao Hu

DW 0715H

DW 0FF21H ;REP21

DW 0FF01H ;REP01

DW 2102H

DW 2202H

DW 2302H

DW 2102H

DW 0FF02H ;REP02

DW 0FF03H ;REP03

DW 2302H

DW 2402H

DW 2504H

DW 2302H

DW 2402H

DW 2504H

DW 0FF11H ;REP11

DW 2501H

DW 2601H

DW 2501H

DW 2401H

DW 2302H

DW 2102H

DW 0FF12H ;REP12

DW 0FF13H ;REP13

DW 2202H

DW 1502H

DW 2104H

DW 2202H

DW 1502H

DW 2104H

DW 0FF22H ;REP22

DW 0FF23H ;REP23

DW 0000H ;樂(lè)曲表表尾

END

;=========END================

注:設(shè)計(jì)者手頭有近40首曲子的音樂(lè)數(shù)據(jù)(花了大量時(shí)間對(duì)簡(jiǎn)譜進(jìn)行手工轉(zhuǎn)換?。?,而每塊

AT89C51的4KROM種除指令外剩下空間只可放14首左右。

這里給出第一曲和第16曲《兩只老虎》作一示例。

1. 單片機(jī)的基本發(fā)音實(shí)驗(yàn)

我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來(lái)控制單處機(jī)某個(gè)口線的“高”電平或低電平,則在該口線上就能產(chǎn)生一定頻率的矩形波,接上喇叭就能發(fā)出一定頻率的聲音,若再利用延時(shí)程序控制“高”“低”電平的持續(xù)時(shí)間,就能改變輸出頻率,從而改變音調(diào)。

例如,要產(chǎn)生200HZ的音頻信號(hào),按圖1接入喇叭(若屬臨時(shí)實(shí)驗(yàn),也可將喇叭直接接在P1口線上),實(shí)驗(yàn)程序?yàn)椋?/p>

其中子程序DEL為延時(shí)子程序,當(dāng)R3為1時(shí),延時(shí)時(shí)間約為20us,R3中存放延時(shí)常數(shù),對(duì)200HZ音頻,其周期為1/200秒,即5ms。這樣,當(dāng)P1.4的高電平或低電平的持續(xù)時(shí)間為2.5ms,即R3的時(shí)間常數(shù)取2500/20=125(7DH)時(shí),就能發(fā)出200HZ的音調(diào)。將上述程序鍵入學(xué)習(xí)機(jī),并不斷修改R3的常數(shù)可以感到音調(diào)的變化。

樂(lè)曲中,每一音符對(duì)應(yīng)著確定的頻率,表1給出C調(diào)時(shí)各音符頻率及其相應(yīng)的時(shí)間常數(shù)。

讀者可以根據(jù)表1所提供的常數(shù),將其16進(jìn)制代碼送入R3,反復(fù)練習(xí)體會(huì)。根據(jù)表1可以奏出音符。僅這還不夠,要準(zhǔn)確奏出一首曲子,必須準(zhǔn)確地控制樂(lè)曲節(jié)奏,即一音符的持續(xù)時(shí)間。

音符的節(jié)拍我們可以用定時(shí)器T0來(lái)控制,送入不同的初值,就可以產(chǎn)生不同的定時(shí)時(shí)間。便如某歌曲的節(jié)奏為每分鐘94拍,即一拍為0.64秒。其它節(jié)拍與時(shí)間的對(duì)應(yīng)關(guān)系見(jiàn)表2。

但時(shí),由于T0的最大定時(shí)時(shí)間只能為131毫秒,因此不可能直接用改變T0的時(shí)間初值來(lái)實(shí)現(xiàn)不同節(jié)拍。我們可以用T0來(lái)產(chǎn)生10毫秒的時(shí)間基準(zhǔn),然后設(shè)置一個(gè)中斷計(jì)數(shù)器,通過(guò)判別中斷計(jì)數(shù)器的值來(lái)控制節(jié)拍時(shí)間的長(zhǎng)短。表2中也給出了各種節(jié)拍所對(duì)應(yīng)的時(shí)間常數(shù)。例如對(duì)1/4拍音符,定時(shí)時(shí)間為0.16秒,相應(yīng)的時(shí)間常數(shù)為16(即10H);對(duì)3拍音符,定時(shí)時(shí)間為1.92秒,相應(yīng)時(shí)間長(zhǎng)數(shù)為192(即C0H)。

我們將每一音符的時(shí)間常數(shù)和其相應(yīng)的節(jié)拍常數(shù)作為一組,按順序?qū)?lè)曲中的所有常數(shù)排列成一個(gè)表,然后由查表程序依次取出,產(chǎn)生音符并控制節(jié)奏,就可以實(shí)現(xiàn)演奏效果。

此外,結(jié)束符和體止符可以分別用代碼00H和FFH來(lái)表示,若查表結(jié)果為00H,則表示曲子終了;若查表結(jié)果為FFH,則產(chǎn)生相應(yīng)的停頓效果。

為了產(chǎn)生手彈的節(jié)奏感,在某些音符(例如兩個(gè)相同音符)音插入一個(gè)時(shí)間單位的頻率略有不同的音符。

程序框圖如圖2所示。

下面給出程序序請(qǐng)單,可直接在TD-III型學(xué)習(xí)機(jī)上演奏,對(duì)其它不同型號(hào)的學(xué)習(xí)機(jī),只需相應(yīng)地改變一下地址即可。本程序演奏的是民歌“八月桂花遍地開(kāi)”,C調(diào),節(jié)奏為94拍/分。讀者也可以自行找出一首歌,按表1和表2給定的常數(shù),將樂(lè)曲翻譯成碼表輸入機(jī)器,而程序不變。本實(shí)驗(yàn)方法簡(jiǎn)便,即使不懂音樂(lè)的人,將一首陌生的曲子翻譯成代碼也是易事,和著機(jī)器的演奏學(xué)唱一首歌曲,其趣味無(wú)窮。

硬件連接說(shuō)明:

隨便找一個(gè)仿真機(jī)或者什么單片機(jī)實(shí)驗(yàn)板,只要能工作的就行,將程序輸入,運(yùn)行,然后找個(gè)音箱(你計(jì)算機(jī)旁邊應(yīng)當(dāng)就有一對(duì)吧)撥出插頭,插頭的前端接在P1。0上,后面部分找根線接單片機(jī)的地,就應(yīng)當(dāng)有聲了,然后怎么改進(jìn)硬件連接就是你的事了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 頻率
    +關(guān)注

    關(guān)注

    4

    文章

    1585

    瀏覽量

    62077
  • 51單片機(jī)
    +關(guān)注

    關(guān)注

    278

    文章

    5714

    瀏覽量

    134368
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3368

    瀏覽量

    123662
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    學(xué)習(xí)單片機(jī)快速方法

    學(xué)習(xí)單片機(jī)的快速方法 先介紹下單片機(jī)。把單片機(jī)說(shuō)成是電子信息類專業(yè)最重要的一門(mén)課程一點(diǎn)也不為過(guò),你在街上看到的廣告彩燈、煙花表演、紅綠燈、自動(dòng)開(kāi)關(guān)門(mén)這些都可以用單片機(jī)
    發(fā)表于 01-14 07:42

    51單片機(jī)RS485編程實(shí)例資料

    詳細(xì)介紹51單片機(jī)RS485通信接線和編程代碼
    發(fā)表于 10-20 14:57 ?4次下載

    單片機(jī)怎么燒程序

    單片機(jī)程序是將編寫(xiě)好的程序代碼寫(xiě)入單片機(jī)內(nèi)部存儲(chǔ)單元,讓單片機(jī)按照預(yù)設(shè)邏輯工作的過(guò)程,是單片機(jī)
    的頭像 發(fā)表于 07-23 11:47 ?1311次閱讀

    AT89C51 單片機(jī)中文資料

    電子發(fā)燒友網(wǎng)站提供《AT89C51 單片機(jī)中文資料.pdf》資料免費(fèi)下載
    發(fā)表于 06-24 15:29 ?1次下載

    單片機(jī)原理及應(yīng)用

    本書(shū)全面系統(tǒng)地介紹了 MCS-51 系列單片機(jī)的基本結(jié)構(gòu)、工作原理及應(yīng)用技術(shù)。主要內(nèi)容包括:微型計(jì)算機(jī)的基礎(chǔ)知識(shí)、MCS-51 單片機(jī)的基本結(jié)構(gòu)、匯編語(yǔ)言和 C
    發(fā)表于 06-16 16:58

    圖解單片機(jī)功能與應(yīng)用(完整版)

    從基礎(chǔ)知識(shí)的介紹出發(fā),圖文并茂,直觀、系統(tǒng)地介紹了單片機(jī)的內(nèi)部結(jié)構(gòu)、工作原理和應(yīng)用技巧。全書(shū)分為10章,內(nèi)容包括51單片機(jī)編程資源圖解、51單片機(jī)
    發(fā)表于 06-16 16:52

    STC單片機(jī)范例程序

    電子發(fā)燒友網(wǎng)站提供《STC單片機(jī)范例程序.zip》資料免費(fèi)下載
    發(fā)表于 06-04 16:27 ?10次下載

    2.4寸TFT彩屏配套測(cè)試程序-51單片機(jī)

    如題,2.4寸TFT彩屏配套測(cè)試程序-51單片機(jī)
    發(fā)表于 06-04 16:26 ?0次下載

    C51單片機(jī)及C語(yǔ)言知識(shí)點(diǎn)必備秘籍

    設(shè)計(jì) 26:單片機(jī)矩陣式鍵盤(pán)接口技術(shù)及 27:關(guān)于單片機(jī)的一些基本概念 28:實(shí)際案例實(shí)踐——單片機(jī)音樂(lè)程序設(shè)計(jì) 純分享貼,有需要可以直接下載附件獲取完整
    發(fā)表于 05-15 14:00

    基于51單片機(jī)的溫濕度檢測(cè)與調(diào)節(jié)系統(tǒng)電路圖

    電子發(fā)燒友網(wǎng)站提供《基于51單片機(jī)的溫濕度檢測(cè)與調(diào)節(jié)系統(tǒng)電路圖》資料免費(fèi)下載
    發(fā)表于 05-12 17:23 ?1次下載

    51+單片機(jī)TCP-IP+協(xié)議棧ZLIP源碼

    概述 單片機(jī)上網(wǎng)技術(shù),是當(dāng)前的一個(gè)熱門(mén)技術(shù)。單片機(jī)上網(wǎng)技術(shù)中的一個(gè)重要部分是在單片實(shí)現(xiàn) TCP/IP 協(xié)議?!,F(xiàn)在可獲得的 TCP/IP
    發(fā)表于 04-22 15:11

    新概念51單片機(jī)C語(yǔ)言教程入門(mén)、提高、開(kāi)發(fā)、拓展全攻略

    資料介紹 從實(shí)際應(yīng)用入手,以實(shí)驗(yàn)過(guò)程和實(shí)驗(yàn)現(xiàn)象為主導(dǎo),循序漸進(jìn)地講述51單片機(jī)C語(yǔ)言編程方法以及51單片機(jī)的硬件結(jié)構(gòu)和功能應(yīng)用。全書(shū)共分5篇
    發(fā)表于 04-15 13:57

    基于51/32單片機(jī)按鍵控制步進(jìn)電機(jī)正反轉(zhuǎn),A4988驅(qū)動(dòng)

    基于51/32單片機(jī)按鍵控制步進(jìn)電機(jī)正反轉(zhuǎn),A4988驅(qū)動(dòng)
    發(fā)表于 04-14 15:05 ?7次下載

    基于51單片機(jī)PWM直流電機(jī)調(diào)速程序 0到20級(jí)的調(diào)速

    基于51單片機(jī)PWM直流電機(jī)調(diào)速程序 0到20級(jí)的調(diào)速,代碼有中文詳細(xì)注解,通俗易懂,不愧是初學(xué)者福利??梢钥吹贸鲎髡哒娴暮苡眯?這也讓我們學(xué)習(xí)單片機(jī)基礎(chǔ)更加的容易理解。 純分享貼,有
    發(fā)表于 03-20 13:44

    單片機(jī)C語(yǔ)言編程寶典大全,初學(xué)必備【強(qiáng)推下載!】

    資料介紹:包含 1. 51單片機(jī)入門(mén)教程 2. 初學(xué)者適用:單片機(jī)C語(yǔ)言實(shí)例100例(代碼及釋義) 3. 51
    發(fā)表于 03-14 11:03