怎样用stc89c52单片机控制蜂鸣器发出音乐的c语言程序?

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-16
求stc89c52蜂鸣器响五秒的c语言代码

看你蜂鸣器是接到哪里,什么类型的
最简单的只接一根pio控制就好
代码就是
pio=1
延时五秒
pio=0

不可能,只有靠语音芯片才行,单片机只是控制

#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
}
}

你参考这个吧

  • stc89c52单片机怎么联接驱动器控制步进电机图
    答:STC89C52RC通过TB6600步进驱动板控制步进电机的接线方法 PUL+,DIR+和ENA+连一起接到单片机VCC口,PUL-,DIR-和ENA-接到P10,P11和P12口,电源和步进电机接线同上;PUL是脉冲,DIR是方向,ENA是使能,每个标签带 + 符号的是隔离端光耦的正极,带 - 符号的是负极。把这三个标签 带 - 号的都和...
  • 单片机STC89C52 如何控制舵机
    答:include<reg52.h> //51单片机头文件 define uint unsigned int //宏定义 define uchar unsigned char //宏定义 void delay(uint); //延时子函数声明 void enable1(void);void enable2(void);sbit P1_0=P1^0; //PWM信号输出端 sbit K1=P1^1;sbit K2=P1^2;sbit K3=P1^3;/***主函数*...
  • 问: 求用C语言写一个简单的STC89C52单片机程序
    答:希望采纳,参考代码:include<reg52.h>sbit Motor_L=P1^0;sbit Motor_R=P1^1;sbit K0=P0^0;sbit K2=P0^2;sbit K1=P0^1;sbit K3=P0^3;unsigned char time2s;/*定时器0初始化函数*/void InitTimer0(){ TMOD%=0xF0; TMOD|=0x01;//定时器0,方式一 TH0=(65536-50000)/2...
  • 求STC89c52单片机用倒计时控制继电器开、合的C语言程序,晶振12.000_百...
    答:这是数字时钟的C程序,如果要实现对继电器的开关控制,就可以在主程序中加入对时间的控制。也就是说,在你定义的某个时间上,继电器会实现开或者合的状态!由于单片机对数码管的控制引脚有别,程序还得自己加以修改。include<reg52.h> //#include<absacc.h> define uchar unsigned char define uint ...
  • STC89C52单片机红外接收功能怎么用
    答:有的,40个引脚 拉一个出来,买一个红外接受器,一个红外发射器,程序设定接受发射的频率, 在想怎么控制就怎么控制了,比如用P1_0口,可以来个延迟,P1_0=1(红外有感应) 的时候 控制一个灯亮
  • 51单片机第一章--开发板实验平台
    答:迷你USB接口</:这不仅是电源的输送者,还是连接电脑的桥梁,实现程序的下载和调试。单片机跳线帽</:巧妙地设计,允许在需要时切换不同的单片机,扩展了硬件的可能性。电源开关</:一键控制,确保电力供应的灵活性。主角STC89C52单片机</:作为教程的核心,即使它并非标准型号,却因其丰富的中文资源而备受...
  • 跪求!!!STC89C52单片机,用八个按键控制分别控制八个LED灯的代码(C语言...
    答:[已完成!]电路图如下,include <reg52.h>#include <stdio.h> unsigned char code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};void delay_ms(unsigned int ct) //延时{unsigned int t,i;for(i=0;i<ct;i++){t=115;while(--t);}} void main(void)...
  • STC89C52RC贴片单片机的管脚如何排列?
    答:STC89C52RC贴片单片机的管脚排列方式遵循一定的规律,通常按照功能区域进行分组排列。STC89C52RC单片机是一种基于8051内核的高性能微控制器,广泛应用于各种嵌入式系统中。其管脚排列通常遵循一定的规律,以便于设计和使用。在STC89C52RC单片机中,管脚通常按照功能区域进行分组,如电源供电区、输入输出区、时钟区等...
  • STC89C52单片机输出PWM控制电机,又要用8个数码管动态显示,怎样才能按下...
    答:说到底还是时间分配的问题。我不知道你的PWM频率是多少?肯定的是PWM和数码管扫描都是要载中断中处理的。我建议:一个PWM周期,扫描一位数码管,在装入时间长的那个电平处理。这样50HZX8=400HZ以上的PWM频率就可以了。至于按键检测,可以放在主循环。当然也可以放在数码管扫描程序中。
  • 求stc89c52单片机c语言ds18b20温度控制
    答:write_two(char *p){ unsigned char i;write_com(0x80+0x40);for(i=0;p[i]!=0;i++){ write_date(p[i]);delay(10);} } write_int(int num){ unsigned int bai,shi,ge,xiaoshu; //这里的num,shi,ge,xiaoshu 必须用unsigned int无符号整数来表示,用unshigned char 字符 ...