导航:首页 > 操作系统 > 51单片机做电子琴代码

51单片机做电子琴代码

发布时间:2022-10-02 19:58:32

⑴ 基于51单片机的电子琴,用中断实现

可以在赋值后设置一个标志, 如果标志没有被清零, 就不再赋值, 如果中断产生了, 清除标志

⑵ 跪求一个51单片机开发板的电子琴程序

电子琴程序

信号发生器设计报告

电子琴程序

2009-08-30 13:47:34| 分类: 默认分类
| 标签: |举报 |字号大中小 订阅

电子琴程序发送部分:

/*
本程序是用AD9851的DDS模块做的电子琴,
电子琴的音符完整,共21个按键,分别是低1--7,中1--7,高1--7。本程序为双机通信的发送部分,可以显示频率
*/
#include <REG51.H> //
单片机内部专用寄存器定义
/**************************************/
sbit K1= P1^0; //
键K1输入引脚定义
sbit K2= P1^1; // 键K2输入引脚定义
sbit K3= P1^2; //
键K3输入引脚定义
sbit K4= P1^3; // 键K4输入引脚定义
sbit K5= P1^4; //
键K5输入引脚定义
sbit K6= P1^5; // 键K6输入引脚定义
sbit K7= P1^6; //
键K7输入引脚定义
sbit K8= P1^7; //
键K15输入引脚定义
/**************************************/
sbit K9= P2^0; //
键K8输入引脚定义
sbit K10= P2^1; // 键K9输入引脚定义
sbit K11= P2^2; //
键K10输入引脚定义
sbit K12= P2^3; // 键K11输入引脚定义
sbit K13= P2^4; //
键K12输入引脚定义
sbit K14= P2^5; // 键K13输入引脚定义
sbit K15= P2^6; //
键K14输入引脚定义
sbit K16= P2^7; //
键K16输入引脚定义
/**************************************/
sbit K17= P3^2; //
键K17输入引脚定义
sbit K18= P3^3; // 键K18输入引脚定义
sbit K19= P3^4; //
键K19输入引脚定义
sbit K20= P3^5; // 键K20输入引脚定义
sbit K21= P3^7; // 键K21输入引脚定义

/******************延时程序********************/
void delay(unsigned int
k)
{
unsigned int i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
/*****************串口初始化程序*****************/
void
init
(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
}
/*****************串口发送程序*****************/
void chuan(shu)
{
SBUF=shu;
TI=0;
}

/******************主程序********************/
void main(void)
{

init();
while(1)
{
if(K1==0) chuan(1);
else if(K2==0)
chuan(2);
else if(K3==0) chuan(3);
else if(K4==0) chuan(4);
else
if(K5==0) chuan(5);
else if(K6==0) chuan(6);
else if(K7==0)
chuan(7);
else if(K8==0) chuan(8);
else if(K9==0) chuan(9);
else
if(K10==0) chuan(10);
else if(K11==0) chuan(11);
else if(K12==0)
chuan(12);
else if(K13==0) chuan(13);
else if(K13==0)
chuan(13);
else if(K14==0) chuan(14);
else if(K15==0)
chuan(15);
else if(K16==0) chuan(16);
else if(K17==0)
chuan(17);
else if(K18==0) chuan(18);
else if(K19==0)
chuan(19);
else if(K20==0) chuan(20);
else if(K21==0)
chuan(21);
else chuan(0);
}
}

电子琴接收部分:

/*
本程序是用AD9851的DDS模块做的电子琴,
电子琴的音符完整,共21个音符,分别是低1--7,中1--7,高1--7。本程序为双机通信的接受部分。有直接演奏方式,录音演奏方式,录音后放音方式
,可以显示频率 */
#include <STC12C5410AD.H>

#include<intrins.h>
#include <stdio.h> /* prototype
declarations for I/O functions */

#define uchar unsigned char
#define uint unsigned int

sbit
E_CLK =P2^6;//clock input 同步时钟输入端
sbit RW_SID
=P2^5;//data input/output 串行数据输入、输出端
sbit RS_DI
=P2^4; // 4号脚 jichunqi input
sbit DataIn_AD9851=P2^3;
//控制子串传送位
sbit DDS_CLK=P2^2; //接外部晶振时钟 这里为30M
sbit
DDS_FQUD=P2^1; //更新发送频率
sbit RST_AD9851= P2^0; //复位

unsigned char Control_AD9851 = 0x01; // Phase0 ,power on mode and 6 REFCLK
Multiplier enable

/* T0_int 定时 时间常数 5ms=5000=1388H->EC78H f=12MH */
#define
time_5ms_H 0xC2 /* 定时时间为1/64s */
#define time_5ms_L 0xF7

char shu, bb;
unsigned char p=0;
unsigned char
point=0;
unsigned char recode_n=0;
unsigned char xdata
array[50]={0};
unsigned int xdata arrayt[50]={0};

float const
ton[]={0.00,261.63,293.67,329.63,349.23,391.99,440.00,494.00,

523.25,587.33,659.25,698.46,783.99,880.00,987.76,

1046.50,1174.66,1381.51,1396.92,1567.98,1760.00,1975.52};
unsigned int ttt,
nnn;
unsigned char mode=0;

sbit KEY_rec =P3^5;
sbit KEY_play=P3^7;
/*************************延时程序***************************/
void
delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{for(j=0;j<121;j++)
{;}}

}
/*************************串行发送一字节数据***************************/

