📄 testsound.i
字号:
// CodeVisionAVR C Compiler
// (C) 1998-2001 Pavel Haiduc, HP InfoTech S.R.L.
// I/O registers definitions for the ATmega16
#pragma used+
sfrb TWBR=0;
sfrb TWSR=1;
sfrb TWAR=2;
sfrb TWDR=3;
sfrb ADCL=4;
sfrb ADCH=5;
sfrw ADCW=4; // 16 bit access
sfrb ADCSRA=6;
sfrb ADMUX=7;
sfrb ACSR=8;
sfrb UBRRL=9;
sfrb UCSRB=0xa;
sfrb UCSRA=0xb;
sfrb UDR=0xc;
sfrb SPCR=0xd;
sfrb SPSR=0xe;
sfrb SPDR=0xf;
sfrb PIND=0x10;
sfrb DDRD=0x11;
sfrb PORTD=0x12;
sfrb PINC=0x13;
sfrb DDRC=0x14;
sfrb PORTC=0x15;
sfrb PINB=0x16;
sfrb DDRB=0x17;
sfrb PORTB=0x18;
sfrb PINA=0x19;
sfrb DDRA=0x1a;
sfrb PORTA=0x1b;
sfrb EECR=0x1c;
sfrb EEDR=0x1d;
sfrb EEARL=0x1e;
sfrb EEARH=0x1f;
sfrw EEAR=0x1e; // 16 bit access
sfrb UBRRH=0x20;
sfrb UCSRC=0X20;
sfrb WDTCR=0x21;
sfrb ASSR=0x22;
sfrb OCR2=0x23;
sfrb TCNT2=0x24;
sfrb TCCR2=0x25;
sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28; // 16 bit access
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
sfrw OCR1A=0x2a; // 16 bit access
sfrb TCNT1L=0x2c;
sfrb TCNT1H=0x2d;
sfrw TCNT1=0x2c; // 16 bit access
sfrb TCCR1B=0x2e;
sfrb TCCR1A=0x2f;
sfrb SFIOR=0x30;
sfrb OSCCAL=0x31;
sfrb OCDR=0x31;
sfrb TCNT0=0x32;
sfrb TCCR0=0x33;
sfrb MCUCSR=0x34;
sfrb MCUCR=0x35;
sfrb TWCR=0x36;
sfrb SPMCR=0x37;
sfrb TIFR=0x38;
sfrb TIMSK=0x39;
sfrb GIFR=0x3a;
sfrb GICR=0x3b;
sfrb OCR0=0X3c;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-
//***** Bit Definitions
// GIMSK / GICR
// GIFR
// TIMSK
// TIFR
// SPMCR
// TWCR
// MCUCR
// MCUSR
// TCCR0
// SFIOR
// TCCR1A
// TCCR1B
// TCCR2
// ASSR
// WDTCR
// EECR
// PORTA
// DDRA
// PINA
// PORTB
// DDRB
// PINB
// PORTC
// DDRC
// PINC
// PORTD
// DDRD
// PIND
// SPSR
// SPCR
// UCSRA
// UCSRB
//UCSRC
// ACSR
// ADMUX
// ADCSR
// TWAR
// Interrupt vectors definitions
// CodeVisionAVR C Compiler
// (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.
#pragma used+
void delay_us(unsigned int n);
void delay_ms(unsigned int n);
#pragma used-
#pragma used+
void TransmitByte(unsigned char c); //发送一个字节到USART
unsigned char ReceiveByte(void); //从USART中读取一个字节
void TransmitLine(char *s); //发送字符串到USART,以回车符结束
void TransmitLineF(flash char *s); //同上
void TransmitString(char *s); //发送任意字符串到USART
void TransmitStringF(flash char *s); //同上
void USART_Init(unsigned char BaudRate); //初始化USART,BaudRate为速度
void TestRate(void); //测试USART速度
void ReceiveCMD(unsigned char * CmdBuf,unsigned char MaxCmdBuf); //从USART中读取一条命令行
#pragma used-
#pragma library USART.lib
//Type definitions
typedef unsigned char byte;
typedef unsigned int word;
//音乐频率
const word tone_frq[]=
{ 0,
//低音
7372800/2 /262, 7372800/2 /277, 7372800/2 /294, 7372800/2 /311, 7372800/2 /330, 7372800/2 /349,
7372800/2 /370, 7372800/2 /392, 7372800/2 /415, 7372800/2 /440, 7372800/2 /466, 7372800/2 /494,
//中音
7372800/2 /523, 7372800/2 /554, 7372800/2 /578, 7372800/2 /622, 7372800/2 /659, 7372800/2 /698,
7372800/2 /740, 7372800/2 /784, 7372800/2 /831, 7372800/2 /880, 7372800/2 /932, 7372800/2 /988,
//高音
7372800/2 /1046,7372800/2 /1109,7372800/2 /1175,7372800/2 /1245,7372800/2 /1318,7372800/2 /1397,
7372800/2 /1480,7372800/2 /1568,7372800/2 /1661,7372800/2 /1760,7372800/2 /1865,7372800/2 /1976
};
//音乐简谱定义
//低音
//中音
//高音
//节拍定义,以四分音符为一拍
//===============================================================================
// 音乐文件数据
// 二维数组第一个表示音符,第二个表示节拍长度
// 音符里1-7表示7个音阶,数字前带"_"表示半音,L、M、H分别表示低、中、高音
// 具体定义见 music.h 文件里的定义
//===============================================================================
/*第一首:莫斯科郊外的夜晚*/
const byte music_dt0[]=
const byte music_dt0[]=
{10,4 ,13,4 ,17,4 ,13,4 ,15,8 ,13,4 ,12,4 ,17,8 ,15,8 ,10,16 ,
13,4 ,17,4 ,20,4 ,20,4 ,22,8 ,20,4 ,18,4 ,17,16 ,
18,8 ,20,8 ,24,4 ,22,4 ,17,8 ,17,4 ,
12,8 ,10,4 ,17,4 ,15,4 ,18,8 ,18,4 ,0,4 ,
20,4 ,18,4 ,17,8 ,15,4 ,13,4 ,17,8 ,15,8 ,10,16 ,10,4 ,0,4 ,
0,8 ,0,0};
/*第二首:铃儿响叮当*/
const byte music_dt1[]=
{17,4 ,17,4 ,17,8 ,17,4 ,17,4 ,17,8 ,
17,4 ,20,4 ,13,6 ,15,2 ,17,16 ,
18,4 ,18,4 ,18,6 ,18,2 ,18,4 ,17,4 ,17,4 ,17,2 ,17,2 ,
17,4 ,15,4 ,15,4 ,13,4 ,15,8 ,20,8 ,
17,4 ,17,4 ,17,8 ,17,4 ,17,4 ,17,8 ,
17,4 ,20,4 ,13,6 ,15,2 ,17,12 ,0,4 ,
18,4 ,18,4 ,18,6 ,18,2 ,18,4 ,17,4 ,17,4 ,17,2 ,17,2 ,
20,4 ,20,4 ,18,4 ,15,4 ,13,12 ,0,4 ,
0,0};
/*第三首:卡秋沙*/
const byte music_dt2[]=
{10,12 ,12,4 ,13,12 ,10,4 ,
13,8 ,12,4 ,10,4 ,12,8 ,
5,8 ,12,12 ,13,4 ,15,12 ,
12,4 ,15,8 ,13,4 ,12,4 ,
10,16 ,17,8 ,22,8 ,20,8 ,
22,4 ,20,4 ,18,8 ,17,4 ,
15,4 ,17,8 ,10,8 ,0,4 ,
18,8 ,15,4 ,17,12 ,13,4 ,
12,4 ,5,4 ,13,4 ,12,4 ,
10,16 ,17,8 ,22,8 ,20,8 ,
22,4 ,20,4 ,18,8 ,17,4 ,
15,4 ,17,8 ,10,8 ,0,4 ,
18,8 ,15,4 ,17,12 ,13,4 ,
12,4 ,5,4 ,13,4 ,12,4 ,
10,16 ,0,0};
/*第四首:康定情歌*/
const byte music_dt3[]=
{17,4 ,20,4 ,22,4 ,22,2 ,20,2 ,22,6 ,17,2 ,15,8 ,
17,4 ,20,4 ,22,4 ,22,2 ,20,2 ,22,4 ,17,12 ,
17,4 ,20,4 ,22,4 ,22,2 ,20,2 ,22,6 ,17,2 ,15,8 ,
20,4 ,17,4 ,15,2 ,17,2 ,15,2 ,13,2 ,15,4 ,10,12 ,
22,4 ,15,12 ,20,4 ,17,12 ,15,2 ,13,2 ,22,12 ,20,4 ,17,4 ,
15,2 ,17,2 ,15,2 ,13,2 ,15,4 ,22,12 ,
0,0};
/*第五首:童年*/
const byte music_dt4[]=
{29,4 ,29,8 ,29,4 ,29,8 ,27,8 ,25,4 ,25,8 ,25,4 ,27,4 ,
25,4 ,22,8 ,
20,4 ,20,8 ,20,4 ,22,4 ,20,4 ,27,4 ,29,4 ,25,16 ,
17,4 ,20,4 ,20,8 ,17,4 ,20,4 ,22,4 ,22,4 ,24,4 ,22,8 ,
22,4 ,22,4 ,20,4 ,
25,8 ,25,4 ,25,8 ,25,4 ,22,4 ,25,4 ,22,4 ,20,16 ,
17,4 ,20,4 ,20,4 ,17,4 ,20,4 ,22,4 ,22,4 ,24,4 ,22,8 ,
22,4 ,22,4 ,20,4 ,
25,8 ,25,4 ,25,4 ,25,4 ,22,4 ,22,4 ,25,4 ,27,16 ,
32,4 ,32,8 ,32,4 ,32,8 ,29,4 ,27,4 ,25,4 ,25,8 ,22,8 ,
25,4 ,22,4 ,25,4 ,
27,4 ,27,4 ,27,4 ,27,4 ,27,4 ,25,4 ,29,4 ,27,4 ,27,16 ,
29,4 ,29,8 ,29,4 ,29,8 ,27,8 ,25,4 ,25,8 ,25,4 ,27,4 ,
25,4 ,22,8 ,
20,4 ,20,8 ,20,4 ,22,4 ,20,4 ,27,4 ,29,4 ,25,16 ,
29,4 ,29,8 ,29,4 ,29,8 ,27,8 ,25,4 ,25,8 ,25,4 ,27,4 ,
25,4 ,22,8 ,
20,4 ,20,8 ,20,4 ,22,4 ,20,4 ,27,4 ,29,4 ,25,16 ,
0,0};
/*第六首:沧海一声笑*/
const byte music_dt5[]=
{22,4 ,22,2 ,20,2 ,17,6 ,15,2 ,13,16 ,
17,6 ,15,2 ,13,4 ,10,2 ,8,2 ,8,16 ,
8,6 ,10,2 ,8,6 ,10,2 ,13,6 ,15,2 ,17,4 ,20,4 ,
22,6 ,20,2 ,17,2 ,15,2 ,13,4 ,15,16 ,
0,0};
/*第七首:两只蝴蝶*/
const byte music_dt6[]=
{20,4 ,20,4 ,22,4 ,25,4 ,24,4 ,24,4 ,22,4 ,
17,8 ,15,4 ,17,4 ,17,12 ,0,8 ,
17,4 ,17,4 ,20,4 ,22,8 ,25,12 ,
10,4 ,20,4 ,17,4 ,15,24 ,
17,4 ,20,4 ,20,4 ,17,4 ,20,8 ,0,4 ,
25,8 ,24,4 ,22,4 ,24,4 ,17,8 ,0,4 ,
22,4 ,22,4 ,25,4 ,22,4 ,20,4 ,17,4 ,15,8 ,15,8 ,17,4 ,20,16 ,
20,4 ,
0,0};
/*第八首:两只老虎*/
const byte music_dt7[]=
{13,8 ,15,8 ,17,8 ,13,8 ,13,8 ,15,8 ,17,8 ,13,8 ,
17,8 ,18,8 ,20,16 ,17,8 ,18,8 ,20,16 ,
20,6 ,22,2 ,20,6 ,18,2 ,17,8 ,13,8 ,
20,6 ,22,2 ,20,6 ,18,2 ,17,8 ,13,8 ,
13,8 ,20,8 ,13,16 ,13,8 ,20,8 ,13,16 ,
0,0};
unsigned char delay_inc=0x0C;
unsigned char time_inc=0x01;
struct MUSICDAT
{
char name;
char time;
} ;
void delay(word t)
{
unsigned int i;
// uchar j;
for (i=0;i<t;i++) i+=delay_inc;
// for(j=1;j<8;j++);
}
void sound_pc0(unsigned char t)
{
unsigned int i;
for (i=0;i<350-t*t;i++) /*改变发音快慢*/
{
PORTD^=0x80;
delay(t);
}
}
void TestSnd1()
{
unsigned char c;
for (c=0x00;c<0xff;c++)
{
PORTD^=0x80;
delay(c);
}
for (c=0xff;c>0x00;c--)
{
PORTD^=0x80;
delay(c);
}
}
void TestSnd2()
{
unsigned char dt;
for(dt=1;dt<14;dt++) /*改变发音数量 */
sound_pc0(dt);
}
void TestSnd3(void)
{
unsigned char c;
for (c=0x00;c<0xff;c++)
{
PORTD^=0x80;
delay(c);
PORTD^=0x80;
delay(c);
}
for (c=0;c<255;c++);
for (c=0xff;c>0x00;c--)
{
PORTD^=0x80;
delay(c);
PORTD^=0x80;
delay(c);
}
for (c=0;c<255;c++) ;
}
void TestSnd4(void)
{
//struct MUSICDAT * music_dat;
//unsigned char c;
unsigned int i,j,k;
unsigned char name;
unsigned int time;
i=0;
while (i<sizeof(music_dt0))
{
name=music_dt0[i];
time=music_dt0[i+1];
for (k=0;k<time;k++)
for (j=0;j<187-time_inc;j++)
{
PORTD^=0x80;
delay(tone_frq[name]);
PORTD^=0x80;
delay(tone_frq[name]);
}
delay_ms(20);
i+=2;
}
//while ((name==0)&&(time==0));
}
void TestSnd5(void)
{
unsigned int j;
//for (i=0;i<100;i++)
for (j=0;j<10;j++)
{
PORTD^=0x80;
delay(tone_frq[13]);
PORTD^=0x80;
delay(tone_frq[13]);
}
}
void main (void) /*主函数 */
{
unsigned char Cmd;
DDRC=0xff;
DDRA=0x00;
DDRD=0xff;
PORTC=~time_inc;
USART_Init(47); //3.6864M=23, 7.3728M=47
while (1)
{
Cmd=0;
if (UCSRA&(1<<7)) //串口有信息吗?
{
Cmd=UDR; //如果有,接收一个字节
}
if ((!PINA.0)||(Cmd=='1')) TestSnd1();
if ((!PINA.1)||(Cmd=='2')) TestSnd2();
if ((!PINA.2)||(Cmd=='3')) TestSnd3();
if ((!PINA.3)||(Cmd=='4')) TestSnd4();
if ((!PINA.4)||(Cmd=='5')) TestSnd5();
if ((!PINA.6)||(Cmd=='7'))
{
while (!PINA.6);
time_inc++;
if (time_inc>186) time_inc=186;
PORTC=~time_inc;
}
if ((!PINA.7)||(Cmd=='8'))
{
while (!PINA.7);
time_inc--;
if (time_inc<0) time_inc=0;
PORTC=~time_inc;
}
if (Cmd=='9')
{
Cmd=ReceiveByte();
time_inc=Cmd;
if (time_inc>186) time_inc=186;
PORTC=~time_inc;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -