求大神 看看 我这里哪个出错了??
想实现的功能是通过按键控制数码管显示数字,和喇叭发1~7个音节,但程序却不能使他发声····求大神检查······出现的问题是在不加声音时,键盘能正常被扫描,控制数码管显...
想实现的功能是通过按键控制数码管显示数字,和喇叭发1~7个音节,
但程序却不能使他发声····求大神检查······出现的问题是 在不加声音时,键盘能正常被扫描,控制数码管显示数字,,加上时钟后 不但不能发声 而且使键盘控制数码管 还出现了错误!!!
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1 = P3^2;//数码管端口
sbit LED = P3^7;//led灯端口
sbit speak= P2^0;
uint t,num,i,a,temp;
uchar code tube[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管
uchar code Tab_Pl[7]={65058,65110,65157,65178,65217,65252,65285};//音节
void delay(uint x) //延迟
{
while(x--)
{
for(t=0;t<60;t++);
}
}
uchar key()//扫描按键
{
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xde: return 1;
break;
case 0xdd: return 2;
break;
case 0xdb: return 3;
break;
case 0xd7: return 4;
break;
}
if(temp!=0xf0)
{
P1=0xdf;
temp=P1;
temp=temp&0x0f;
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xbe: return 5;
break;
case 0xbd: return 6;
break;
case 0xbb: return 7;
break;
}
while(temp!=0xf0)
{
P1=0xbf;
temp=P1;
temp=temp&0x0f;
}
}
}
void display(uint aa)//判断按键 显示数码管数字
{
DS1=0;
P0=tube[aa];
delay(10);
DS1=1;
}
void music()//我感觉出错就在这//判断按键 实现发声
{
uchar a = key();
if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(key());
LED=0;
speak=0;
TMOD=0x01;
TH0=Tab_Pl[a]/256;
TL0=Tab_Pl[a]%256;
ET0=1;
TR0=1;
EA=1;
}
else
{
EA=0;
LED=1;
}
}
void main()
{
while(1)
{
music();
}
}
timer0()interrupt 1//中断程序
{
TH0=Tab_Pl[a]/256;
TL0=Tab_Pl[a]%256;
speak = ~speak ;
} 展开
但程序却不能使他发声····求大神检查······出现的问题是 在不加声音时,键盘能正常被扫描,控制数码管显示数字,,加上时钟后 不但不能发声 而且使键盘控制数码管 还出现了错误!!!
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1 = P3^2;//数码管端口
sbit LED = P3^7;//led灯端口
sbit speak= P2^0;
uint t,num,i,a,temp;
uchar code tube[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管
uchar code Tab_Pl[7]={65058,65110,65157,65178,65217,65252,65285};//音节
void delay(uint x) //延迟
{
while(x--)
{
for(t=0;t<60;t++);
}
}
uchar key()//扫描按键
{
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xde: return 1;
break;
case 0xdd: return 2;
break;
case 0xdb: return 3;
break;
case 0xd7: return 4;
break;
}
if(temp!=0xf0)
{
P1=0xdf;
temp=P1;
temp=temp&0x0f;
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xbe: return 5;
break;
case 0xbd: return 6;
break;
case 0xbb: return 7;
break;
}
while(temp!=0xf0)
{
P1=0xbf;
temp=P1;
temp=temp&0x0f;
}
}
}
void display(uint aa)//判断按键 显示数码管数字
{
DS1=0;
P0=tube[aa];
delay(10);
DS1=1;
}
void music()//我感觉出错就在这//判断按键 实现发声
{
uchar a = key();
if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(key());
LED=0;
speak=0;
TMOD=0x01;
TH0=Tab_Pl[a]/256;
TL0=Tab_Pl[a]%256;
ET0=1;
TR0=1;
EA=1;
}
else
{
EA=0;
LED=1;
}
}
void main()
{
while(1)
{
music();
}
}
timer0()interrupt 1//中断程序
{
TH0=Tab_Pl[a]/256;
TL0=Tab_Pl[a]%256;
speak = ~speak ;
} 展开
2个回答
展开全部
……
uchar code Tab_Pl[7]={65058,65110,65157,65178,65217,65252,65285};//音节
//应为整型
uchar TH_0, TL_0; //加两个变量
//---------------------------------------------
uchar key()//扫描按键
{
……
……
return 0; //没有按键,返回0
}
//---------------------------------------------
void display(uint aa)//判断按键 显示数码管数字
{
DS1 = 0;
P0 = tube[aa];
delay(10);
DS1 = 1;
}
//---------------------------------------------
void main()
{
uchar a;
TMOD = 0x01;
ET0 = 1;
TR0 = 0;
EA = 1;
while(1) {
a = key(); //a=1~7, 0 代表松开
if(a > 0 && a < 8) {
TH_0 = Tab_Pl[a] / 256;
TL_0 = Tab_Pl[a] % 256;
TH0 = TH_0;
TL0 = TL_0;
TR0 = 1;
LED = 0;
display(a);
while(key() > 0); //等待释放,此期间发音
}
else {
TR0 = 0;
LED = 1;
}
// music();
}
//---------------------------------------------
}
timer0()interrupt 1//中断程序
{
TH0 = TH_0;
TL0 = TL_0;
speak = ~speak ;
}
//---------------------------------------------
试试看。
=========================
另外:if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
应为:if(a==1||a==2||a==3||a==4||a==5||a==6||a==7)
uchar code Tab_Pl[7]={65058,65110,65157,65178,65217,65252,65285};//音节
//应为整型
uchar TH_0, TL_0; //加两个变量
//---------------------------------------------
uchar key()//扫描按键
{
……
……
return 0; //没有按键,返回0
}
//---------------------------------------------
void display(uint aa)//判断按键 显示数码管数字
{
DS1 = 0;
P0 = tube[aa];
delay(10);
DS1 = 1;
}
//---------------------------------------------
void main()
{
uchar a;
TMOD = 0x01;
ET0 = 1;
TR0 = 0;
EA = 1;
while(1) {
a = key(); //a=1~7, 0 代表松开
if(a > 0 && a < 8) {
TH_0 = Tab_Pl[a] / 256;
TL_0 = Tab_Pl[a] % 256;
TH0 = TH_0;
TL0 = TL_0;
TR0 = 1;
LED = 0;
display(a);
while(key() > 0); //等待释放,此期间发音
}
else {
TR0 = 0;
LED = 1;
}
// music();
}
//---------------------------------------------
}
timer0()interrupt 1//中断程序
{
TH0 = TH_0;
TL0 = TL_0;
speak = ~speak ;
}
//---------------------------------------------
试试看。
=========================
另外:if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
应为:if(a==1||a==2||a==3||a==4||a==5||a==6||a==7)
更多追问追答
追问
谢谢 大神!!!!问题基本上解决了···但只是按下的一瞬间发音,我想实现的是按键不松持续发音····还有能告诉我 我的错误在哪吗···
追答
上面的程序,应该就是:按键不松,就持续发音的。
……
TR0 = 1; //开始发音
LED = 0;
display(a);
while(key() > 0); //等待释放,此期间发音
//按键不松,就在这一行,不停的循环,此期间,应该连续发音。
}
……
展开全部
uchar a = key();
if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(key());
改成
uchar a;
EA=0;
a = key();
EA=1;
if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(a);
if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(key());
改成
uchar a;
EA=0;
a = key();
EA=1;
if(a==1|a==2|a==3|a==4|a==5|a==6|a==7)
{
display(a);
追问
谢谢 那么晚 还回答我的问题,能解释下 问什么这样做就能解决问题 还有我是怎么错的 万分感谢
今天板子 放在实验室了 明天去尝试一下 再次感谢
追答
你先去实验室试过了告诉我个结果呗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询