51单片机蜂鸣器开关C语言程序

按下开关有,再次按一下没有的那种

#include <REG52.H>
#include <INTRINS.H>
//本例采用89C52, 晶振为11.0592MHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧!
sbit Beep = P1^5 ;

unsigned char n=0; //n为节拍常数变量
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};

void int0() interrupt 1 //采用中断0 控制节拍
{ TH0=0xd8;
TL0=0xef;
n--;
}

void delay (unsigned char m) //控制频率延时
{
unsigned i=3*m;
while(--i);
}

void delayms(unsigned char a) //豪秒延时子程序
{
while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}

void main()
{ unsigned char p,m; //m为频率常数变量
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a: p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符
else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数
TR0=1; //开定时器1
while(n!=0) Beep=~Beep,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
TR0=0; //关定时器1
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-25
sbit P2^0=KEY;
sbit P2^1=BEEP;
unsigned char KEYNUM=0;

void main()
{
while(1)

{
if(KEY==0)//开关按下;

{
KEYNUM++;

}

if(KEYNUM==1)//第一次按下;

{
BEEP=1; //蜂鸣器响

}

if(KEYNUM==2)/第二次按下;
{
BEEP=0; //蜂鸣器不响
KEYNUM=0;
}

}

}

开关去抖我就不写了!有什么问题再讨论吧!!本回答被网友采纳
第2个回答  2013-04-21
检测到按键按下,接蜂鸣器的管脚电位取反
第3个回答  2013-04-21
建议你先了解一下独立按键。
void exr() interrupt n//n应该是对应的外部中断号
{
P1^=0x01;//在P1.1接蜂鸣器
}

求51单片机蜂鸣器程序
开关C语言程序:sbit P2^0=KEY;sbit P2^1=BEEP;unsigned char KEYNUM=0;void main(){while(1){if(KEY==0)\/\/开关按下;{KEYNUM++; }if(KEYNUM==1)\/\/第一次按下;{BEEP=1; \/\/蜂鸣器响 }if(KEYNUM==2)\/第二次按下;{BEEP=0; \/\/蜂鸣器不响KEYNUM=0; }}} 51单片机,编写延时程...

51单片机蜂鸣器程序是什么?
51单片机蜂鸣器程序为:include"reg52.h"typedef unsigned char u8;typedef unsigned int u16;sbit beep=P1^5;void delay(u16 i){ while(i--);} void main(){ while(1){ beep=~beep;delay(1000);\/\/控制音调频率 beep=~beep;\/控制声音大小 delay(10);} } ...

51单片机蜂鸣器程序
include<reg51.h>#include<intrins.h>#define uchar unsigned charuchar pwm,ctl=5;sbit fmq=P1^0;bit flag;void delay(uchar a){uchar i;while(a--)for(i=0;i<120;i++);}void t0isr() interrupt 1{pwm++;if(pwm<=ctl)P0=0xff;else P0=0x00;if(pwm==100) { pwm=0; ...

51单片机的蜂鸣器怎么关闭 求程序段
} 兄弟程序太大了,,我写了 主函数。其他外围你自己填写就可以了。另外:得用外接的“时间芯片”:1302。开机后,必须对1302进行初始化,然后等待操作者,对1302进行时间设定,然后等待2009-09-24 22:33时刻的到来。然后输出要求的波形。输出波形,也要用1302的时间进行控制 (我只会前面。1302 是...

有哪位大神知道51单片机蜂鸣器响1秒的c程序怎么写?
sbit fmq=P1^0;sbit key=P1^4;void t0isr() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;cnt++;if(cnt>20){ TR0=0;cnt=0;fmq=1;} } main(){ TMOD=0x01;TH0=(65536-50000)\/256;TL0=(65536-50000)%256;ET0=1;EA=1;while(1){ if(key==0){ while(key==...

51单片机用三个按键控制报警,任意按两个按键蜂鸣器就报警的程序
1. 程序的主要功能是通过三个按键(k1、k2、k3)来控制蜂鸣器的报警。2. 在主函数main()中,定义了一个字符变量beepflag,用于表示蜂鸣器的状态,初始值为0。3. 进入一个无限循环,等待用户操作。4. 首先检查k1按键是否被按下,如果是,将beepflag的最低位设置为1;否则,将其设置为0。5. 接着...

c51单片机。独立按钮k3控制蜂鸣器发声。k4控制蜂鸣器停止。蜂鸣器端口p1...
include<reg51.h>sbit k3=P1^0sbit k4=P1^1;sbit fmq=P1^5;main(){while(1) { if(k3==0) { fmq=0; while(k3==0); } if(k4==0) { fmq=1; whle(k4==0); } }}

51单片机蜂鸣器如何手动停止问题?
include<reg52.h> sbit kaiguan=P3^5;\/\/控制蜂鸣器 sbit BEEP=P1^0;void main(){ while (1) \/\/主循环 { if(!kaiguan)BEEP=1;else BEEP=0;} } 你上面那个没有while循环,刚才这个写法是稍微高级点的,如果更高级点的话可以更简单 BEEP=kaiguan!

51单片机控制喇叭的程序(c语言)
\/ [文件名] C51音乐程序(八月桂花)[功能] 通过单片机演奏音乐 注意:通过了74HC14控制ULN2003 驱动芯片驱动蜂鸣器 \/***\/ include <REG52.H> include <INTRINS.H> \/\/本例采用89C52, 晶振为11.0592MHZ \/\/关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.\/\/频率常数即音乐术语中的音调...

求51单片机蜂鸣器播放音乐的教程 C语言
uchar keyscan(void);\/\/键盘扫描程序 void delay(uint i); \/\/延时子程序\/*--- T0的值,及输出频率对照表 ---*\/ uchar code freq[36*2]={ 0xA9,0xEF, \/\/0x3F,0XEE,\/\/00220HZ ,1 \/\/0 0x93,0xF0, \/\/0X3D,0XEF,\/\/00233HZ ,1 0x73,0xF1, \/\/0X30,0XF0,\/\/0024...

相似回答