编辑导读:PIC8位单片机程序举例及应用说明|PIC16C54单片机在消毒柜中的应用|普通I/O口实现测量可调电阻,调节LED的闪烁频率!|基于PIC16F877A自动太阳跟踪器的设计|PIC子程序库-按键唤醒|常用PIC系列8位单片机芯片引脚符号的功能|超低功耗单片机MSP430F413实现的智能遥控器设计|MPS430JTAG仿真器电路图|第一章 PIC12C5XX功能原理|计算法简单实现crc校验|
正文:
;**************************************************************;* 描述: ;1.通过驱动实验板上的蜂鸣器发声,实现音乐的播放。;2.从TABLE中取出播放音乐的音调(1、2....7)通过改变该表中的值即可实现播放不同的音乐。;3.从TABLE_YP中取出播放音乐的音频,即该音调持续的时间。;4.调整DELAY延时的长短即可实现音乐播放的快慢 ;*************************************************************;*********************************** LIST P=PIC16F877,R=DEC #INCLUDE P16F877.INC;*********************************** Errorlevel -302,-305 __CONFIG _DEBUG_OFF&_CP_ALL&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC;;***********************************寄存器定义 CBLOCK 0x20 JP YP L1 L2 TA:2 COUNT1 COUNT2 W_STACK ST_STACK ENDC;************************************ ORG 0X0000 nop ;放置一条MCD所必须的空指令 GOTO MAIN ;主程序 ORG 0x0004 BTFSC PIR1,TMR1IF ;中断子程序 GOTO T1 ;转T1处理 RETFIE ORG 0x0010;************************************MAIN CLRWDT ;喂狗 BCF STATUS,RP0 CLRF INTCON ;清除其他中断标志位 MOVLW 08H ; MOVWF PORTD ; CLRF PIR1 ;清除TMR1中断标志位 BSF STATUS,RP0 BSF PIE1,0 ;使能TMR1中断 MOVLW 00H ; MOVWF TRISD ; BCF STATUS,RP0 MOVLW 0xC0 ;开启中断总允许位GIE跟PEIE MOVWF INTCONREPLAY CLRF COUNT1 ;从头开始查表(亦即从头开始唱歌)SING CLRF TMR1L CLRF TMR1H ;清零TMR1定器 MOVF COUNT1,0 CALL TABLE MOVWF COUNT2 ;暂存查表结果于COUNT2中 BCF STATUS,Z SUBLW 0x00 ;判断是否查表到最后一个数值 BTFSC STATUS,Z GOTO REPLAY ;是,说明音乐播放完成,重头开始播放 MOVF COUNT2,0 ANDLW 0x0F ;去掉高4位只保留低4位 MOVWF JP ;保存到JP中 SWAPF COUNT2,0 ;高低半字节交换 ANDLW 0x0F ;去掉高4位只保留低4位 MOVWF YP ;保存到YP中,这样查表的结果的被分成高低半字节两部分分别存放在YP跟JP中 DECF YP,1 MOVF YP,0 CALL TABLE_YP MOVWF TMR1H ;作为TMR1初值的高8位 MOVWF TA ;暂存TA中 INCF YP,0 CALL TABLE_YP MOVWF TMR1L ;作为TMR1初值的低8位 MOVWF TA+1 ;暂存TA+1中 BSF T1CON,TMR1ON ;开启TMR1定时器 CALL DELAY ;延时一段时间 INCF COUNT1 ;COUNT1加1,以便查表得到下一个播放的音调 GOTO SING ;返回播放下一个音调;**************************延时程序DELAY MOVLW 200 MOVWF L1 DELAY_1 MOVLW 225 MOVWF L2 DELAY_2 DECFSZ L2,1 GOTO DELAY_2 DECFSZ L1,1 GOTO DELAY_1 DECFSZ JP,1 GOTO DELAY CLRWDT RETURN ;*************************中断现场保护 PUSH MOVWF W_STACK ;保存W的值 MOVF STATUS,0 MOVWF ST_STACK ;保存STATUS的值 RETURN;************************中断现场恢复POP MOVF ST_STACK,0 MOVWF STATUS ;恢复STATUS的值 MOVF W_STACK,0 ;恢复W的值 RETURN;************************中断处理子程序T1 CALL PUSH ;调用现场保护程序 MOVLW 0x08 ;RD3口输出取反 XORWF PORTD,1 MOVF TA,0 MOVWF TMR1H MOVF TA+1,0 MOVWF TMR1L ;给TMR1赋初值 BSF T1CON,TMR1ON ;开启定时器 BCF PIR1,TMR1IF ;清除标志位 CALL POP ;调用现场恢复程序 RETFIETABLE_YP ADDWF PCL,1 RETLW 0xFC ;1 RETLW 0x44 RETLW 0xFC ;2 RETLW 0xAC RETLW 0xFD ;3 RETLW 0x09 RETLW 0xFD ;4 RETLW 0x34 RETLW 0xFD ;5 RETLW 0x82 RETLW 0xFD ;6 RETLW 0xC8 RETLW 0xFE ;7 RETLW 0x06 TABLE ADDWF PCL,1 RETLW 0x14 RETLW 0x34 RETLW 0x54 RETLW 0x14 RETLW 0x14 RETLW 0x34 RETLW 0x54 RETLW 0x14 RETLW 0x54 RETLW 0x74 RETLW 0x98 RETLW 0x54 RETLW 0x74 RETLW 0x98 RETLW 0x93 RETLW 0xB1 RETLW 0x93 RETLW 0x71 RETLW 0x54 RETLW 0x14 RETLW 0x93 RETLW 0xB1 RETLW 0x93 RETLW 0x71 RETLW 0x54 RETLW 0x14 RETLW 0x14 RETLW 0x94 RETLW 0x18 RETLW 0x14 RETLW 0x94 RETLW 0x18 RETLW 0x00 ;******************************************** end ;源程序结束