精华内容
下载资源
问答
  • 基于51单片机 电子琴程序 万次阅读 多人点赞
    2019-03-25 11:18:51

    源程序
    /*-----------------------------------------------
    名称:电子琴

    ------------------------------------------------*/
    #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

    #define KeyPort P3
    /------------------------------------------------
    全局变量
    ------------------------------------------------
    /

    unsigned char High,Low; //定时器预装值的高8位和低8位

    sbit SPK=P1^2; //定义喇叭接口

    unsigned char code freq[][2]={
    0xD8,0xF7,//00440HZ 1
    0xBD,0xF8,//00494HZ 2
    0x87,0xF9,//00554HZ 3
    0xE4,0xF9,//00587HZ 4
    0x90,0xFA,//00659HZ 5
    0x29,0xFB,//00740HZ 6
    0xB1,0xFB,//00831HZ 7
    0xEF,0xFB,//00880HZ `1
    };
    /------------------------------------------------
    函数声明
    ------------------------------------------------
    /
    void Init_Timer0(void);//定时器初始化
    /------------------------------------------------
    主函数
    ------------------------------------------------
    /
    void main (void)
    {
    unsigned char num;

    Init_Timer0(); //初始化定时器0,主要用于数码管动态扫描
    SPK=0; //在未按键时,喇叭低电平,防止长期高电平损坏喇叭
    while (1) //主循环
    {
    switch(KeyPort)
    {
    case 0xfe:num= 1;break;
    case 0xfd:num= 2;break;
    case 0xfb:num= 3;break;
    case 0xf7:num= 4;break;
    case 0xef:num= 5;break;
    case 0xdf:num= 6;break;
    case 0xbf:num= 7;break;
    case 0x7f:num= 8;break;
    default:num= 0;break;
    }

    if(num==0)
    {
    TR0=0;
    SPK=0; //在未按键时,喇叭低电平,防止长期高电平损坏喇叭
    }
    else
    {
    High=freq[num-1][1];
    Low =freq[num-1][0];
    TR0=1;
    }
    }
    }

    /------------------------------------------------
    定时器初始化子程序
    ------------------------------------------------
    /
    void Init_Timer0(void)
    {
    TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    EA=1; //总中断打开
    ET0=1; //定时器中断打开
    //TR0=1; //定时器开关打开
    }
    /------------------------------------------------
    定时器中断子程序
    ------------------------------------------------
    /
    void Timer0_isr(void) interrupt 1
    {
    TH0=High;
    TL0=Low;

    SPK=!SPK;

    }

    更多相关内容
  • 51单片机电子琴程序

    2014-03-17 00:22:53
    该文档为用51单片机及蜂鸣器来模拟电子琴程序
  • 该设计采用AT89C51(AT89C51数据手册)单片机作为主控制芯片,外接灯光闪烁功能和8音调键。
  • 。本系统设计是以51系列单片机AT89S52为主芯片,附有矩阵键盘、LED显示管、扬声器组成,系统完成显示输入信息、播放相应音符等基本功能。 附件为C代码。
  • 利用红外遥控器,控制51单片机电子琴,有8个基础音,按不同的按键就可以演奏,其中还有录制,重播的功能
  • 基于51单片机16音键电子琴设计
  • 51单片机超级电子琴(C语言)

    千次阅读 2021-05-20 08:37:10
    然后通过判断键值而分配各种音符,从而得到电子琴效果!硬件连接!硬键连接:P1口接矩阵键盘,P3.5接蜂鸣器引脚*/#include //头文件#define uint unsigned int//宏定义#define uchar unsigned char//宏定义void delay...

    /*说明:此程序是用矩阵按键和音乐实验组合而成的,先是写出矩阵键盘程序,得出键值。然后通过判断键值而分配各种音符,从而得到电子琴效果!硬件连接!

    硬键连接:P1口接矩阵键盘,P3.5接蜂鸣器引脚*/

    #include //头文件

    #define uint unsigned int//宏定义

    #define uchar unsigned char//宏定义

    void delay(uchar);//延时子函数声明

    void bbtt (uchar);//声音处理子函数声明

    void pan();//按键子函数声明

    uint code table[]={

    0xfd,0x12,0xfd,0x80, 0xfd,0xc6, 0xfe,0x07,0xfe,0x25,0xfe,0x57,

    0xfe,0x84,0xfe,0x98,0xfe,0xc0,0xfe,0xe3,0xff,0x01, 0xff,0x10, 0xff,0x29,0xff,0x42

    };/*音符代码 低音3,低音5,低音6,低音7,中音1,中音2,中音3,中音4,中音5,中音6,

    中音7,高音1,高音2,高音3,基中一个音用两个数表示。*/

    sbit bbt=P3^5;//定义蜂鸣器引脚为P3.5脚。

    uchar num,lui,a,temp,num1,num2,numm,aa,bb;//定义行变量

    void main()//主程序开始

    {

    TMOD=01;//设置定时器工作在方式0下

    IE=0X82;//开总中断与中断允许

    num=17;//定义初值,开机使它不亮

    while(1)

    {

    pan();//按键识别子函数

    TR0=0;//将定时器关掉

    /

    bbt=1;//将蜂鸣器关掉

    //

    /*将各按键得出键值码,也就是让每个键得到相应的音符*/

    if(num!=17)//判断num是否不等于17,不等就执行以下语句,否则跳过

    {

    switch(num)//执行开关语句

    {

    case 0://0x00与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (0);//调用声音处理子函数,并赋值0

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回开关语句

    /

    case 1://0x01与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (2);//调用声音处理子函数,并赋值2

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回

    //

    case 2://0x08与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (4); //调用声音处理子函数,并赋值4

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回

    //

    case 3://0x00与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (6);//调用声音处理子函数,并赋值6

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回继续判断是否有键按下

    /

    case 4://0x04与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (8);//调用声音处理子函数,并赋值8

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回

    //

    case 5://0x08与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (10);//调用声音处理子函数,并赋值10

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回

    case 6://0x00与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (12);//调用声音处理子函数,并赋值12

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回继续判断是否有键按下

    /

    case 7://0x04与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (14);//调用声音处理子函数,并赋值14

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回

    case 8://0x08与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (16);//调用声音处理子函数,并赋值16

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回

    //

    case 9://0x00与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (18);//调用声音处理子函数,并赋值18

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回继续判断是否有键按下

    /

    case 10://0x04与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (20);//调用声音处理子函数,并赋值20

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回

    //

    case 11://0x08与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (22);//调用声音处理子函数,并赋值22

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回

    case 12://0x00与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (24);//调用声音处理子函数,并赋值24

    num=17;// 将num值装回,使按键按下时只响一声

    }

    break;//返回继续判断是否有键按下

    /

    case 13://0x04与num值是否相等?

    {

    TR0=1;//打开定时器

    bbtt (26); //调用声音处理子函数,并赋值26

    num=17; // 将num值装回,使按键按下时只响一声

    }

    break;//返回

    }

    }

    }

    }

    /*矩阵键盘扫描程序*/

    void pan()

    {

    ///扫第一行

    P1=0xfe;//先扫第一行

    temp=P1;//将它值给temp

    temp=temp&0xf0;//与门比较

    if(temp!=0xf0)//如果它不等于0xf0,就执行括号语句

    {

    delay(100);//延时

    temp=P1;//再赋值

    temp=temp&0xf0;//再与门比较

    if(temp!=0xf0)//再判断是否为不等于0xf0?如果确实不等则说明有键按下

    {

    temp=P1;//将值重新给temp,以便下次再判断!否则找不到合适值

    switch(temp)//判断出了第一行有键按下了,还要判断具体哪个键

    {

    case 0xee:num=0;//0xee和temp比较,如果相等就将它编码定义为0

    break;//确定了就跳出switch语句

    case 0xde:num=1;//0xde和temp比较,如果相等就将它编码定义为1

    break;//确定了就跳出switch语句

    case 0xbe:num=2;//0xbe和temp比较,如果相等就将它编码定义为2

    break;//确定了就跳出switch语句

    case 0x7e:num=3;//0x7e和temp比较,如果相等就将它编码定义为3

    break;//确定了就跳出switch语句

    }

    if(temp!=0xf0)//按键识放判断,如果不等于0xf0就一直执行括号语句

    {

    temp=P1;//重新赋值

    temp=temp&0xf0;//重新与门

    }

    }

    }

    ///扫第二行

    P1=0xfd;

    temp=P1;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

    delay(100);

    temp=P1;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

    temp=P1;

    switch(temp)

    {

    case 0xed:num=4;

    break;

    case 0xdd:num=5;

    break;

    case 0xbd:num=6;

    break;

    case 0x7d:num=7;

    break;

    }

    if(temp!=0xf0)

    {

    temp=P1;

    temp=temp&0xf0;

    }

    }

    }

    /扫第三行

    P1=0xfb;

    temp=P1;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

    delay(100);

    temp=P1;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

    temp=P1;

    switch(temp)

    {

    case 0xeb:num=8;

    break;

    case 0xdb:num=9;

    break;

    case 0xbb:num=10;

    break;

    case 0x7b:num=11;

    break;

    }

    if(temp!=0xf0)

    {

    temp=P1;

    temp=temp&0xf0;

    }

    }

    }

    扫第四行

    P1=0xf7;

    temp=P1;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

    delay(100);

    temp=P1;

    temp=temp&0xf0;

    if(temp!=0xf0)

    {

    temp=P1;

    switch(temp)

    {

    case 0xe7:num=12;

    break;

    case 0xd7:num=13;

    break;

    case 0xb7:num=14;

    break;

    case 0x77:num=15;

    break;

    }

    if(temp!=0xf0)

    {

    temp=P1;

    temp=temp&0xf0;

    }

    }

    }

    }

    void delay(uchar z)//延时函数

    {

    uchar x,y;

    for(x=100;x>0;x--)

    for(y=z;y>0;y--);

    }

    /*扫描得到音乐代码,赋值给定时器*/

    void bbtt (uchar aa)

    {

    numm=table[aa];//得到音乐码高位

    aa++;//将计数器加1,以便取下一个代码

    num1=table[aa];//得到音乐码低位

    TH0=numm;//将高位赋值

    TL0=num1;//将低位赋值

    }

    /*中断服务子程序*/

    void zhong() interrupt 1

    {

    TH0=numm;//将高位赋值

    TL0=num1;//将低位赋值

    bbt=~bbt;//将蜂鸣器取反发声

    }

    展开全文
  • 包含源程序、原理图、仿真等文件
  • 51单片机电子琴

    千次阅读 多人点赞 2021-01-03 15:58:40
    基于51单片机电子琴制作(播放+弹奏) 制作的电子琴具有播放一段音乐和自我弹奏两种工作模式,可通过按键来切换模式。 程序如下: #include <reg52.h> #define uchar unsigned char #define uint unsigned ...

    基于51单片机的电子琴制作(播放+弹奏)

    制作的电子琴具有播放一段音乐和自我弹奏两种工作模式,可通过按键来切换模式。

    程序如下:

    #include <reg52.h>   
    #define uchar unsigned char
    #define uint unsigned int
    #define LCD1602_DATAPINS P2
    typedef unsigned int u16;
    typedef unsigned char u8; 
    sbit      beep=P1^4; 
    sbit LCD1602_E=P1^2;
    sbit LCD1602_RW=P1^1;
    sbit LCD1602_RS=P1^0;
    sbit swtich=P1^3;//切换按键	
    uchar timer0h,timer0l,time,flag,key,a,b,c;
    u8 moshi[11]="bofangmoshi";
    u8 moshi1[11]="tanzoumoshi";
    u8 yindiao[7]="1234567";
    code uchar song[]={0,1,1,
    				   5,1,1,
    				   5,1,1,
    				   5,1,1,
    				   6,1,1,
    				   7,1,1,
    				   6,1,1,
    				   5,1,1,
    			       3,1,1,
    				   3,1,1,
    				   3,1,1,
    				   2,1,1,
    				   2,1,1,
    				   2,1,2,
    				   0,1,2,
    				   5,1,1,
    				   5,1,1,
    				   5,1,1,
    				   3,1,1,
    				   2,1,1,
    				   2,1,1,
    				   1,1,1,
    				   1,1,1,
    				   2,1,1,
    				   1,1,1};		   
    code uchar TH_0[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 
                        0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
                        0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
                        0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;
                 
    code uchar TL_0[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
                        0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
                        0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 
                        0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
    void delay(uchar t)		  
    {
    	uchar t1;
    	unsigned long t2;
    	for(t1=0;t1<t;t1++)
    	{
    		for(t2=0;t2<8000;t2++);
    	}
    }
    
    void Lcd1602_Delay1ms(uint c)   //误差 0us
    {
        uchar a,b;
    	for (; c>0; c--)
    	{
    		 for (b=199;b>0;b--)
    		 {
    		  	for(a=1;a>0;a--);
    		 }      
    	}
        	
    }
    
    void LcdWriteCom(uchar com)	  //写入命令
    {
    	LCD1602_E = 0;     //使能
    	LCD1602_RS = 0;	   //选择发送命令
    	LCD1602_RW = 0;	   //选择写入
    	
    	LCD1602_DATAPINS = com;     //放入命令
    	Lcd1602_Delay1ms(1);		//等待数据稳定
    
    	LCD1602_E = 1;	          //写入时序
    	Lcd1602_Delay1ms(5);	  //保持时间
    	LCD1602_E = 0;
    }
    
    void LcdWriteData(uchar dat)			//写入数据
    {
    	LCD1602_E = 0;	//使能清零
    	LCD1602_RS = 1;	//选择输入数据
    	LCD1602_RW = 0;	//选择写入
    
    	LCD1602_DATAPINS = dat; //写入数据
    	Lcd1602_Delay1ms(1);
    
    	LCD1602_E = 1;   //写入时序
    	Lcd1602_Delay1ms(5);   //保持时间
    	LCD1602_E = 0;
    }
    
    void LcdInit()						  //LCD初始化子程序
    {
     	LcdWriteCom(0x38);  //开显示
    	LcdWriteCom(0x0c);  //开显示不显示光标
    	LcdWriteCom(0x06);  //写一个指针加1
    	LcdWriteCom(0x01);  //清屏
    	LcdWriteCom(0x80);  //设置数据指针起点
    }
    
    void LCD_Display(void)
    {
    	u8 i;
    
    	LcdWriteCom(0x00+0x80);
    	if(flag==1)
    	{
    		LcdWriteCom(0x01);  
    		for(i=0;i<11;i++)
    		{
    			LcdWriteData(moshi[i]);	
    		}
    
    	}
    	else
    	{
    		for(i=0;i<11;i++)
    		{
    			LcdWriteData(moshi1[i]);	
    		}
    		LcdWriteCom(0x40+0x80);
    		for(i=0;i<1;i++)
    		{
    			LcdWriteData(yindiao[c]);
    		}
    	} 
    
    }
    
    void check_key()  //按键函数
    {
    	P3=0xff;//先赋给P2组口高电平
    	switch(P3)//按下一个键
    	{
    		case 0xfe:key=7;c=0;TH0=TH_0[key];
    	TL0=TL_0[key];
    	TR0=1;break;
    		case 0xfd:key=8;c=1;TH0=TH_0[key];
    	TL0=TL_0[key];
    	TR0=1;break;
    		case 0xfb:key=9;c=2;TH0=TH_0[key];
    	TL0=TL_0[key];
    	TR0=1;break;
    		case 0xf7:key=10;c=3;TH0=TH_0[key];
    	TL0=TL_0[key];
    	TR0=1;break;
    		case 0xef:key=11;c=4;TH0=TH_0[key];
    	TL0=TL_0[key];
    	TR0=1;break;
    		case 0xdf:key=12;c=5;TH0=TH_0[key];
    	TL0=TL_0[key];
    	TR0=1;break;
    		case 0xbf:key=13;c=6;TH0=TH_0[key];
    	TL0=TL_0[key];
    	TR0=1;break;
    		default:beep=1;TR0=0;			   //没有按键按下关闭喇叭
    	}
    }
    void songd()				 //  音乐处理函数
    {
    	TH0=timer0h;
    	TL0=timer0l;
    	TR0=1;
    	delay(time);                       
    }
    
    
    
    
    void main(void)//主函数
    {
    	uchar k,i;
    	LcdInit();	
    	TMOD=1; 			//置CT0定时工作方式1
    	EA=1;
    	ET0=1;
    	flag=0;				//IE=0x82 //CPU开中断,CT0开中断 
    	while(1)												                          
    	{
    		if(swtich==0)
    		{
    			flag=1;
    			i=0;
    			LCD_Display();  
    			while(i<75)				  //音乐数组长度 ,放完循环播放  
    			{              
    				k=song[i]+7*song[i+1]-1;
    				timer0h=TH_0[k];
    				timer0l=TL_0[k];
    				time=song[i+2];
    				i=i+3;
    				songd();
    				if(swtich==1)
    					break;
    			}
    		}
    		else
    		{
    			flag=0;
    			check_key();
    			LCD_Display();		
    		}
    	} 
    }
    void t0int() interrupt 1		//定时器中断函数
    {
    	if(flag==1)
    	{
    		TR0=0;
    		beep=~beep;
    		TH0=timer0h;
    		TL0=timer0l;
    		TR0=1;
    	}
    	else
    	{
    		beep=~beep;
    		TH0=TH_0[key];
    		TL0=TL_0[key];
    
    	}
    }
    

    数组song[]中存放我们想要播放的歌曲每三个数代表音乐简谱中的一个音的音调,节拍,时间(本人对音乐不是很了解,求指正),可以通过改变数组的长度和内容来存放不同的音乐。
    可通过开关切换至弹奏模式,通过按不同的按键来发出不同的音调(长按某个按键会一直发出其对应的音调,轻触按键即可)

    proteus仿真

    示例图片如下(播放元件选用喇叭播放出来的声音效果要比选用蜂鸣器的效果要好的多)。

    proteus仿真图
    亲测可用,如有错误望各位大佬不吝指正。

    展开全文
  • 8音键电子琴介绍: 该设计采用AT89C52(AT89C52数据手册)单片机作为主控制芯片,外接灯光闪烁功能和8音调键。共有8个音节和4个功能按键。可播放内置乐曲,可弹奏录音,采用24C02(24C02数据手册)芯片作为EEPROM存储...
  • 一款基于STC15F2K60S2单片机电子琴程序
  • 1.本设计采用AT89S52或STC89C51单片机作为主控制器 2.16个按键可以发出不同的音符,奏出美妙的音乐,同时还可以通过数码管显示当前音调。 3.通过按键的设置可以实现选歌和歌曲重放。 此项目已经写好了4首歌曲的播放...
  • 基于51单片机16音键电子琴设计.pdf
  • 使用C语言对51单片机进行控制,模拟电子琴发音源代码,通过本程序你可以学习一下如何定义键消抖延时函数、键扫描函数、定时器0中断服务子程序等,还可了解一下 调用键盘扫描函数、产生输出脉冲、设置计数初值等相关...
  • 主要功能:电子琴共有七个按键,当按不同的按键时 会发出七种不同的声音
  • 基于51单片机简易声光电子琴设计 泉州师范学院学年论文题 目: 基于 51 单片机电子设计制作-屏幕式声光电子琴学 院: 物理与信息工程学院 专业班级: 10 电子信息与科学技术 2 班 学 号: 100303099 姓 名: 涂锐烽 指导...

    基于51单片机简易声光电子琴设计

    泉州师范学院学年论文题 目: 基于 51 单片机电子设计制作-屏幕式声光电子琴学 院: 物理与信息工程学院 专业班级: 10 电子信息与科学技术 2 班 学 号: 100303099 姓 名: 涂锐烽 指导老师: 吴志伟 完成日期:2013 年 8 月 30 号1目录摘要………………………………………………………………………Abstract…………………………………………………………………….1. 引言…………………………………………………………………1.1 设计的目的…………………………………………………….1.2 设计的内容…………………………………………………….2. 系统硬件设计………………………………………………………2.1 原理图……………………………………………………………….2.2 系统板硬件连线…………………………………………………….2.3 主要芯片简介…………………………………………………2.4 LCD 显示器……………………………………………………2.5 三极管放大电路……………………………………………….2.6 时钟电路………………………………………………………2.7 复位电路………………………………………………………2.8 键盘方案………………………………………………………3. 系统软件设计……………………………………………………3.1 理论基础……………………………………………………………3.2 系统流程图…………………………………………………………4. 设计结果及分析…………………………………………………5. 总结……………………………………………………………….参考文献…………………………………………………………………附录 主要程序代码…………………………………………………….2摘要作为电气专业的学生,掌握电子琴的制作是很好检验我们所学知识应用。它所包含的知识基本上覆盖我们的模拟电子技术基础、数字电子技术基础、单片机基础等技术课程的重要章节。用电子琴可以演奏出各种美妙的音乐,而音乐是由音符组成,不同的音符又是由相应频率的振动产生,而用单片机来产生不同的频率非常方便,可以利用单片机的定时/计数器 T0 来产生这样方波频率信号.子琴的设计以 89C52 单片机作为系统的核心控制部分,通过制作硬件电路和软件的设计编写,然后进行软硬件的调试运行,最终达到设计电路的乐器演奏、点歌、存储及显示功能。可以用它来弹奏和播放乐曲。特点是设计思路简单、清晰,成本低。关键词:单片机;电子琴;按键;扬声器 Abstract: As students of electrical engineering, the production of master keyboard is a good test our knowledge applications. The knowledge it contains basically covering our Analog Electronics, Fundamentals of Digital Electronics, microcontroller-based technologies such as the important sections of the course. Keyboard can play a variety of wonderful music, and the music is composed by notes, the different notes turn, the corresponding frequency vibration generated with the microcontroller to generate different frequency is very convenient, the use of single-chip timer / counter T0 tothis square wave frequency signal design of the keyboard 89C52 microcontroller as the core of the system control section, prepared by production hardware and software design, and hardware and software debugging and running, and ultimately to design the circuit of musical instruments, song, storage and display capabilities. You can use it to play and play music. Characteristics are by simple, clear design ideas, low cost.Key words: single-chip; electronic organ; button; speaker3引言电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可代替的一部分。本文的主要内容是用STC89C52RC 单片机为核心控制元件,设计一个电子琴。以单片机作为核心,与按键,扬声器等模块组成核心主控制模块。本文主要对使用单片机设计简单电子琴进行了分析,并介绍了基于单片机电子琴系统的硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。本文分别从原理图,主要芯片,各模块原理及程序调试来详细阐述。一首音乐是许多不同的音阶组成的,而每一个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器 T0 来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。1.1 设计的目的巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对一个简易的八音符电子琴的设计,进一步加深对单片机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。1.2 设计的内容1. 通过八个按键,分别控制发出 do,re,mi,fa,sao,la,xi,do 八个音符。2. 显示屏上显示所按的键,如按下第一个键,屏幕上显示 do,当选择播放歌曲时,显示歌词。4系统硬件设计2.1 原理图图 2-12.2 系统板硬件连线系统板硬件连线如图 2-1 所示,发生模块,及 LCD 显示模块连线如下1. “单片机系统”的 P1.0 端口用导线连接到“音频放大模块”区域中的 SPK端口上;2. “单片机系统”的 P2.0---P

    展开全文
  • 详细内容找我哟
  • 51单片机源码程序
  • 51单片机模拟电子琴+Proteus仿真 Proteus仿真 示例程序 #include<reg51.h> #include<intrins.h> #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int /...
  • 本资源对应于博客“基于51单片机设计的简易电子琴
  • 基于51单片机的简易电子琴源码

    千次阅读 2021-05-20 05:24:33
    /*********************************************************************************************程序名: 8键电子琴C程序编写人: 杜洋编写时间: 2009年5月18日硬件支持: STC系列单片机 12MHz接口说明:修改...
  • 基于51单片机利用定时器设计的8音键电子琴
  • 51单片机制作电子琴

    2020-07-25 21:55:15
    本文给大家分享了一个51单片机制作电子琴代码。
  • 程序设计 #include<reg52.h> #define keyport P1 #define uchar unsigned char #define uint unsigned int uchar high,low; //定时器预装值的高8位和低8位 sbit speak=P3^0; sbit gao=P3^5; sbit di=P
  • 单片机电子琴keil代码

    2019-05-07 17:12:19
    单片机电子琴keil代码,有简单的流水灯还有天空之城的歌曲加上四乘四的矩阵按键发音。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 474
精华内容 189
关键字:

51单片机电子琴程序