C51 单片机控制蜂鸣器程序 15

我需要表达的意思如下:K1按下去,蜂鸣器,按照一个频率发出声音K2按下去,蜂鸣器按照另一个频率发出声音K1的优先级比K2高,也就是说,K1先按下去的时候发出K1的频率声音... 我需要表达的意思如下:
K1按下去,蜂鸣器,按照一个频率发出声音
K2按下去,蜂鸣器按照另一个频率发出声音
K1的优先级比K2高,也就是说,K1先按下去的时候发出K1的频率声音,这个阶段内K2按下去,频率不会变化,而,如果K1松开了,就会自动跳到K2的频率上去
相反,K2的优先级低,当K2先按下去,发出K2频率的声音,在此时,K1如果在K2之后按下去,声音会自动跳到K1对应的频率,K1松开,则继续发出K2的频率
我写的程序如下,但是实际现象时k1按下去可以发声,k2按下去不发声,优先级好像写的不对,请帮忙指出,或者有没有更好的方法写, 程序如下

#include<reg51.h>
#define u8 unsigned char
#define u16 unsigned int
sbit horn=P3^7;
sbit k1=P1^0;
sbit k2=P1^1;
u8 count;
u16 t;
void delay(u16 x)
{
while(x--);
}

void timer0_init()
{
TMOD|=0X01;
TH0=65097/256;
TL0=65097%256;
TR0=0;
}
void isr_init()
{
EA=1;
ET0=1;
}
void timer0_isr() interrupt 1
{
horn=!horn;
TH0=t/256;
TL0=t%256;
}
void key1()
{
static u8 st;
if(k1==0)
{
if(st==0)
{
delay(1000);
if(k1==0)
{
TR0=1;
count=1;
}
}

}
else
{
st=0;
TR0=0;
count=0;
}

}

void key2()
{
static u8 st;
if(count==1)
{
return;
}
if(k2==0)
{
if(st==0)
{
delay(1000);
if(k2==0)
{
TR0=1;
count=2;

}
}
}
else
{
st=0;
TR0=0;
count=0;
}
}
void alarm()
{
static u16 c;
switch(count)
{
case 0:
c=0;
t=c;
break;
case 1:
c=64877;
t=c;
break;
case 2:
c=65097;
t=c;
break;
}
}
void main()
{
timer0_init();
isr_init();
while(1)
{
key1();
key2();
alarm();
}
}
展开
 我来答
匿名用户
2014-11-03
展开全部
把2个蜂鸣器的频率各写成一个函数。
然后主函数里这样写
if (key1 == 0)
"执行1蜂鸣器频率"

else if (key2 == 0)
"执行2蜂鸣器频率"
昆山海旭电子
2024-10-31 广告
昆山海旭科技电子有限公司,本公司早年进入电声制造行业,经过多年的发展,已经形成了江苏、广东两地具备同时生产的能,产品范围涉及蜂鸣器,电容驻极咪头,蜂鸣片及喇叭。其中蜂鸣器产品囊括了:电磁式直流全套系类、电磁式交流全套系类、压电式直流系类、压... 点击进入详情页
本回答由昆山海旭电子提供
百度网友1c723ff30
2014-11-03 · 超过33用户采纳过TA的回答
知道答主
回答量:87
采纳率:100%
帮助的人:35.4万
展开全部
st什么时候值不为0?
追问
额,这确实,但是我实际试验的时候写的 在if(k1==0)
{
st=1;
TR0=1;
count=1;
}
是这样的,这个是我各种方法修改,最后到记事本里整理发上来的时候搞丢的
帮忙看下其他 的又问题不,我st的加上去还是不行的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
查晓筠0i5
2014-11-03 · TA获得超过2752个赞
知道大有可为答主
回答量:2.1万
采纳率:1%
帮助的人:4889万
展开全部
电路呢
我看一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式