想用瑞萨单片机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_Disableintasm("Fclr I")
#define_Enableintasm("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;
}
瑞萨R8C 定时器A 中断
[解决办法]