用89C51单片机设计开发简易电子琴,能7个音,并存一首歌就好,要简单点的,做为课程设计用,急需!!!

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-29
单片机电子琴设计中怎么存音乐

如果是将按键产生的存起来,那么需要扩展RAM,将之存入到RAM中,如果是设计时需要的,那么写入到ROM中。

单片机简易电子钢琴 电子琴音乐芯片发音
功能描述:
1、四个音调,按键调节
2、指示灯显示当前音调
3、七个按键对应七个音节
4、音乐 IC 发音,驱动 8Ω 喇叭,比蜂鸣器滴滴滴好听多了
5、可根据顾客要求进行功能定制
☆ 已作出的实物优酷视频演示地址:
http://v.youku.com/v_show/id_XMzg3MjMwOTg3Ng

  //本程序的单片机晶振采用11.0592M
  #include <reg51.h>
  sbit speaker=P1^2;
  unsigned char timer0h,timer0l,time;
  //世上只有妈妈好数据表
  code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
  6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
  6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
  5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
  2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
  };
  // 音阶频率表 高八位
  code unsigned char FREQH[]={
  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 unsigned char FREQL[]={
  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(unsigned char t)
  {
  unsigned char t1;
  unsigned long t2;
  for(t1=0;t1<t;t1++)
  {
  for(t2=0;t2<8000;t2++)
  {
  ;
  }
  }
  TR0=0;
  }
  void t0int() interrupt 1
  {
  TR0=0;
  speaker=!speaker;
  TH0=timer0h;
  TL0=timer0l;
  TR0=1;
  }
  void song()
  {
  TH0=timer0h;
  TL0=timer0l;
  TR0=1;
  delay(time);
  }

  void main(void)
  {
  unsigned char k,i;
  TMOD=1; //置CT0定时工作方式1
  EA=1;
  ET0=1;//IE=0x82 //CPU开中断,CT0开中断
  while(1)
  {
  i=0;
  while(i<100){ //音乐数组长度 ,唱完从头再来
  k=sszymmh[i]+7*sszymmh[i+1]-1;
  timer0h=FREQH[k];
  timer0l=FREQL[k];
  time=sszymmh[i+2];
  i=i+3;
  song();
  }
  }
  }

  自己改改吧。。你说的不太清。。是不是还要用到键盘作为电子琴按键。。。。提问也有技巧的。。下次说清要求 所要结果 需要语言。。。

T0H EQU 30H
T0L EQU 31H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#01H
SETB ET0
SETB EA
LOOP:
MOV DPTR,#FREQ
MOV A,P2 ;控制高中低音区
MOV R1,#0
ANL A,#03H
JB ACC.0,LOOP01
MOV R1,#14
SJMP LOOP0
LOOP01:
JB ACC.1,LOOP0
MOV R1,#28
LOOP0:
JB P0.0,LOOP1 ;控制音频1234567
MOV A,R1
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP1:
JB P0.1,LOOP2
MOV A,R1
ADD A,#2
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#2
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP2:
JB P0.2,LOOP3
MOV A,R1
ADD A,#4
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#4
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP3:
JB P0.3,LOOP4
MOV A,R1
ADD A,#6
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#6
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP4:
JB P0.4,LOOP5
MOV A,R1
ADD A,#8
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#8
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP5:
JB P0.5,LOOP6
MOV A,R1
ADD A,#10
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#10
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP6:
JB P0.6,LOOP7
MOV A,R1
ADD A,#12
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#12
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP7:
CLR TR0
LJMP LOOP
;-----------------------------
T0ISR:
CLR TR0
MOV TH0,T0H
MOV TL0,T0L
SETB TR0
CPL P3.0
RETI
;-----------------------------
FREQ:
DB 0F2H,03DH ;低音1
DB 0F3H,0BDH ;低音2
DB 0F5H,014H ;低音3
DB 0F5H,0B1H ;低音4
DB 0F6H,0D0H ;低音5
DB 0F7H,0D1H ;低音6
DB 0F8H,0B5H ;低音7

DB 0F9H,01EH ;中音1
DB 0F9H,0DEH ;中音2
DB 0FAH,08AH ;中音3
DB 0FAH,0D8H ;中音4
DB 0FBH,068H ;中音5
DB 0FBH,0E8H ;中音6
DB 0FCH,05AH ;中音7

DB 0FCH,08FH ;高音1
DB 0FCH,0EFH ;高音2
DB 0FDH,045H ;高音3
DB 0FDH,06CH ;高音4
DB 0FDH,0B4H ;高音5
DB 0FDH,0F4H ;高音6
DB 0FEH,029H ;高音7
;-----------------------------
END

  • 89c51单片机程序设计!!!
    答:题目的要求可以理解为,将电压的变化以二进制数字的形式表示出来(即用发光 二极管来表示二进制数)。硬件需要单片机、发光二极管、ad转化器(如TLC549)下面提供一个例子。/ 文件名 : TLC549.c 描述 : TLC549是一个新型的AD转换器,具有8位的分辨率,具有控制简单,体积小的优点。/ include<re...
  • 89C51单片机 电子密码锁 汇编程序求解
    答:2016-01-19 求用89c51单片机,汇编语言,keil编写程序 电子密码锁... 2014-06-20 求基于51单片机的电子密码锁的C语言程序。急!!! 14 2016-11-28 求基于AT89C51单片机电子密码锁设计的程序和图 2012-07-03 急需要单片机AT89C51的16键单片机电子密码锁电路和C语... 2012-07-03 关于AT89C51单片机的电子密码锁...
  • 求89C51单片机程序,用C语言编写,利用外部中断
    答:方法类似,补写程序如下:include<reg51.h> define uint unsigned int define uchar unsigned char sbit LED=P0^0;sbit LED1=P0^1;void delay1ms (uint z){ uint x,y;for (x=z;x>0;x--)for (y=110;y>0;y--);} void exter() interrupt 2 { delay1ms(600);LED=0;delay1ms(200)...
  • 用C语言写一个基于单片机89c51的计算器程序,p1口为4*4键盘,P0口控制共 ...
    答:include <reg52.h>//包含头文件 define uchar unsigned char define uint unsigned int unsigned char const dofly[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//0-F,数码管来显示按下键的值。uchar keyscan(void); //主要的矩阵...
  • 编程加实践(单片机):求利用89C51 CPU编写红绿灯程序
    答:回答:^_^,安装一个KEILC程序,它的安装目录下面有一个交通灯的完整例子 ^_^
  • 求基于89C51单片机的秒表设计,用LCD1602显示。程序代码
    答:define LCD1602_FLAG define LCD1602_PORT P0 include<reg51.h> include<stddef.h> define uchar unsigned char sbit lcd1602_rs=P2^0;sbit lcd1602_e=P2^2;sbit lcd1602_rw=P2^1;sbit lcd1602_busy=P0^7;uchar str[]="StopWatch";uchar time,disdat[4];uchar dat,sec,key;void delay(uchar...
  • 急求一个由89C51单片机的代码!要求用4*4矩阵键盘控制LED矩阵输出0~9的...
    答://扫描法:逐行扫描查询 一般用在按键比较少的场合 int keyscan(){ unsigned char k k_temp;P1=0xf0; //低位置0,准备查询按键 k=P1; //取得当前P1口状态 if(k!=0xf0) //如果有变化则表示有按键按下 { delay(10); //延迟 消抖 k_temp=p1;if(k==k_temp) //确实...
  • 利用89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波...
    答:幅度的调节可以用双DA来做啊,也就是用另外一块DA来控制数据转换DA的基准电压。第二种方案:用单片机控制DDS芯片啊,比如用单片机控制AD9834,可以产生正弦波、方波、三角波,频率的调节就更简单了。幅度的调节也可以用双DA来实现,也可以先用电阻衰减再用运放放大,这样幅度就可以连续可调了。电路图和...
  • 如何用c语言编程实现用89c51单片机控制8个led灯像电子时钟那样显示...
    答:假设你单片机的p1口连了led灯:include sbit led = p1^0;//这是点第一位灯 int main(void){ while(1){ led = 0;//假设led灯为共阳极的 } return 0;} 点亮led灯的形式有很多,这里给出一种仅供参考
  • 急求用89C51单片机控制电机的程序啊?
    答:用单片机控制步进电机则需别依给四线定间脉冲电流电机便连续转起通改变脉冲电流间间隔实现转速控制;通改变给四线脉冲电流顺序则实现转向控制所设计电路图:C51程序代码:代码#include<AT89X51.h>staticunsignedintcount;staticunsignedintendcount;voiddelay();voidmain(void){count=0;P1_0=0;P1_1=0;P1_2=0;P1...