用PIC单片机实现音乐播放的实例程序

发布者:mlgb999最新更新时间:2011-09-24 关键字:PIC单片机  音乐播放 手机看文章 扫描二维码
随时随地手机看文章

PIC单片机实现音乐播放的实例程序
********************************
*   PIC单片机实现音乐播放      *
********************************

 源程序:

 以下程序要用二个定时器资源,凡是有二个定时器的PIC单片机均可实现,该范例需要的MCU是MICROCHIP PIC16C62
 INCLUDE "D:PICP16XX.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:
    movf BeepCnt,w
    addwf PCL,f
    retlw .255-.130;0xf6 ;1 ;
    retlw .255-.126;0xfa ;2 ;
    retlw .255-.119; 0xfd ;3 ;
    retlw 0
;**************************************************
WhisleTab:
    movf 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:
    movf 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:
    movf 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_
    MOVLW B'11001011'
    MOVWF TRISA
    MOVLW B'00001100'
    movwf TRISB
    MOVLW B'00000011'
    movwf TRISC ; Set Port_C to all outputs
    BANK0_
    RETURN
;**************************************************
SYS_SET:
    BANK1_
    MOVLW B'00000111' ; 1:256 TMR0分频
    MOVWF OPTION_R
    BSF PIE1,TMR2IE ;TMR2中断允许
    BANK0_
    MOVLW B'00000001' ;开TMR1
    MOVWF T1CON
    bsf INTCON,TOIE ;TMR0中断允许
    BSF INTCON,PEIE ;允许所有未被屏蔽之外围接口中断
    RETURN
;**************************************************
MAIN: ; Main rotation
    CALL IO_SET
    MOVLW B'00000000' ;关所有中断
    MOVWF INTCON
;****************************
    CALL SYS_SET
;****************************
    call PlayPsWelcom ;上电提示音
MAINLOOP:
    bsf INTCON,GIE ;开所有中断
    CLRWDT ; Clear WDT
    call BeepFor
    B MAINLOOP
;**************************************************[page]

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中断标志位
    movf TmrBak,w
    movwf TMR2
    CPL BeepOut
BeeperEnd:
    b IntRet
;**************************************************
INT_TMR0: ;定时0中断
    BCF INTCON,TOIF ; clear INTF
    MOVLW .255-.38 ;10ms
    MOVWF TMR0
    ;====================
    decfsz T100ms,f
    b int_tmr0_ret
    movlw CSTIME100MS
    movwf T100ms
    bsf Sflag,Fg_100ms
    ;=====================
int_tmr0_ret:
    b IntRet
;**************************************************
PlayPsWhisle:
    bsf Fg,FgBeep
    clrf BeepCnt
    movlw .0
    movwf BeepMode
    movlw CSTIME100MS
    movwf T100ms
    retlw 0
;**************************************************
PlayPsOk:
    bsf Fg,FgBeep
    clrf BeepCnt
    movlw .1
    movwf BeepMode
    movlw CSTIME100MS
    movwf T100ms
    retlw 0
;**************************************************
PlayPsHang:
    bsf Fg,FgBeep
    clrf BeepCnt
    movlw .2
    movwf BeepMode
    movlw CSTIME100MS
    movwf T100ms
    retlw 0
;**************************************************
PlayPsWelcom:
    bsf Fg,FgBeep
    clrf BeepCnt
    movlw .3
    movwf BeepMode
    movlw CSTIME100MS
    movwf 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
    MOVLW B'00000101' ;开TMR2 1:4分频
    MOVWF T2CON
    movf 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
    movwf TmrBak
    movf TmrBak,f
    btfsc status,z
    b BeepOff
    movlw .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单片机  音乐播放 引用地址:用PIC单片机实现音乐播放的实例程序

上一篇:基于PIC18F1320微控制器的信号采集系统
下一篇:LM331与PIC16F73单片机的连接与驱动

推荐阅读最新更新时间:2024-03-16 12:42

