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

作者&投稿:苍梧彼 (若有异议请与网页底部的电邮联系)
51单片机简谱编码~

//  8键电子琴C程序 自己根据音节做个与简谱对应的表就可以了。
#include
sbit SPEAKER = P3^7;
#define KEY P1
unsigned char MUSIC;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={
64021,64103,64260,64400,//低音3开始
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178
};
void main(void){
TMOD=0x01;
ET0=1;
EA=1;
KEY = 0xff;
while(1){
if(KEY != 0xff){
switch (~KEY){//显示的列位置
case 0x01://
MUSIC = 7;
break;//
case 0x02://
MUSIC = 6;
break;//
case 0x04://
MUSIC = 5;
break;//
case 0x08://
MUSIC = 4;
break;//
case 0x10://
MUSIC = 3;
break;//
case 0x20://
MUSIC = 2;
break;//
case 0x40://
MUSIC = 1;
break;//
case 0x80://
MUSIC = 0;
break;//
}
STH0=tab[MUSIC]/256;
STL0=tab[MUSIC]%256;
TR0=1;
}else{
SPEAKER = 1;
TR0=0;
}
}
}
void t0(void) interrupt 1 using 0{
TH0=STH0;
TL0=STL0;
SPEAKER=~SPEAKER;
}

代码的格式,是由编程者设计的,并没有统一的规范。
下面的链接可供参考。
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/88bfff323ec42ef21b4cff09.html

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

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

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

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

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

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
void delay(uint x)
{
uchar i,j; //延时X毫秒
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void di(uchar x)
{
beep=0; //蜂鸣器发声音函数
delay(x);
beep=1;
}
void display(uchar z)
{
wela=1;
P0=0xfe;
wela=0;
P0=0xff;
dula=1;
P0=table[z];
dula=0;
}
void keyscan()
{uchar temp,key,i;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;

}
display(key);
for(i=0;i<4;i++)
{ if(key==i) di(30*i); }
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;

}
display(key);
for(i=4;i<8;i++)
{ if(key==i) di(30*i); }
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;

}
display(key);
for(i=8;i<12;i++)
{ if(key==i) di(30*i); }
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;

}
display(key);
for(i=12;i<16;i++)
{ if(key==i) di(30*i); }
}
}

}
void main()
{ P0=0;
while(1)
{
keyscan();
}
}
改变蜂鸣器的方波频率可以让他有不同的声音,就是改变di()函数里面的延时函数的数值

我擦 这个要用锁向环吧


51单片机C语言程序
\/\/为你增加了一个按键检测的函数。\/\/下列程序通过了实验测试。\/\/b1输出的周期大约0.9s。\/\/b2输出的周期大约0.6s。\/\/K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,\/\/按第一次触动开关时红灯亮、b1输出,\/\/按第二次绿灯亮、为b2输出,\/\/按第三次都关闭.include <reg51.h> d...

C语言的指针,在写51单片机程序用得上吗?
用得上,单片机的C语言只是针对单片机将部分地方优化了一下(关键字之类),语句的表述还是严格的C,指针的使用可以使程序更加的清晰,编写更加容易。“因为是只是为了写单片机的程序,不想开发软件.”你这话说的有问题,写单片机程序就是软件开发的一种。由此可见,你对单片机语言的概念还有逻辑错误,要学...

51单片机的c语言与传统的c语言有什么区别
区别还是有的,51单片机的C语言面向的是单片机,所以硬件方面的函数和定义更多,很多相同名称的函数其实意思是不完全一样的。比如printf函数,传统的C语言是格式化输出到显示器显示,而单片机则是通过串口将数据格式化传送出去。

往51单片机里写程序,用C语言写,写好后用什么软件编译并且写进去?_百度...
用keil软件写程序,编辑、编译、运行。程序没有问题后,用STC_ISP_V479下载程序

51单片机读p1口 c语言
C语言比汇编还简单 假设你想把P1读到变量b中 在开头#include "reg51.h"b=P1; \/\/这就可以了

51单片机编程,用C语言。
给你一个矩阵键盘的参考程序 行列扫描:通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下...

用C语言给51单片机编程时,怎样用P0口输出地址和数据?
只要C语句能保证编译出MOVX指令即可。你可以自行学习以下关键字的用法:pdata,xdata PBYTE,XBYTE 点到为止。剩下的自己去琢磨,Keil里面都能搜索到的。

