×
嵌入式开发 > 详情

PIC单片机实现音乐播放


源程序:



以下程序要用二个定时器资源,凡是有二个定时器的PIC单片机均可实现,该范例需要的MCU是MICROCHIPPIC16C62

INCLUDE"D:PICP16XX.EQU";该文件在MICROCHIP光盘中可找到

;**************************************************

#defineBeepOutRC,4

;**************************************************

W_TEMPEQU0X20;(0XA0)

STATUS_TEMPEQU0X21

BeepCntequ30h

TmrBakequ31h

BeepModeequ32h

Sflagequ33h

;**************************************************

CSTIME100MSequ.8;

;**************************************************

;Sflag

Fg_100msequ0

FgBeepequ1

;**************************************************

ORG000H;

GOTOMAIN;Skipoverinterruptvecter

ORG04H;InterruptVector

GOTOINTZ



;**************************************************

OkTab:

movfBeepCnt,w

addwfPCL,f

retlw.255-.130;0xf6;1;

retlw.255-.126;0xfa;2;

retlw.255-.119;0xfd;3;

retlw0

;**************************************************

WhisleTab:

movfBeepCnt,w

addwfPCL,f

retlw.255-.239;523Hz;0;

retlw.255-.179;698Hz;1;

retlw.255-.159;784Hz;2;

retlw.255-.119;1046Hz;3;

retlw.0

;**************************************************

HangTab:

movfBeepCnt,w

addwfPCL,f

retlw.255-.159;784Hz;0;

retlw.255-.119;1046Hz;1;

retlw.255-.150;830Hz;2;

retlw.255-.112;1109Hz;3;

retlw.255-.142;880Hz;4;

retlw.255-.106;1174Hz;5;

retlw.255-.134;932Hz;6;

retlw.255-.100;1244Hz;7

retlw.255-.126;988Hz;8;

retlw.255-.94;1318Hz;9;

retlw.255-.119;1046Hz;10;

retlw.255-.89;1397Hz;11;

retlw.0



;**************************************************

WelcomTab:

movfBeepCnt,w

addwfPCL,f

retlw.255-.89;1397Hz;11;

retlw.255-.119;1046Hz;10;

retlw.255-.94;1318Hz;9;

retlw.255-.126;988Hz;8;

retlw.255-.100;1244Hz;7

retlw.255-.134;932Hz;6;

retlw.255-.106;1174Hz;5;

retlw.255-.142;880Hz;4;

retlw.255-.112;1109Hz;3;

retlw.255-.150;830Hz;2;

retlw.255-.119;1046Hz;1;

retlw.255-.159;784Hz;0;

retlw.0

;**************************************************

BeepModeJmp:

addwfPCL,f

bpsWhisle;0

bpsOk;1

bpsHang;2

bpsWelcom;3

;**************************************************

IO_SET:

BANK1_

MOVLWB’11001011’

MOVWFTRISA

MOVLWB’00001100’

movwfTRISB

MOVLWB’00000011’

movwfTRISC;SetPort_Ctoalloutputs

BANK0_

RETURN

;**************************************************

SYS_SET:

BANK1_

MOVLWB’00000111’;1:256TMR0分频

MOVWFOPTION_R

BSFPIE1,TMR2IE;TMR2中断允许

BANK0_

MOVLWB’00000001’;开TMR1

MOVWFT1CON

bsfINTCON,TOIE;TMR0中断允许

BSFINTCON,PEIE;允许所有未被屏蔽之外围接口中断

RETURN

;**************************************************

MAIN:;Mainrotation

CALLIO_SET

MOVLWB’00000000’;关所有中断

MOVWFINTCON

;****************************

CALLSYS_SET

;****************************

callPlayPsWelcom;上电提示音

MAINLOOP:

bsfINTCON,GIE;开所有中断

CLRWDT;ClearWDT

callBeepFor

BMAINLOOP

;**************************************************

INTZ:

PUSH;Push;中断服务程序

BTFSCPIR1,TMR2IF;测试TMR2中断标志位

bINT_TMR2;

BTFSCINTCON,TOIF;测试TMR0中断标志位

GOTOINT_TMR0

IntRet:

POP;Pop

RETFIE

;**************************************************

INT_TMR2:

BCFPIR1,TMR2IF;清TMR2中断标志位

movfTmrBak,w

movwfTMR2

CPLBeepOut

BeeperEnd:

bIntRet

;**************************************************

INT_TMR0:;定时0中断

BCFINTCON,TOIF;clearINTF

MOVLW.255-.38;10ms

MOVWFTMR0

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

decfszT100ms,f

bint_tmr0_ret

movlwCSTIME100MS

movwfT100ms

bsfSflag,Fg_100ms

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

int_tmr0_ret:

bIntRet

;**************************************************

PlayPsWhisle:

bsfFg,FgBeep

clrfBeepCnt

movlw.0

movwfBeepMode

movlwCSTIME100MS

movwfT100ms

retlw0

;**************************************************

PlayPsOk:

bsfFg,FgBeep

clrfBeepCnt

movlw.1

movwfBeepMode

movlwCSTIME100MS

movwfT100ms

retlw0

;**************************************************

PlayPsHang:

bsfFg,FgBeep

clrfBeepCnt

movlw.2

movwfBeepMode

movlwCSTIME100MS

movwfT100ms

retlw0

;**************************************************

PlayPsWelcom:

bsfFg,FgBeep

clrfBeepCnt

movlw.3

movwfBeepMode

movlwCSTIME100MS

movwfT100ms

retlw0

;**************************************************

;音乐播放程序

;BeepMode=0:psWhisle

;BeepMode=1:psOk

;BeepMode=2:psHang

;BeepMode=3:psWelcom

;**************************************************

BeepFor:

btfssSflag,Fg_100ms

bBeepForEnd

bcfSflag,Fg_100ms

btfssSflag,FgBeep

bBeepForEnd

MOVLWB’00000101’;开TMR21:4分频

MOVWFT2CON

movfBeepMode,w

bBeepModeJmp

psWhisle:

callWhisleTab

bBeepPlay

psOk:

callOkTab

bBeepPlay

psHang:

callHangTab

bBeepPlay

psWelcom:

callWelcomTab

bBeepPlay

BeepPlay:

incfBeepCnt,f

movwfTmrBak

movfTmrBak,f

btfscstatus,z

bBeepOff

movlw.1

xorwfTmrBak,w

btfscstatus,z

bBeepStop

bBeepForEnd

BeepOff:

clrfBeepCnt

bcfSflag,FgBeep

bcfBeepOut

bcfT2CON,TMR2ON

bBeepForEnd

BeepStop:

bcfT2CON,TMR2ON;stop

bcfBeepOut

BeepForEnd:

retlw0

;**************************************************

END



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PLC控制步进电机方法