能发出调子的c语言程序,求关于单片机的电子琴C程序
1. 实验任务
(1. 由4X4 组成16 个按钮矩阵,设计成16 个音。
(2. 可随意弹奏想要表达的音乐。
2. 电路原理图
图4。22。1
3. 系统板硬件连线
(1. 把“单片机系统”区域中的P1。
0 端口用导线连接到“音频放大模块”区
域中的SPK IN 端口上;
102
(2. 把“单片机系统“区域中的P3。0-P3。7 端口用8 芯排线连接到“4X4 行
列式键盘”区域中的C1-C4 R1-R4 端口上;
4. 相关程序内容
(1. 4X4 行列式键盘识别;
(2. 音乐产生的方法;
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我
们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片
机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0 来产生这
样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
现在以单片机12MHZ 晶振为例,例出高中低音符与单片机计数T0 相关的计数值
如下表所示
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应
的数据
低音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
音符频率(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
103
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 调)
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
下面就用AT89S51 单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。其中T0 用来产生音符频率,T1
用来产生音拍。
5. 程序框图
图4。
22。2
6. 汇编源程序
KEYBUF EQU 30H
STH0 EQU 31H
STL0 EQU 32H
TEMP EQU 33H
曲调值DELAY 曲调值DELAY
调4/4 125ms 调4/4 62ms
调3/4 187ms 调3/4 94ms
调2/4 250ms 调2/4 125ms
104
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV TMOD,#01H
SETB ET0
SETB EA
WAIT:
MOV P3,#0FFH
CLR P3。
4
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK1
MOV KEYBUF,#0
LJMP DK1
NK1: CJNE A,#0DH,NK2
MOV KEYBUF,#1
LJMP DK1
NK2: CJNE A,#0BH,NK3
MOV KEYBUF,#2
LJMP DK1
NK3: CJNE A,#07H,NK4
MOV KEYBUF,#3
LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
105
MOVC A,@A DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK1A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK1A
CLR TR0
NOKEY1:
MOV P3,#0FFH
CLR P3。
5
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#4
LJMP DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#5
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#6
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#7
LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF
106
MOV DPTR,#TABLE
MOVC A,@A DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK2A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
CLR TR0
NOKEY2:
MOV P3,#0FFH
CLR P3。
6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#8
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#9
LJMP DK3
107
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#10
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#11
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK3A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
CLR TR0
NOKEY3:
MOV P3,#0FFH
CLR P3。
7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
108
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#12
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#13
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#14
LJMP DK4
NK15: CJNE A,#07H,NK16
MOV KEYBUF,#15
LJMP DK4
NK16: NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK4A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
CLR TR0
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
109
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
INT_T0:
MOV TH0,STH0
MOV TL0,STL0
CPL P1。
0
RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
TABLE1: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
END
7. C 语言源程序
#include
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;
110
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]%6;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_5=0;
111
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]%6;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
112
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]%6;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
113
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]%6;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
114
}
}
void t0(void) interrupt 1 using 0
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}。
全部
能发出调子的c语言程序,求关于单片机的电子琴C程序相关推荐
- c语言while求a和b的和程序,数据结构实验1_C语言_输入集合A和B求并集、交集、差集(while +...
数据结构实验1_C语言_输入集合A和B求并集.交集.差集(while + 数据结构实验1_C语言_输入集合A和B求并集.交集.差集(while + switch + 功能函数)) 实验1 (1)实验目 ...
- 编写一个c语言程序 求e的值,编写一个程序求e的值_相关文章专题_写写帮文库
时间:2019-05-15 01:58:18 作者:admin 3.2 代数式的值 做课人 尹圣军 [教学目标] 知识与技能 能解释代数式值的实际意义,了解代数式值的概念. 过程与方法 经历观察.实验 ...
- c语言控制继电器开合程序,求STC89c52单片机用倒计时控制继电器开、合的C语言程序,晶振12.000...
匿名用户 1级 2014-05-05 回答 这是数字时钟的C程序,如果要实现对继电器的开关控制,就可以在主程序中加入对时间的控制.也就是说,在你定义的某个时间上,继电器会实现开或者合的状态!由于单片机 ...
- PYTHON语言编写求最大公约数和最小公倍数的程序(更相减损法)
#更相减损术求GCD.py x,y=eval(input("请输入一个整数:")) t1,t2=x,y while True:a=abs(x-y)if a==min(x,y):br ...
- c语言单片机4*4键盘程序,求51单片机矩阵4*4键盘程序,P0口接一个数码管,P3口接矩阵键盘,C语言的...
#include unsigned char keyval,keynum=0; unsigned char distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0 ...
- 用c语言设计八路抢答器的犯规程序,求大神改八路抢答器程序
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 改成开始前抢答蜂鸣器响,红灯亮#include #define uint unsigned int #define uchar unsigned char ...
- rs232pc通信软件源码c语言,PC机与单片机通信(RS232 协议)程序
这有PC 机与单片机通信(RS232 协议)的资料希望对大家有用 [C语言源程序] #include"reg52.h" //包函8051 内部资源的定义 unsigned char ...
- 声源定位MATLAB的程序,求大神改一个声源定位程序 改成放置录音文件然后定位...
close all clc clear all c=340; fs=11025; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...
- C++中如何读取一个数的位数_C语言编写程序求水仙花数
C语言编写程序求水仙花数 水仙花数是一个数学问题,其实质是一个三位数,个位数的立方加十位数的立方加百位数的立方之和等于这个三位数本身.例如153=1*1*1+5*5*5+3*3*3,即153=1+12 ...
最新文章
- 「屋漏偏逢连夜雨」,Log4j 漏洞还没忙完,新的又来了
- java数据类型_java 数据类型
- 如何衡量目标检测模型的优劣
- DV录像带导出一定要用1394
- [译] Facebook杯2013年编程挑战赛——第一轮题目及答案
- linux 下对u盘分区吗,linux对中毒u盘分区和格式化
- FarMap诞生了!
- Eigen官网教程(1) Matrix相关
- jar 包的认识与处理、jar 文件 war 文件以及 ear 文件
- c++中的虚函数及虚函数表
- matlab中如何取正数,excel表格数据取正值-怎么把excel表格的负数变成正数
- pdf转换器免费版下载使用
- 计算机作业攒机单,计算机攒机作业.docx
- 观点动力学模型:主要理论与模型综述
- 什么是代理ip,代理ip的用途有哪些?
- 火车票是一门什么生意 「上篇」
- 微信昵称中表情保存到数据库问题
- Spark SQL实战(08)-整合Hive
- 关于大型网站技术演进的思考--存储的瓶颈
- MatlabSimulink开发STM32F4
热门文章
- 设计素材psd分层模板|临摹搞定促销海报版式!
- iframe带了token不显示_token是什么
- react 遍历对象_React 和 Vue 之间的相爱相杀
- 复制assert目录文件到私有目录_每天学点之CentOS文件/目录的权限
- WEB的发展历程、Tomcat服务器、与HTTP协议
- eBPF BCC 实现UNIX socket抓包
- GNS3 Windows安装
- linux: kill -9
- 微软将为Linux 操作系统带来TEE的支持:TEE(Trusted Execution Environment,可信执行环境)
- Java的native方法返回数组return Array(C语言)