51单片机程序c语言的
include<reg52.h> sbit key_1 = P3^7;\/\/按键对应这个口 sbit count = P3^3;\/\/外部中断触发端口是这个 unsigned int i,z;char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};\/\/流水灯对应这个的位操作 void delay(uint);void main(){EA=1;EX1=1;IT1=0;while(1)...

51单片机 C语言编程
再者,RTX,TDX两个脚应该是通信的脚,与通用IO口为复用的脚,要怎么用,怎么发送数据、接收数据就涉及到通信协议了,不同通信方式,工作方式就不一样了,具体(参考该单片机的datasheet)。建议先仔细阅读单片机的datasheet和该单片机的编程指南(如果有的话)希望能解决你的疑问 ...

51单片机的c语言 左移右移怎么用?想用来控制流水灯,请帮忙写个完整的c...
include "reg51.h" \/\/ 包含头文件 define uchar unsigned char void delay02s(void) \/\/ 延时0.2s子程序 { unsigned char i,j,k;for ( i=2;i>0;i-- )for (j=200;j>0;j-- )for (k=250;k>0;k-- );} void main (void) \/\/ 主函数 { uchar i,j;...

秀洲区15020194772: 51单片机C语言怎么编写电子琴的回放功能! -
哀枯糖尿: 存储回放,自己定义好一个格式存储,存储要记下的就是键值,力度,时间(包括按下和弹起),当前音色等等,然后播放时再解析下就好了.

秀洲区15020194772: 基于单片机与C语言的多功能电子琴设计 -
哀枯糖尿: 刚刚弄好的电子琴不过功能较为单一,可以通过液晶显示所按下的音符,可以通过接在P2.6管脚上的按钮播放一首完整的内置的歌曲,按接p1端口的任一按钮退出音乐播放(按住时间长些,然后松开);程序和仿真发你邮箱了

秀洲区15020194772: 跪求单片机中的电子琴"C语言程序实现的功能:能够录外
哀枯糖尿: 1. 实验任务(1. 由4X4 组成16 个按钮矩阵,设计成16 个音.(2. 可随意弹奏想要表达的音乐.2. 电路原理图图4.22.13. 系统板硬件连线(1. 把“单片机系统”...

秀洲区15020194772: 用51单片机 制作简易电子琴 的两个问题 -
哀枯糖尿: 内部大循环只要把扫描程序等需要不停执行的程序写在 while(1) { ......(这里) } 识别按键只要与按键相连的引脚检测到低电平即可 给你一个按键范例:假如按键接到单片机P2^0引脚 sbit K = P2^0; if(K == 0) { delay(5); //延时去抖 if(K == 0) //确定键按下 { while(!K); //判断松手 .....(功能函数) } }

秀洲区15020194772: 谁有21按键AT89S51单片机电子琴设计,程序最好是汇C语言的,能发出21个音阶. -
哀枯糖尿: 《单片机控制装置安装与调试》上册,有音乐演凑的详细内容. 思路: (1)用定时器中断来产生音频,每次中断,输出取反.定时器的初值决定了音频频率,其初值可先用变量来存放. (2)每个按键当按下时,打开定时中断,同时将按键对应音频的定时器初值存入变量中.按键释放后,关闭定时器,发音停止. (3)不同音频的初值,可先存入数组中,以提高运行效率.

秀洲区15020194772: 用单片机实现简易电子琴的课程设计 -
哀枯糖尿:说明:由单片机的P1.0口输出音频信号,在P1.0口接三极管以驱动喇叭,最好用两个三极管构成达林顿结构.P2口连接8个一端接地的按键作为输入,当然也需要连接8只10K的电阻至电源作为上拉电阻.P2.0~P2.7依次为Do、Re、Mi、Fa、...

秀洲区15020194772: 关于 单片机电子琴 C语言程序
哀枯糖尿: 这个问其实很简单 假如蜂鸣器连在P3^0口,可以对键盘进行扫描,然后用定时器处理,就可以,我做了个简单的程序,你可以参考一下,可以生成hex文件的,要的话,给个邮箱号,我给你发,粘在这里.问问不通过

秀洲区15020194772: 需要基于8051单片机的8键电子琴的C代码! -
哀枯糖尿: 首先你得编出8个键相应的音高和音调,分别对应信号的幅度和频率.需要键盘中断模块,用到51的外部中断来确定按键的序号,进入相应的中断处理程序,并驱动蜂鸣器发出对应频率的声音.大概步骤是这样的,具体的频率实现就是定时器那些,得反复调试才能出来合适的声音,c代码网上应该很多,大同小异!

秀洲区15020194772: 单片机编写8按键电子琴的C语言程序谁有?,发我一份,huangjiao1968@yahoo.com.cn,谢榭,急需学习用 -
哀枯糖尿: 这个是利用实验仪上提供的键盘,使数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出相应的音调.用8255的PA.0口发出音频脉冲,驱动喇叭.可以参考一下.#include <reg51.h>#define mode 0x82; xdata unsigned char Control _at_ ...

秀洲区15020194772: 请问一下,我用at89c51单片机做了个8键电子琴,请问下怎样实现播放音乐的功能 -
哀枯糖尿: 音乐播放和电子琴的功能完全是两回事. 要将音乐的做编码处理,然后存入芯片, 播放的时候,读取编码,还原音乐

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网