×
单片机 > 单片机程序设计 > 详情

PIC单片机音乐播放程序

发布时间:2020-06-16 发布时间:
|

以下程序要用二个定时器资源,凡是有二个定时器的PIC 单片机 均可实现,该范例需要的MCU是MICROChip PIC16C62  
INCLUDE "D:\PIC\P16XX.EQU" ;该文件在MICROCHIP光盘中可找到  
;**************************************************  

#define BeepOut RC,4  
;**************************************************  
W_TEMP EQU 0X20 ;(0XA0)  
STATUS_TEMP EQU 0X21  
BeepCnt equ 30h  
TmrBak equ 31h  
BeepMode equ 32h  
Sflag equ 33h  
;**************************************************  
CSTIME100MS equ .8;  
;**************************************************  
;Sflag  
Fg_100ms equ 0  
FgBeep equ 1  
;**************************************************  
ORG 000H;  
GOTO MAIN ; Skip over interrupt vecter  
ORG 04H ; Interrupt Vector  
GOTO INTZ  

;**************************************************  
OkTab:  
MOV f BeepCnt,w  
addwf PCL,f  
retlw .255-.130;0xf6 ;1 ;  
retlw .255-.126;0xfa ;2 ;  
retlw .255-.119; 0xfd ;3 ;  
retlw 0  
;**************************************************  
WhisleTab:  
MOV f BeepCnt,w  
addwf PCL,f  
retlw .255-.239;523Hz ;0 ;  
retlw .255-.179;698Hz ;1 ;  
retlw .255-.159;784Hz ;2 ;  
retlw .255-.119;1046Hz ;3 ;  
retlw .0  
;**************************************************  
HangTab:  
MOV f BeepCnt,w  
addwf PCL,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:  
MOV f BeepCnt,w  
addwf PCL,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:  
addwf PCL,f  
b psWhisle ;0  
b psOk ;1  
b psHang ;2  
b psWelcom ;3  
;**************************************************  
IO_SET:  
BANK1_  
MOV LW B’11001011’  
MOV WF TRISA  
MOV LW B’00001100’  
MOV wf TRISB  
MOV LW B’00000011’  
MOV wf TRISC ; Set Port_C to all outputs  
BANK0_  
RETURN  
;**************************************************  
SYS_SET:  
BANK1_  
MOV LW B’00000111’ ; 1:256 TMR0分频  
MOV WF OPTION_R  
BSF PIE1,TMR2IE ;TMR2中断允许  
BANK0_  
MOV LW B’00000001’ ;开TMR1  
MOV WF T1CON  
bsf INTCON,TOIE ;TMR0中断允许  
BSF INTCON,PEIE ;允许所有未被屏蔽之外围接口中断  
RETURN  
;**************************************************  
MAIN: ; Main rotation  
CALL IO_SET  
MOV LW B’00000000’ ;关所有中断  
MOV WF INTCON  
;****************************  
CALL SYS_SET  
;****************************  
call PlayPsWelcom ;上电提示音  
MAINLOOP:  
bsf INTCON,GIE ;开所有中断  
CLRWDT ; Clear WDT  
call BeepFor  
B MAINLOOP  
;**************************************************  
INTZ:  
PUSH ; Push ;中断服务程序  
BTFSC PIR1,TMR2IF ;测试TMR2中断标志位  
b INT_TMR2 ;  
BTFSC INTCON,TOIF ;测试TMR0中断标志位  
GOTO INT_TMR0  
IntRet:  
POP ; Pop  
RETFIE  
;**************************************************  
INT_TMR2:  
BCF PIR1,TMR2IF ;清TMR2中断标志位  
MOV f TmrBak,w  
MOV wf TMR2  
CPL BeepOut  
BeeperEnd:  
b IntRet  
;**************************************************  
INT_TMR0: ;定时0中断  
BCF INTCON,TOIF ; clear INTF  
MOV LW .255-.38 ;10ms  
MOV WF TMR0  
;====================  
decfsz T100ms,f  
b int_tmr0_ret  
MOV lw CSTIME100MS  
MOV wf T100ms  
bsf Sflag,Fg_100ms  
;=====================  
int_tmr0_ret:  
b IntRet  
;**************************************************  
PlayPsWhisle:  
bsf Fg,FgBeep  
clrf BeepCnt  
MOV lw .0  
MOV wf BeepMode  
MOV lw CSTIME100MS  
MOV wf T100ms  
retlw 0  
;**************************************************  
PlayPsOk:  
bsf Fg,FgBeep  
clrf BeepCnt  
MOV lw .1  
MOV wf BeepMode  
MOV lw CSTIME100MS  
MOV wf T100ms  
retlw 0  
;**************************************************  
PlayPsHang:  
bsf Fg,FgBeep  
clrf BeepCnt  
MOV lw .2  
MOV wf BeepMode  
MOV lw CSTIME100MS  
MOV wf T100ms  
retlw 0  
;**************************************************  
PlayPsWelcom:  
bsf Fg,FgBeep  
clrf BeepCnt  
MOV lw .3  
MOV wf BeepMode  
MOV lw CSTIME100MS  
MOV wf T100ms  
retlw 0  
;**************************************************  
;音乐播放程序  
;BeepMode=0 : psWhisle  
;BeepMode=1 : psOk  
;BeepMode=2 : psHang  
;BeepMode=3 : psWelcom  
;**************************************************  
BeepFor:  
btfss Sflag,Fg_100ms  
b BeepForEnd  
bcf Sflag,Fg_100ms  
btfss Sflag,FgBeep  
b BeepForEnd  
MOV LW B’00000101’ ;开TMR2 1:4分频  
MOV WF T2CON  
MOV f BeepMode,w  
b BeepModeJmp  
psWhisle:  
call WhisleTab  
b BeepPlay  
psOk:  
call OkTab  
b BeepPlay  
psHang:  
call HangTab  
b BeepPlay  
psWelcom:  
call WelcomTab  
b BeepPlay  
BeepPlay:  
incf BeepCnt,f  
MOV wf TmrBak  
MOV f TmrBak,f  
btfsc status,z  
b BeepOff  
MOV lw .1  
xorwf TmrBak,w  
btfsc status,z  
b BeepStop  
b BeepForEnd  
BeepOff:  
clrf BeepCnt  
bcf Sflag,FgBeep  
bcf BeepOut  
bcf T2CON,TMR2ON  
b BeepForEnd  
BeepStop:  
bcf T2CON,TMR2ON ;stop  
bcf BeepOut  
BeepForEnd:  
retlw 0  
;**************************************************  
END


关键字:PIC单片机  音乐播放 

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

热门文章 更多
LCD驱动-JZ2440