当前位置: 代码迷 >> 单片机 >> 想用瑞萨单片机R8C/25用蜂鸣器写一个简略音乐播放器,隔一秒发出七个音符,写出来却没有预期的效果。请各位大侠多多指教。
  详细解决方案

想用瑞萨单片机R8C/25用蜂鸣器写一个简略音乐播放器,隔一秒发出七个音符,写出来却没有预期的效果。请各位大侠多多指教。

热度:50   发布时间:2016-04-28 15:06:59.0
想用瑞萨单片机R8C/25用蜂鸣器写一个简单音乐播放器,,隔一秒发出七个音符,,,写出来却没有预期的效果。。。请各位大侠多多指教。。
#include "sfr_r825.h" // Definition of the R8C/25 SFR 
#define uchar unsigned char
#define uint unsigned int
uchar BTH0,BTL0;
uchar Time;

#define _Disableint asm("Fclr I")   
#define _Enableint asm("Fset I") 
uchar table[]={0xef,0xd4,189,179,160,142,127};   //七个音符频率表

void delay(unsigned char t)   // 250ms 延时
{
    unsigned char i,j;
unsigned int k;
for(i=0;i<t;i++)
    for(j=0;j<250;j++)
{
for(k=0;k<1000;k++);
}    
tstart_tracr=0;
 }
void Song()    //播放子程序
{
 tra=BTH0;//赋值定时器时间,决定频率
 trapre=BTL0;
 tstart_tracr=1;       //打开定时器
 delay(4); //延时所需要的节拍                      
 }
void main(void)
{

uchar i;

asm("Fclr I");

//系统时钟初始化
prcr=0x01;                          //关闭和时钟相关的保护寄存器,允许修改时钟 
cm13=1;      //XIN-XOUT引脚连接内部起振电路
cm15 =1;       //XIN-XOUT引脚使用高驱动能力
cm05=0;          //开始振荡
asm("NOP\nNOP\nNOP\nNOP");
asm("NOP\nNOP\nNOP\nNOP");
ocd2=0x00;      //使用主时钟作为系统时钟 
  cm16=0;cm17=0;cm06=0;            //f1
prcr=0;                             //打开保护寄存器

pd1_1=1;
p1=0xfd;
tstart_tracr = 0; //停止计数
while(tcstf_tracr != 0); //等待计数完成
traic = 0x00; //屏蔽RA中断
tstop_tracr = 1; //强制停止计数
tramr = 0x00; //定时模式 f1分频
traic = 0x04; //开启RA中断 优先级2
asm("Fset I");
while(1)
{
i=0;
while(i<8){

           BTH0=3;//音符频率高字节
            BTL0=table[i]-1;//音符频率低字节

            Song();

}

}

}




#pragma INTERRUPT TimerRA (vect=22)//中断翻转蜂鸣器电平
void TimerRA(void){
tstart_tracr = 0;
    p1_1=~p1_1;

tra=BTH0;
trapre=BTL0;
tstart_tracr =1;
}

------解决方案--------------------
引用:
while语句错了。。改成for..还有就是蜂鸣器的硬件局限也有问题,,

蜂鸣器只能发一个声音,我们有一次仅仅是想改蜂鸣器声音大小(需要区别明显但又不像是没电那种嘶哑声)都费了老大的劲