void SendByte(unsigned char dat)
{
unsigned
char i;
RS_DI=1;
for(i=0;i<8;i++)
{

E_CLK=0;
if(dat&0x80)RW_SID=1;
else RW_SID=0;

E_CLK=1;
dat=dat<<1;
}
}

/*************************写控制命令***************************/
void
SendCMD(unsigned char dat)
{
SendByte(0xF8);//11111,00,0
RW=0,RS=0 同步标志
SendByte(dat&0xF0);//高四位

SendByte((dat&0x0F)<<4);//低四位
}
/************************写显示数据或单字节字符 ****************************/

void SendDat(unsigned char dat)
{

SendByte(0xFA);//11111,01,0 RW=0,RS=1
SendByte(dat&0xF0);//高四位

SendByte((dat&0x0F)<<4);//低四位
}
/************************显示字符串****************************/
void
hzkdis(unsigned char code *s)
{ while(*s>0)
{
SendDat(*s);
s++;
delay(5);
}
}

/************************显示数据子程序****************************/
void
Display(unsigned char x_add,unsigned long date,unsigned char dot)
{

unsigned char date0,date1,date2,date3,date4,date5;//;

date5=(date%1000000)/100000;
date4=(date%100000)/10000;

date3=(date%10000)/1000;
date2=(date%1000)/100;

date1=(date%100)/10;
date0=date%10;
SendCMD(x_add);
if(dot==0x02) //100---9999.99
{

SendDat(0x30+date5);

SendDat(0x30+date4);
SendDat(0x30+date3);

SendDat(0x30+date2);
SendDat(0x2e);
SendDat(0x30+date1);

SendDat(0x30+date0);
SendDat(0x48);
SendDat(0x7a);

}

}
/*************************设置AD9851频率***************************/
void
SentFreq(unsigned long int freq)
{
unsigned char i=0;
unsigned int
temp;
DDS_FQUD=0;
for(i=0;i<32;i++) //串口数据
输入频率控制字
{
DDS_CLK =
0;
temp=((freq>>i)&1);
DataIn_AD9851 = temp;
DDS_CLK =
1;
}

for(i=0;i<8;i++) //phase-b4 ph-b3 ph-b2 ph-b1 ph-b0 Power-down
Logic0* 6*REFCLK Multiplier_En
{
DDS_CLK = 0;

temp=((Control_AD9851>>i)&1);
DataIn_AD9851 = temp;

DDS_CLK = 1;
}
DDS_CLK = 0;
DDS_FQUD = 1;
DDS_FQUD =
0;

}

