(求看下音阶部分哪里错了)键控流水灯加音阶(音阶无法播放)
时间:10-02
整理:3721RD
点击:
新人刚学单片机
电路图如图,应该接线没问题。
主要是仿真运行的时候蜂鸣器只会发出“tutututu”的声音,而不是do,re,mi,fa,so,la,xi。流水灯没什么问题。其实一开始只是做流水灯,做完流水灯想试下加音阶。
代码如下:
#include<reg51.h>
#include<intrins.h>
void delay(unsigned int time);
sbit test=P1^4;
sbit test2=P1^5;
sbit test3=P1^6;
sbit test4=P1^7;
sbit beep=P3^4;
bit time = 0, order = 0,re=0;
unsigned int i=0; //音符索引
//7 个音符放在方式 2 下的定时寄存器 (TH0,TL0)
unsigned char code HI_LIST[]={0,226,229,232,233,236,238};
unsigned char code LO_LIST[]={0,4,13,10,20,3,8};
key() interrupt 0//INT0中断函数
{
delay(20);
switch (P1 & 0x0f)
{
case 0x07:
{
time = 1;
order = 0;
test2=~test2;
break;
}//S4下到上,间隔0.1s。
case 0x0b:
{
time = 1;
order = 1;
test2=~test2;
break;
}//S3上到下,间隔0.1s。
case 0x0d:
{
time = 0;
order = 1;
test2=~test2;
break;
}//S2下到上,间隔0.5s。
case 0x0e:
{
time = 0;
order = 0;
test2=~test2;
break;
}//关
default:break;
}
test=~test;//测试是否进入中断函数
}
void T0_INT() interrupt 1 //定时器 0 中断函数
{
TL0=LO_LIST[i];
TH0=HI_LIST[i];
beep=~beep;
}
void main()
{
unsigned char temp = 0xff;
unsigned int i = 0;
beep=0;
EX0=1;
IP=0x02;//IT0优先
IE=0x83; //开中断,IT0=1,ET0=1
TMOD=0x00;
while(1)
{
if (time)
{
if (order)
{
temp = 0xfe;//s3
for (i=8;i>0;i--)
{
P0 = temp;
TR0=1;
delay(50);
temp = _crol_(temp, 1);
TR0=0; //播放一个音符
delay(50);
if(re)
{
P0=0xff;
re=0;
break;
}
}
}
else
{
temp = 0x7f;//s4
for (i=8;i>0;i--)
{
P0 = temp;
TR0=1;
delay(50);
temp = _cror_(temp, 1);
TR0=0; //播放一个音符
delay(50);
if(re)
{
P0=0xff;
re=0;
break;
}
}
}
}
else
{
if (order == 1)
{
temp = 0x7f;//s2
for (i=8;i>0;i--)
{
P0 = temp;
TR0=1;
delay(250);
temp = _cror_(temp, 1);
TR0=0; //播放一个音符
delay(250);
if(re)
{
P0=0xff;
re=0;
break;
}
}
}
else
{
P0 = 0xff;//s1
test4=~test4;
}
}
test3=~test3;
}
}
void delay(unsigned int time)
{
unsigned int x, y;
for (x = time; x>0; x--)
{
for (y = 120; y>0; y--);
}
}
电路图如图,应该接线没问题。
主要是仿真运行的时候蜂鸣器只会发出“tutututu”的声音,而不是do,re,mi,fa,so,la,xi。流水灯没什么问题。其实一开始只是做流水灯,做完流水灯想试下加音阶。
代码如下:
#include<reg51.h>
#include<intrins.h>
void delay(unsigned int time);
sbit test=P1^4;
sbit test2=P1^5;
sbit test3=P1^6;
sbit test4=P1^7;
sbit beep=P3^4;
bit time = 0, order = 0,re=0;
unsigned int i=0; //音符索引
//7 个音符放在方式 2 下的定时寄存器 (TH0,TL0)
unsigned char code HI_LIST[]={0,226,229,232,233,236,238};
unsigned char code LO_LIST[]={0,4,13,10,20,3,8};
key() interrupt 0//INT0中断函数
{
delay(20);
switch (P1 & 0x0f)
{
case 0x07:
{
time = 1;
order = 0;
test2=~test2;
break;
}//S4下到上,间隔0.1s。
case 0x0b:
{
time = 1;
order = 1;
test2=~test2;
break;
}//S3上到下,间隔0.1s。
case 0x0d:
{
time = 0;
order = 1;
test2=~test2;
break;
}//S2下到上,间隔0.5s。
case 0x0e:
{
time = 0;
order = 0;
test2=~test2;
break;
}//关
default:break;
}
test=~test;//测试是否进入中断函数
}
void T0_INT() interrupt 1 //定时器 0 中断函数
{
TL0=LO_LIST[i];
TH0=HI_LIST[i];
beep=~beep;
}
void main()
{
unsigned char temp = 0xff;
unsigned int i = 0;
beep=0;
EX0=1;
IP=0x02;//IT0优先
IE=0x83; //开中断,IT0=1,ET0=1
TMOD=0x00;
while(1)
{
if (time)
{
if (order)
{
temp = 0xfe;//s3
for (i=8;i>0;i--)
{
P0 = temp;
TR0=1;
delay(50);
temp = _crol_(temp, 1);
TR0=0; //播放一个音符
delay(50);
if(re)
{
P0=0xff;
re=0;
break;
}
}
}
else
{
temp = 0x7f;//s4
for (i=8;i>0;i--)
{
P0 = temp;
TR0=1;
delay(50);
temp = _cror_(temp, 1);
TR0=0; //播放一个音符
delay(50);
if(re)
{
P0=0xff;
re=0;
break;
}
}
}
}
else
{
if (order == 1)
{
temp = 0x7f;//s2
for (i=8;i>0;i--)
{
P0 = temp;
TR0=1;
delay(250);
temp = _cror_(temp, 1);
TR0=0; //播放一个音符
delay(250);
if(re)
{
P0=0xff;
re=0;
break;
}
}
}
else
{
P0 = 0xff;//s1
test4=~test4;
}
}
test3=~test3;
}
}
void delay(unsigned int time)
{
unsigned int x, y;
for (x = time; x>0; x--)
{
for (y = 120; y>0; y--);
}
}
电路图
下面的四只led只是我用来调试程序用的