#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;
}
------解决方案--------------------
蜂鸣器只能发一个声音,我们有一次仅仅是想改蜂鸣器声音大小(需要区别明显但又不像是没电那种嘶哑声)都费了老大的劲