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