/**************************换算频率,并输出***********************/
void
Set_Freq(float Freqency)
{unsigned long int freq_temp;
freq_temp=
(unsigned long int)(23.861*Freqency); // SYSCLK = 180 MHz
2^32/180000000=23.861
SentFreq(freq_temp);
}
/*************************T0作定时器,T1作波特率发生器,初始化*************************/
void
init (void)
{
TMOD= 0x01; /* 0001$0001 T1 & T0 are 16bit
timers */
TH0 = time_5ms_H; /* T0 timer 5ms */
TL0 =
time_5ms_L;
/* TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 */

TCON= 0x10; /* 0 0 0 1 0 0 0 0 */

/* start T0 xint1 xint0 */
IE= 0x82; /* 1000 0010,
EA=ET0=1,
*/
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
ES=1;
EA=1;
}
/*************************设置AD9851初始化*************************/
void
AD9851Init(void) //DDS初始化函数,包括DDS复位和初始化为串行发送
{
DDS_CLK=0;

DDS_FQUD=0;
RST_AD9851=0;
RST_AD9851=1;//复位AD9851

RST_AD9851=1;
RST_AD9851=1;
RST_AD9851=0;
DDS_CLK=1;

DDS_CLK=0;
DDS_FQUD=1;

DDS_FQUD=0;
}
/**************************初始化LCM
**************************/
void initlcm(void)
{

delay(100);
SendCMD(0x30);//功能设置,一次送8位数据,基本指令集

SendCMD(0x0C);//0000,1100 整体显示,游标off,游标位置off
SendCMD(0x14);

SendCMD(0x01);//0000,0001 清DDRAM 即清屏

SendCMD(0x02);//0000,0010 DDRAM地址归位
SendCMD(0x80);//1000,0000
设定DDRAM 7位地址000,0000到地址计数器AC

//SendCMD(0xb8|page);翻页
}
/**********************主程序******************************/
void
main(void)
{
uchar t;

init();
AD9851Init();
initlcm(); //12864初始化程序
shu=0;

bb=255;
while(1)
{
switch(mode)
{
case 0: //
演奏方式

SendCMD(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
hzkdis("
音乐播放频率:");
if (shu!=bb)
{

Set_Freq(ton[shu]);
Display(0x93,(unsigned
long)100*ton[shu],0x02);
bb=shu;
}
if
(KEY_rec==0)
{
mode=1;

point=0;

recode_n=0;
shu=0;

bb=255;
nnn=0;

}
else if (KEY_play==0)
{

mode=2;
p=1;
}
break;
case
1: // 录音方式
// SendCMD(0x01);//0000,0001 清DDRAM 即清屏
//
delay(10);

SendCMD(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
hzkdis("
音乐录制频率:");
if (shu!=bb)
{

arrayt[point]=nnn; // 记录上一音阶时间

Set_Freq(ton[shu]);
Display(0x93,(unsigned long)100*ton[shu],0x02);

nnn=0;
bb=shu;
recode_n++;
}
if ((recode_n>=50) || (KEY_play==0))
//停止录音
{
Set_Freq(0.0);
p=0;

mode=0;
shu=0;

bb=20;
}
break;
case 2: //
放音方式

SendCMD(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
hzkdis("
音乐重播频率:");
for(t=0;t< recode_n;t++)
{

Set_Freq(ton[array[p]]);
Display(0x93,(unsigned
long)*ton[array[p]],0x02);
ttt=arrayt[p];
while
(ttt);
delay(100);
p++;
}
if
(p>recode_n)
{
Set_Freq(0.0);

p=0;
mode=0;

shu=0;
bb=20;
}

break;
}
}
}

//*==================================*/
/* 串口中断接收
*/
/*==================================*/
void s_receive() interrupt 4
//串行中断
{
if(RI==1) //接收中断标志位
{

RI=0; //中断标志清零
shu=SBUF; //RXData赋值
}
else
TI=0;
}

⑶ 电子琴要同时发出两个甚至更多的音符,用51单片机怎么做

这玩意两种实现方式吧。

一种简单点。

你本来就是通过频率驱动喇叭, 那你干脆驱动3个喇叭算了,发几个音就驱动几个。如果是3个和音,那就同时驱动三个。虽然傻逼,但是这个很简单,很容易做。

另外复杂点就是,你首先要能分析出来这三个音的和音的构成。由于是喇叭驱动的。所以音色可以不考虑,
那么就是音调,频率的事儿了。 这个在不同的频域上,混合叠加。产生新的波形。如果你能算出这个波形,ok,你可以合成这个

⑷ 用51单片机 制作简易电子琴 的两个问题

内部大循环只要把扫描程序等需要不停执行的程序写在
while(1)
{
。。。。。。(这里)
}

识别按键只要与按键相连的引脚检测到低电平即可
给你一个按键范例:
假如按键接到单片机P2^0引脚
sbit K = P2^0;

if(K == 0)
{
delay(5); //延时去抖
if(K == 0) //确定键按下
{
while(!K); //判断松手
。。。。。(功能函数)
}
}

⑸ 单片机简易电子琴程序

22. 电子琴
1. 实验任务
(1. 由4X4组成16个按钮矩阵,设计成16个音。
(2. 可随意弹奏想要表达的音乐。
2. 电路原理图

图4.22.1
3. 系统板硬件连线
(1. 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;
(2. 把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
4. 相关程序内容
(1. 4X4行列式键盘识别;
(2. 音乐产生的方法;
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示
音符 频率(HZ) 简谱码(T值) 音符 频率(HZ) 简谱码(T值)
低1 DO 262 63628 # 4 FA# 740 64860
#1 DO# 277 63731 中 5 SO 784 64898
低2 RE 294 63835 # 5 SO# 831 64934
#2 RE# 311 63928 中 6 LA 880 64968
低 3 M 330 64021 # 6 932 64994
低 4 FA 349 64103 中 7 SI 988 65030
# 4 FA# 370 64185 高 1 DO 1046 65058
低 5 SO 392 64260 # 1 DO# 1109 65085
# 5 SO# 415 64331 高 2 RE 1175 65110
低 6 LA 440 64400 # 2 RE# 1245 65134
# 6 466 64463 高 3 M 1318 65157
低 7 SI 494 64524 高 4 FA 1397 65178
中 1 DO 523 64580 # 4 FA# 1480 65198
# 1 DO# 554 64633 高 5 SO 1568 65217
中 2 RE 587 64684 # 5 SO# 1661 65235
# 2 RE# 622 64732 高 6 LA 1760 65252
中 3 M 659 64777 # 6 1865 65268
中 4 FA 698 64820 高 7 SI 1967 65283
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据
低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
DW 0,63731,63928,0,64185,64331,64463,0,0,0
DW 0,64580,64684,64777,64820,64898,64968,65030,0,0
DW 0,64633,64732,0,64860,64934,64994,0,0,0
DW 0,65058,65110,65157,65178,65217,65252,65283,0,0
DW 0,65085,65134,0,65198,65235,65268,0,0,0
DW 0
2、音乐的音拍,一个节拍为单位(C调)
曲调值 DELAY 曲调值 DELAY
调4/4 125ms 调4/4 62ms
调3/4 187ms 调3/4 94ms
调2/4 250ms 调2/4 125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。
5. 程序框图
贴不了.
7. C语言源程序
#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char temp;
unsigned char key;
unsigned char i,j;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};

void main(void)
{
TMOD=0x01;
ET0=1;
EA=1;

while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=1;
break;
case 0x0b:
key=2;
break;
case 0x07:
key=3;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}

P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=7;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}

P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=8;
break;
case 0x0d:
key=9;
break;
case 0x0b:
key=10;
break;
case 0x07:
key=11;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}

P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=12;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
}
}

void t0(void) interrupt 1 using 0
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}

根据自己的情况稍微改改就好了

⑹ 单片机电子琴代码

;电子琴
;P2口外接4*4键盘
ORG 0000H ;主程序起始
LJMP MAIN ;跳到MAIN主程序
ORG 000BH ;T0中断起始
LJMP TT0 ;跳到T0中断
MAIN:MOV TMOD,#01H ;设T0工作在方式1
MOV IE,#82H ;中断使能
SETB TR0 ;启动T0
W1:LCALL KEY ;调用KEY,是否有键盘按下
CLR EA ;中断屏蔽
JB F0,W1 ;没有按则F0=1,否则F0=1
MOV A,22H ;按下则取码指针存址
RL A ;乘2
MOV DPTR,#TABLE ;
MOVC A,@A+DPTR ;至TABLE取码,取T
MOV TH0,A ;取到的高位字节存入TH
MOV 21H,A ;取到的高位字节存入21H
MOV A,22H ;再载入取到的音符码
RL A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;至TABLE1取低位数值
MOV TL0,A ;取到的低位字节存入TL0
MOV 20H,A ;取到的低位字节存入20H
W2:LCALL KEY ;调用KEY,是否有键按下
SETB EA ;中断使能
JB F0,W1 ;有按下否?
JMP W2 ;有则跳到W2
KEY:SETB F0 ;设F0=1
MOV R3,#0F7H;扫描初值P23=0
MOV R1,#00H ;取码指针初值
W3:MOV A,R3 ;载入扫描指针
MOV P2,A ;输出至P2,扫描P23-P20
MOV A,P2 ;读入P2
CLR C ;
CPL C ;令C=1
MOV R5,#04H ;检测(P27-P24)
W4:RLC A ;右移一位(P27-P24)
JNC KEYIN ;检测行C=0,表按下
INC R1 ;没被按下则取码指针加1
DJNZ R5,W4 ;4列检测完毕了?
MOV A,R3 ;载入扫描指针
CLR C ;
CPL C ;令C=1
RRC A ;扫下一行,即下行为0
MOV R3,A ;存回R3扫描指针寄存器
JC W3 ;C=0表扫完
RET ;
KEYIN:MOV 22H,R1 ;取码指针存入22H地址
CLR F0 ;令F0=0
RET
TT0:PUSH ACC ;将A值存入堆栈
PUSH PSW ;将PSW值存入堆栈
MOV TL0,20H ;重新设计计数器
MOV TH0,21H ;
CPL P1.0 ;将P1.0反相
POP PSW ;至堆栈取回PSW值
POP ACC ;至堆栈取回A值
RETI ;返回主程序
TABLE:DW 64021,64103,64260,64400 ;.3
DW 64524,64580,64684,64777 ;.7
DW 64820,64898,64968,65030 ;4
DW 65058,65110,65157,65178 ;1.

⑺ 51单片机设计电子琴课程设计

http://code.21ic.com/code/31218
实现电子琴的功能,基于C51,通过7个按键,来发出7种音调,也可以做成水果键盘
21ic中国电子网站上有很多电子琴的源码,你可以去搜索一下。。

⑻ 在51单片机上用C语言实现电子琴功能,但同时数码管可以显示简谱,怎么编程

1,数据管显示就没什么了,找几个简单的数码管驱动程序改改就可以了,一般都是先选中数码管,然后设置值,就可以显示了,不过需要注意刷新,10ms刷新一个应该就可以了,刷新频率比较低的话会闪闪的,这个你应该明白。

2,蜂鸣器发do音,这个硬件实现我就不知道了,也许有硬件可以 编码控制自动生成对应频率的值。我想如果通过软件实现的话,不妨考虑一下定时器。假设do音是1000Hz的频率(没有查,不清楚,假设的),那么你可以控制定时器的触发频率为1000hz,触发一次,对应的输出到蜂鸣器的口的电平跳变一下,如果定时器的频率为1000hz的话,那么应该有500hz的频率,一个周期需要一高一低嘛!中断读取按键信号,分析按键,然后设定定时器的频率,启动定时器,设置一个响的时间,然后到时间关闭定时器,这样你按下k1就会发出一声do的声音,然后停了。

3,按键读取程序,中断或者查询方式,自己选择吧,别忘了延迟5ms左右再次读取按键,这个是消抖的。

4,建议模块化编程,先搞定按键的,然后搞定数码管的,然后搞定定时器的,然后再考虑如何把它们组合起来。好了不说了,说得有点多了,再说会我都回到大学时代了,哈哈。总之自己一点一点的做,应该不难,51熟练,c语言熟练,板子焊接的结构比较清晰的话,很快就可以搞定的。

5,还是建议你自己写一份各个模块的驱动的代码,例如按键的,数码管的,led的,温度传感器的,光敏的,蜂鸣器的,遥控器的,定时器的,中断的,等等等等模块(可以借鉴别人写的,自己一定要会),然后需要的时候,过来,改改就行,快而且bug少。建议keil c语言编程,用汇编编码太耗时了。

⑼ 51单片机程序 电子琴音阶

中央C的频率为261.62557 Hz,音程相差八度则频率相差一倍,例如C5的频率是C4的两倍。而电子琴键盘上相邻的键(包括黑键)的频率比为1:2^(1/12)。

⑽ 24键51单片机电子琴

您的P0,P2,P3 哪个是低音中音高音 在图上看不太清楚,我是按照P0,P2,P3的顺序来的
另外,第一个频率您确定不是220Hz?
仿真播放到电脑声卡听了一下,音准大体是对的。
LED的接法虽然能用,但不是太规范呀。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit out1 = P1^0;
sbit LED1 = P1^5;
#define LED_OFF 0
#define LED_ON 1
unsigned int t0_init_value;
unsigned char kv();
void set_out(unsigned char k);
void main(){
uchar kv0=0,kv1;
LED1 =LED_OFF;
TMOD=0x01;
TR0=0;
EA=1;
ET0=1;

while(1){
kv1=kv();
if(!kv1) {TR0=0;LED1 =LED_OFF;}
else if(kv0!=kv1){set_out(kv1);}
kv0=kv1;
}
}
unsigned char kv(){
unsigned char n=0,tmp1;
n=0;
if(tmp1=~P0){
while(tmp1){
n++;
if(tmp1&0x01){return n;}
tmp1>>=1;
}
return 0;
}
n=8;
if(tmp1=~P2){
while(tmp1){
n++;
if(tmp1&0x01){return n;}
tmp1>>=1;
}
return 0;
}
n=16;
if(tmp1=~P3){
while(tmp1){
n++;
if(tmp1&0x01){return n;}
tmp1>>=1;
}
return 0;
}
return 0;
}
const unsigned int freq_data[]={
0,
63390, // 233 why not 220?
63511,
63628,
63835,
64021,
64103,
64260,
64400,
64524,
64580,
64633,
64732,
64820,
64898,
64968,
65030,
65058,
65110,
65157,
65178,
65217,
65252,
65283,
65295,
} ;
void set_out(unsigned char k){
t0_init_value = freq_data[k];
TH0 =t0_init_value>>8;TL0=t0_init_value;
TR0=1;
}
void Timer0_isr() interrupt 1
{
TH0 =t0_init_value>>8;
TL0=t0_init_value;
out1=~out1;
LED1=out1;
}

阅读全文

与51单片机做电子琴代码相关的资料

热点内容
安卓源码编译输入脚本没反应 浏览:44
phpmysql自增 浏览:166
把ppt保存为pdf 浏览:533
汽车密封件加密配件 浏览:887
黑马程序员15天基础班 浏览:560
java调整格式 浏览:521
香港云服务器租用价 浏览:78
linuxsublime3 浏览:560
imac混合硬盘命令 浏览:277
沈阳用什么app租房车 浏览:857
00后高中生都用什么app 浏览:237
戴尔塔式服务器怎么打开独立显卡 浏览:807
医疗程序员招聘 浏览:597
住宿app可砍价是什么意思 浏览:133
java跳出语句 浏览:55
javastring个数 浏览:928
人工免疫算法应用 浏览:79
有什么app能收听俄罗斯广播电台 浏览:34
2015考研红宝书pdf 浏览:443
程序员几月跳槽合适 浏览:444