如何进一步降低PIC单片机的功耗
由美国Microchip公司生产的PIC系列单片机,由于其超小型、低功耗、低成本、多品种等特点,已广泛应用于工业控制、仪器、仪表、通信、家电、玩具等领域。 功耗,在电池供电的仪器仪表中是一个重要的考虑因素。PIC16C××系列单片机本身的功耗较低(在5V,4MHz振荡频率时工作电流小于 2mA)。为进一步降低功耗,在保证满足工作要求的前提下,可采用降低工作频率的方法,工作频率的下降可大大降低功耗(如PIC16C××在 3V,32kHz下工作,其电流可减小到15μA),但较低的工作频率可能导致部分子程序(如数学计算)需占用较多的时间。在这种情况下,当单片机的振荡 方式采用RC电路形式时,可以采用中途提高工作频率的办法来解决。
[单片机]
如何进一步降低<font color='red'>PIC单片机</font>的功耗
PIC单片机的时钟模式
任何一个单片机要工作都需要一个时钟使单片机按给定的时钟节拍一步一步的执行程序。对于这样一个时钟,在PIC单片机上有多种工作配置方式,比起传统的51系列单片机,其时钟模式得到了极大的丰富,然而这给初学者带来了一定的困难。 单片机标准时钟模式:用石英晶体或陶瓷振荡器产生工作时钟,如图1所示。 图1 PIC单片机晶体振荡原理图 与普通单片机相比,PIC晶体振荡模式的最大特点是内部振荡电路放大器的增益是可调的。如图1,Rf为增益调节电阻。主要原因是不同振荡频率的晶体,为保证其可靠振荡而所需的激励功率是完全不一样的。按常规,振荡器频率越低,其所需的激励功率越小。 如果振荡器输出给晶体的激励功率不符合晶体自身的工作特性要求,可能就会有
[单片机]
PIC单片机振荡电路中怎样选择晶体?
什么是中断程序呢? 形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。在程序方面来说 当CPU在执行一个程序的时候,突然产生了中断事件CPU就去执行中断程序了,当执行完成后CPU又回来执行原先的程序。 中断事件 什么是中断事件,就是引起中断的事件。对于单片机来说这些事件是多种多样的。比如 说一个按键按下,一定的时间到了,一串数据发送完毕,或接收完一个数据。 讲到中断不得不讲讲和中断相对的 查询。其实不管是按键按下 还是 时间到,还是数据发送完毕,这些事实上都可以用查询的方式办
[单片机]
基于PIC单片机的逆变电路设计初探
随着科学技术的进步,电源质量越来越成为各种电气设备正常和良好工作的基础。电源技术领域的一个持续的研究课题即是研究作为电子信息产业命脉的电源的可靠性和稳定性。 而逆变器作为电源的核心部分,其调制技术很大程度上决定了电源输出电压的质量。目前最常用的调制技术是正弦脉宽调制(SPWM)。随着单片机的出现及其广泛应用,智能化控制方法已经逐渐替代传统的分立元件电路产生方法或是专用芯片产生方法。智能化逆变电源的优势在于它不仅能实现调制信号的输出,还为系统数据参数的监控、处理及显示提供接口。同时它与现代计算机技术更好地结合产生了故障自诊断和自我保护功能,可提高系统的稳定性。 在充分考虑工业控制成本及稳定性要求的前提下,本设计采用PIC单片
[电源管理]
基于<font color='red'>PIC单片机</font>的逆变电路设计初探
基于PIC单片机的智能充电器的设计与实现
1 引言 铅酸蓄电池是目前大容量电池的主要品种,其制造成本低、容量大、价格低廉,使用范围非常广泛。铅酸蓄电池的基本充电方式有两种:恒压充电和恒流充电。如果单独采用一种方法,比如恒流法,则在充电后期由于充电电流不变,容易使容量下降而提前报废。单独采用恒压法,充电初期电流过大,可能致使电极活性物质脱落,后期电流又过小,形成长期充电不足,影响蓄电池的使用寿命 。因此,充电器大部分都是综合采用两种方法的多阶段充电方式。近年来,先恒流、再恒压、最后恒压浮充的三阶段充电方式被逐渐接受。 目前,三阶段充电方式主要采用模拟控制的方案。虽然具有实时性好、带宽高的优点,但其硬件电路复杂,控制不灵活。为此,本文设计了一种数字控制的充电器,采用单片机
[单片机]
基于<font color='red'>PIC单片机</font>的智能充电器的设计与实现
PIC单片机的IO控制
I/O控制对于单片机而言是最基础最核心的东西,其实单片机除了AD DA 转换之外的事情。其他大部分的事情I/O口都能做的到。I/O控制简单却能千变万化。 单片机在大部分应用中做的事情,莫过于 输入高低电平 ,输出高低电平。就是通过这简单的控制电平来实现大多数的应用控制。 什么是I/O口? 什么是I/O 就是 IN/OUT 就是 输入/输出。 I/O具体能做什么呢? 如果你是刚刚步入电子的新手,那你最好要知道一下I/O口具体能做什么。感性的认识对你的学习是很有帮助的。I/O口输出一个高(低)电平可以用来点亮一个LED灯,可以接通过一个继电器,来开启电机,来开启音响。开启许多的东西,也可以用于通信等等。输入一个高(低)电
[单片机]
<font color='red'>PIC单片机</font>的IO控制
基于PIC单片机的防伪包装技术
简介:文中提出将PIC单片机技术和密码学原理应用到防伪包装领域;介绍一种可控密码防伪包装技术的结构特点、作用原理及实际防伪效果。 由于假冒伪劣商品高额利润的驱使,市场上制假、售假现象屡禁不尽,严重地影响社会经济的正常发展。固然商品生产厂家为保护自身利益不受侵害,不断地推出防伪包装技术,如激光防伪商标、多重结构防伪包装等,但仍无法有效地遏止假冒伪劣商品的大量涌现。分析原因,这些方法的共同特点都是依靠增加包装结构的复杂性,试图通过进步包装制造难度达到防伪目的。事实上,在如今先进的制造技术条件下,无论多复杂的结构造假者跟随仿冒也是轻而易举的。近年来,人们又不断地应用高新技术成果研制开发出各种新型防伪技术,如信息网络防伪技术、原子核双
[单片机]
基于<font color='red'>PIC单片机</font>的防伪包装技术
PIC单片机软件开发技巧
笔者的项目是有关机器人控制的实现。控制部分采用PICl6F7X系列单片机,运用汇编语言编程,运行速度较快,能够达到系统的要求。在这里使用的大多是数字信号的控制,电机的控制只有开和合两种状态。在动作的过程中需要两只手臂、身体、头部、脚部等的协调动作。整个控制系统比较复杂,因而在PIC程序编写和空间分配方面需要注意一些问题。 1 动作标志位的使用 在整个控制中,组合的动作很多,当所有动作定位都通过光电开关控制时,在程序编写上就有一些问题。如要求左手上升到鼓掌位、右手上升到举手位(手初始位置在最下的放下位),光电开关0有效(即为0时是挡住),到达正确位置。用简单的理解可以写成下面的程序: list P=16c73
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved