基于51单片机的简单电子琴代码

合集下载

51单片机电子琴程序

51单片机电子琴程序

#include<reg51.h>#include<absacc.h>#include<stdio.h>#include<math.h>#define uchar unsigned char#define uint unsigned intuchar STH0; //定时器计数初值uchar STL0;bit FY=0; //放乐曲时FY=1,电子琴弹奏时FY=0uchar Song_Index=0,Tone_Index=0; //放音乐的参数uchar k,key;sbit SPK=P3^7;sbit LED1=P1^0;sbit LED2=P1^1;uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6f,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79 ,0x71};uchar code Song[][50]={{1,2,3,5,7,8,4,3,4,3,4,5,4,6,3,4,5},{5,5,3,5,4,2,4,5,7,4,2,10,10,10,2,1,2,1,2,10,10},{5,5,10,9,8,5,5,5,5,10,9,8,6,6,6,11,12,9,6,8-1},{13,14,13,12,12,10,12,13,14,15,14,14},{6,6,11,10,9,12,12,12,12,13,12,11,9,8,10,10,10,-1},{9,13,13,13,13,8,13,13,13,13,14,15,14,13,13,14,12,13},};uchar code Len[][50]={{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,2,1,2,2,1,2,2},{1,1,1,1,1,1,2,1,1,1,2,2,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,2,0,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1,2,0,1,2,1,2,1,2,1,2,1,2},{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},}; //音符与计数值对应表uint code tab[]={0,63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283};void delay1(uint ms) //播放歌曲时实现节拍的延时函数{uchar t;while(ms--) for(t=0;t<120;t++);}//键消抖延时函数void delay(void){uchar i;for(i=300;i>0;i--);}//键扫描函数uchar getkey(void){uchar scancode,tmpcode;if((P0&0xf0)==0xf0)return(0);scancode=0xfe;while((scancode&0x10)!=0){P0=scancode; //输入行扫描码if((P0&0xf0)!=0xf0) //本行有键按下{tmpcode=(P0&0xf0)|0x0f;return((~scancode)+~(tmpcode));}else scancode=(scancode<<1)|0x01;}}//外部中断0void EX0_INT() interrupt 0{FY=0;LED1=1;LED2=0;}//外部中断1,这里是播放按键void EX1_INT() interrupt 2{FY=1;LED1=0;LED2=1;}//定时器0中断服务子程序void time0_int(void) interrupt 1 using 0{TH0=STH0;TL0=STL0;SPK=!SPK;P2=DSY_CODE[k];void main(void){LED1=1;LED2=0;P2=0x3f;IE=0x87;TMOD=0x01;IT0=1;IT1=1;while(1){P0=0xf0;if((P0&0xf0)!=0xf0){delay();if((P0=0xf0)!=0xf0){key=getkey();switch(key){case 0x11:k=0;break;case 0x21:k=1;break;case 0x41:k=2;break;case 0x81:k=3;break;case 0x12:k=4;break;case 0x22:k=5;break;case 0x42:k=6;break;case 0x82:k=7;break;case 0x14:k=8;break;case 0x24:k=9;break;case 0x44:k=10;break;case 0x84:k=11;break;case 0x18:k=12;break;case 0x28:k=13;break;case 0x48:k=14;break;case 0x88:k=15;break;default:break;}if(FY==0){STH0=tab[k]/256;STL0=tab[k]%256;TR0=1;while((P0&0xf0)!=0xf0);TR0=0;}else{while(FY==1){if(Song[k][Tone_Index]==-1)Tone_Index=0;STH0=(tab[Song[k][Tone_Index]])/256;STL0=(tab[Song[k][Tone_Index]])%256;P2=DSY_CODE[Song[k][Tone_Index]];TR0=1;delay1(300*Len[k][Tone_Index]);Tone_Index++;TR0=0;}}}}}}关于“世上只有妈妈好”的单片机音乐演奏程序2009-11-22 21:45单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。

51单片机简易电子琴

51单片机简易电子琴

51单片机简易电子琴因本人初学单片机程序过于简陋请见谅程序:#include<reg51.h>sbit P2_0=P2^0;sbit P1_0=P1^0;//sbit P3_0=P3^0;unsigned char temp;unsigned int tone1;unsigned int tone2;unsigned char yinfu[]={0xfb,0xe9, //Do0xfc,0x5c, //Re0xfc,0xc1, //Mi0xfc,0xef, //Fa0xfd,0x45, //So0xfd,0x92, //La0xfd,0xd0, //Si0xfd,0xee, //Do#0xfa,0x14, //So低0xfa,0xb9, //La低0xfb,0x4d, //Si低0x00,0x00 //音符之间的间隔,只要间隔时间小于65ms时,//喇叭不会发出声音,用作拍子之间的短暂停顿};void delay500us(void) //延时五百US{unsigned char a,b;for(b=71;b>0;b--)for(a=2;a>0;a--);}void anjian(void) 按键//按键扫描程序{P1=0xf0;temp=P1;if(temp!=0xf0) //按键扫描{delay500us(); //消抖动temp = P1;if(temp!=0xf0){P1=0xfe;temp=P1;if((temp&0xf0)!=0xf0) {switch(temp){case 0xbe:tone1=yinfu[15];tone2=yinfu[16];TR0=1;break;case 0xde:tone1=yinfu[14];tone2=yinfu[15];TR0=1;break;case 0xee:tone1=yinfu[12];tone2=yinfu[13];TR0=1;break;case 0x7e:break;default:break;}}P1=0xfd;temp=P1;if((temp&0xf0)!=0xf0) {switch(temp){case 0xbd:tone1=yinfu[10];tone2=yinfu[11];TR0=1;break;case 0xdd:tone1=yinfu[8];tone2=yinfu[9];TR0=1;break;case 0xed:tone1=yinfu[6];TR0=1;break;case 0x7d:break;default:break;}}P1=0xfb;temp=P1;if((temp&0xf0)!=0xf0) {switch(temp){case 0xbb:tone1=yinfu[4];tone2=yinfu[5];TR0=1;break;case 0xdb:tone1=yinfu[2];TR0=1;break;case 0xeb:tone1=yinfu[0];tone2=yinfu[1];TR0=1;break;case 0x7b:break;default:break;}}P1=0xf7;temp=P1;if((temp&0xf0)!=0xf0) {switch(temp){case 0xd7:break;case 0x77:break;case 0xb7:case 0xe7: //清零按键break;default:break;}}}}P1=0xf0;while(P1!=0xf0){while(P1!=0xf0);//等待放开按键// delay500us();}// P2_0=0;TR0=0; //关闭定时计数器0// P3_0=0;}void time0(void) {TMOD=0X01; P2_0=0;TH0=tone1;TL0=tone2;EA=1;ET0=1;TR0=0;}void main() {P2_0=0;P3_0=0;time0();while(1){anjian();//else//{//tone1=0xfc;//tone2=0x5c;//}}}void timer0(void) interrupt 1 using 1 //产生矩形波驱动蜂鸣器{static unsigned char f=1;if(f==1){f=0;P2_0=1;}else{f=1;P2_0=0;}TH0=tone1;TL0=tone2;}原理图:。

基于51单片机的简单电子琴代码

基于51单片机的简单电子琴代码

基于51单片机的简单电子琴代码#include <AT89X52.h>sbit P10=P1^0;//高音阶,红灯sbit P11=P1^1;//中音阶,黄灯sbit P12=P1^2;//低音阶,绿灯sbit P13=P1^3;//蜂鸣器控制端口sbit P31=P3^0;//低音阶按键行sbit P32=P3^1;//中音阶按键行sbit P33=P3^2;//高音阶按键行sbit P35=P3^4;//播放音乐按键unsigned int i,j,k=0,l=0;unsigned char count1=0xff,count0=0x50;/*********************************数码管码表(P0)***********************************/unsigned char Tab[]={0XBF,0X06,0X5B,0X4F,0X66,//数码管0~40X6D,0X7D,0X07,0X7F,0X6F,//数码管5~90X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//数码管A~F/************************************音阶控制**************************************/music_data_high[]={0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,//数组0~6 低音0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,//数组7~13 中音0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff};//数组14~20 高音music_data_low[]= {0xf3,0xb8,0x15,0xb9,0x4a,0xcf,0x0c,//数组0~6 低音0x44,0xac,0x09,0x34,0x82,0xc8,0x05,//数组7~13 中音0x4c,0x6d,0x94,0xad,0xd2,0xf3,0x02};//数组14~20 高音/******************************************************函数名:delayms*参数:n 延时毫秒数*功能:延时N毫秒*****************************************************/void delayms(unsigned char n){unsigned char a,b;for(a=100;a>0;a--)for(b=10*n;b>0;b--);}/******************************************************函数名:key_check*参数:无*功能:扫描按键并运行对应功能*****************************************************/void key_check(void){P2=0xff;P3=0xfe;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=1;P11=1;P12=0;switch(P2){case0xfe:EA=1;count1=0xf8;count0=0xf3;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xf9;count0=0xb8;P0=Tab[2];delayms(50);br eak;case0xfb:EA=1;count1=0xfa;count0=0x15;P0=Tab[3];delayms(50);bre ak;case0xf7:EA=1;count1=0xfa;count0=0xb9;P0=Tab[4];delayms(50);bre ak;case0xef:EA=1;count1=0xfb;count0=0x4a;P0=Tab[5];delayms(50);bre ak;case0xdf:EA=1;count1=0xfb;count0=0xcf;P0=Tab[6];delayms(50);bre ak;case0xbf:EA=1;count1=0xfc;count0=0x0c;P0=Tab[7];delayms(50);bre ak;defaule:break;}}}//else {EA=0;P13=1;}P2=0xff;P3=0xfd;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=1;P11=0;P12=1;switch(P2){case0xfe:EA=1;count1=0xfc;count0=0x79;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xfc;count0=0xbc;P0=Tab[2];delayms(50);bre ak;case0xfb:EA=1;count1=0xfd;count0=0x09;P0=Tab[3];delayms(50);br eak;case0xf7:EA=1;count1=0xfd;count0=0x44;P0=Tab[4];delayms(50);bre ak;case 0xef:EA=1;count1=0xfd;count0=0xa2;P0=Tab[5];delayms(50);break;case0xdf:EA=1;count1=0xfd;count0=0xd8;P0=Tab[6];delayms(50);br eak;case0xbf:EA=1;count1=0xfe;count0=0x05;P0=Tab[7];delayms(50);br eak;// defaule:break;}}}//else {EA=0;P13=1;}P2=0xff;P3=0xfb;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=0;P11=1;P12=1;switch(P2){case0xfe:EA=1;count1=0xfe;count0=0x4c;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xfe;count0=0x6d;P0=Tab[2];delayms(50);br eak;case0xfb:EA=1;count1=0xfe;count0=0x9f;P0=Tab[3];delayms(50);bre ak;case0xf7:EA=1;count1=0xfe;count0=0xad;P0=Tab[4];delayms(50);bre ak;case0xef:EA=1;count1=0xfe;count0=0xd2;P0=Tab[5];delayms(50);bre ak;case0xdf:EA=1;count1=0xfe;count0=0xf3;P0=Tab[6];delayms(50);bre ak;case0xbf:EA=1;count1=0xff;count0=0x02;P0=Tab[7];delayms(50);bre ak;// defaule:break;}}}if(P2==0xff) {EA=0;P13=1;}/******************************************************函数名:play_music*参数:无*功能:播放音乐*****************************************************/ void play_music(void){count1=music_data_high[0];count0=music_data_low[0]; EA=1;delayms(50);EA=0;delayms(5);}/******************************************************函数名:TIM0_init*参数:无*功能:定时器0初始化*****************************************************/ void TIM0_init(void){TMOD=0x01;TH0=count1;TL0=count0;EA=1;ET0=1;TR0=1;}void timer0(void) interrupt 1 using 0{TH0=count1;TL0=count0;P13=!P13;/***************************************************** *函数名:main*参数:无*功能:开跑程序*****************************************************/ void main(void){ P35=1;TIM0_init();//play_music();//while(1){ if(P35==0) {delayms(20);P35=1;play_music();} key_check();}}。

51单片机设计电子琴报告含代码

51单片机设计电子琴报告含代码

电子琴设计报告一、实验目的1.更深刻的了解、学习8051单片机的发声原理,利用定时器可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调。

2.其次,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平,由于定时参数不同,所以发出不同频率的脉冲。

3.进一步熟悉定时器的编程方法和定时初值的计算,进一步熟悉键盘扫描电路的工作原理和编程方法,了解单片机芯片的接口技术。

二、实验要求1.能够通过键盘演奏音符。

2.能够保存演奏的音乐,并实现回放。

3.有音调调整功能(如:C调,G调)。

4.自由发挥其他功能。

5.要求有单片机硬件系统框图,电路原理图,软件流程图。

三、实验基本原理简易电子琴有主控、蜂鸣器、键盘输入、电源四部分组成。

主控部分以AT89S52 为核心,用C 语言编程,充分运用AT89S52 的8k字节闪烁可编程可擦除只读存储器及其丰富的I/O 口,实现了对键盘数据的采集,和对蜂鸣器声音的控制;键盘输入部分采用4×4的键盘键盘输入,可以实现多个音调;供电部分可对整个电路进行供电。

经测试,整机基本实现预计功能,可以实现键盘演奏音符、调整音调、保存并回放的功能。

四、实验设计分析根据实验所要求实现的功能设计实现该项实验设计的软件电路及硬件电路。

五、实验要求实现A.电路设计1. 整体设计计划利用AT89S52 单片机的功能结合C 语言编程,实现电子琴播放音符等的简单功能,然后结合AT89S52 单片机的控制功能,利用蜂鸣器将输入表达出来,结合程序编制过程中,对各个I/O 的利用设置了键盘的扫描读入,结合电子琴需要多键位的现实,加入了4×4 键盘输入,达到了预期的效果。

2.分块设计1.控制模块AT89S52单片机是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含有8kb的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。

基于51单片机bluesky开发板的电子琴程序

基于51单片机bluesky开发板的电子琴程序

#include<STC12C5A60S2.h>#include<LCD1602.h> //包含LCD1602的显示函数等#include<KEY_SCAN.h> //包含键值扫描函数,输出key_num#define FSCLK 11059200 //晶振频率sbit BEEP=P1^4; //蜂鸣器输出脚unsigned int fre[16]={100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1 400,1500,1600};//存好预定的频率值,可以设定任意想要的频率/********************************************************** ********************** 函数功能:延时函数,函数名Delay_ms() ** 函数说明:利用软件延时,占用CPU,经调试最小单位大约为1ms ** 入口参数:time:需要延时的时间,单位ms** 出口参数:无void Delay_ms(unsigned int time)unsigned int i,j;for(i = 0;i < time;i ++)for(j = 0;j < 930;j ++);** 函数功能:定时翻转跟蜂鸣器相连的引脚的电平,输出一定频率的脉冲信号** 函数说明:定时器0中断服务函数** 入口参数:无** 出口参数:无void time0() interrupt 1 //使用定时器0的工作方式2,定时器中断服务程序TH0 = (65536-FSCLK/(12*fre[piano]))/256; //每次中断,重新配置定时器的高8位TL0 = (65536-FSCLK/(12*fre[piano]))%256; //每次中断,程序配置定时器的低8位BEEP=!BEEP; //然后取反音乐输出,输出一个反电平} //短时间内多次取反则输出一定频率的脉冲/********************************************************** ********************** 函数功能:主函数** 入口参数:无** 出口参数:无void main()unsigned char piano=0,key=0; //初始值LCD_1602_Init(); //液晶显示前进行初始化TMOD = 0X01; //定时器使能TH0 = (65536-FSCLK/(12*fre[0]))/256; //配置定时器的高8位TL0 = (65536-FSCLK/(12*fre[0]))%256; //配置定时器的低8位ET0 = 1; //允许定时器0中断EA = 1; //打开总中断Write_1602_String("Welcome",0X80); //开机显示欢迎语:WelcomeWrite_1602_String("By 20192305007",0X80+0x40); //显示作者:20192305007Delay_ms(5000); //延时5s后开始进入正式程序LCD_1602_Init(); //液晶屏初始化Write_1602_String("Happy Play",0X80); //显示开始使用:Happy Playwhile(1){ //在这段函数中,不断扫描键值,每当键值不等于0时,说明有键被按下,//此时开始播放对应的音阶。

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

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

基于51单⽚机的简易电⼦琴设计基于51单⽚机的简易电⼦琴设计⼀、设计任务及要求1、在该简易电⼦琴设计中,设置8个按键,8个按键可以发出do、re、mi、fa、sol、la、si、Do 8个⾳阶。

2、设计三个拨码开关,三个拨码开关可以调节⾼⾳、中⾳、低⾳三个⾳调。

3、画出电路的总体⽅框图和电路原理图。

⼆、设计原理⾳乐由许多不同的⾳阶组成的,⽽每个⾳阶对应着不同的频率,这样,我们就可以利⽤不同的频率组合,构成我们想要的⾳乐。

简易电⼦琴是摁下拨码开关时,单⽚机AT89C51会发出声⾳,声⾳从P1.0端⼝经过LM386,经过放⼤以后传⼊喇叭。

声⾳主要是经过单⽚机4×4矩阵键盘的按键产⽣,这⾥只⽤到8个按键来产⽣⾼中低的8个⾳阶,来产⽣do re mi fa sol la si Do。

下⾯是计数初值:三、设计⽅案本次设计的电⼦琴主要是利⽤AT89C51单⽚机为核⼼控制元件,同时还包括键盘、拨码开关和扬声器等控制模块,由键盘选择⼋个⾳阶。

1、电路原理图的总体设计总体电路需要c51单⽚机⼀⽚,⾳乐按键及喇叭等外围电路,要进⾏⾳调控制和⾳频放⼤,设计好的电路图如下图所⽰:2、键盘控制模块的设计矩阵按键部分由8个轻触按键按照2⾏4列排列,连接到P3端⼝。

将⾏线所接的单⽚机的I/O⼝作为输出端,⽽列线所接的I/O,则作为输⼊。

⾏线输出是低电平,有健按下,则输⼊线就会被拉低,这样,通过读输⼊线的状态就可得知是否有键按下。

3、键盘消抖当⽤⼿按下⼀个键时,如图所⽰,往往按键在闭合位置和断开位置之间跳⼏下才稳定到闭合状态的情况;在释放⼀个键时,也回会出现类似的情况。

这就是抖动。

抖动的持续时间随键盘材料和操作员⽽异,不过通常总是不⼤于10ms。

⽤软件⽅法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,此后再读⼊键盘码。

⼀个单⽚机⼯作于12M晶振,它的时钟周期是1/12(微秒)。

它的⼀个机器周期是12*(1/12)也就是1微秒。

C51简易电子琴代码

C51简易电子琴代码
//这个代码的结构非常简单,实现的内容也非常简单,只是单纯的通过七个按键让蜂鸣器
//发出七个音阶的音
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit fmq=P3^6;
sbit K1=P1^1;
sbit K2=P1^2;
sbit K3=P1^3;
sbit K4=P1^4;
sbit K5=P1^5;
sbit K6=P1^6;
sbit K7=P1^7;
void delay(uint j) //延时函数
{
uchar k;
while(j--)
{
for(k=0;k<115;k++);
}
}
void do1()//定义dao音
{
for(b=0;b<195;b++);
fmq=1;
for(b=0;b<195;b++);
}
}
void mi3()
{
uchar c;
uint x;
for(x=0;x<200;x++)
{
fmq=0;
for(c=0;c<174;c++);
fmq=1;
for(c=0;c<174;c++);
}
}
void fa4()
{
uchar d;
uint t;
for(t=0;t<200;t++)
{
fmq=0;
for(d=0;d<164;d++);

基于51单片机实现的电子琴设计

基于51单片机实现的电子琴设计

目录摘要 (3)Abstract (3)1绪论 (4)1.1背景 (4)1.2目的 (4)1.3 意义 (4)1.4基本理论依据和主要工作内容 (4)2 设计方案简述 (6)2.1键盘模块 (6)2.2发声模块 (6)2.3 8X8点阵显示模块 (6)2.4系统技术指标和预期功能 (7)3 详细设计 (8)3.1主要IC芯片介绍 (8)3.2硬件设计 (11)4 设计结果及分析 (19)4.1 测试 (19)5总结 (20)参考文献 (21)附录主要程序代码 (22)摘要单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来。

本设计阐述的主要内容是一种基于51 单片机的电子琴的设计,其核心芯片AT89S52 单片机,内部电路包括4X4行列式键盘模块、音频放大模块和8X8LED点阵显示模块,本系统运行稳定,功能较为完善,控制系统可靠,性价比较高等,具有一定的实用价值。

对于那些需要显示的信息量不是很大,分辨率不是很高,又需要制造成本相对比较低的场合,使用大、小屏幕LED点阵显示器是比较经济适用的,他可以显示字符、数字和简单图形,显示亮度较高,并且对环境条件要求比较低。

电子乐器的结构较为复杂,音源是由晶体管产生的电振动,并通过音色回路而产生各种音色;同时由周波数调制产生颤音效果,由振幅调制产生各种乐器的音效。

关键词:AT89S52单片机;音频放大模块;8X8点阵AbstractIts applications have become increasingly close to life, with a single chip to achieve a number of electronic design is becoming simpler. The main elements of the design described is based on 51 single-chip, the flower design, the core chip AT89S52 microcontroller Internal circuit including the 4X4 determinant keyboard module, audio amplifier module and 8X8LED dot matrix display module, the system is stable, function better, control system reliability, higher cost and so on, has some practical value. For those who need to display the amount of information is small, resolution is not high, they need to make the occasion a relatively low cost, using large and small screen, LED dot matrix display is more economical, and he can display characters, numbers and simple graphics, display brightness higher and lower demands on the environmental conditions. : The structure of more complex electronic instruments, the source is generated by the transistor electrical vibration, and sound loops generated by a variety of tone; also modulated by the frequency to produce vibrato effects, generated by the amplitude modulated sounds of various instruments.Keywords:AT89S52 Microcontroller;Audio Amplifier Module;8X8 matrix1绪论1.1背景单片机是随着大规模集成电路的出现极其发展,将计算机的CPU,RAM,ROM,定时/计数器和多种I/O接口集成在一片芯片上,形成了芯片级的计算机,因此单片机早期的含义称为单片微型计算机(single chipmicrocomputer).它拥有优异的性价比、集成度高、体积小、可靠性高、控制功能强、低电压、低功耗的显著优点.主要应用于智能仪器仪表、工业检测控制、机电一体化等方面,并且取得了显著的成果。

基于8255的51单片机电子琴设计

基于8255的51单片机电子琴设计

BUZZ EQU P1.0ORG 0000HLJMP STARTORG 000BHLJMP INT_T0ORG 0100HSTART:CLR EAMOV TMOD,#01H ;设置定时器0为工作模式1SETB ET0 ;开定时器0中断SETB EA ;开总中断CLR TR0 ;关闭定时器0MOV R1,#0FFHKE: LCALL KEYCJNE R1,#0FFH,KE2 ; 无键按下,返回startCLR TR0SJMP STARTKE2: CJNE R1,#1FH,KE1 ;MON键按下,音乐LJMP START0KE1: LCALL KEYCJNE R1,#09H,KEY2 ;K0键按下MOV 30H,#0FEH ;设置音阶7MOV 31H,#06HLJMP SET_TIMERKEY2: CJNE R1,#08H,KEY3 ;K1键按下MOV 30H,#0FEH ;设置音阶1MOV 31H,#022HLJMP SET_TIMERKEY3: CJNE R1,#0AH,KEY4 ;K2键按下MOV 30H,#0FEH ;设置音阶#1MOV 31H,#03DHLJMP SET_TIMERKEY4: CJNE R1,#0CH,KEY5 ;K3键按下MOV 30H,#0FEH ;设置音阶2MOV 31H,#056HLJMP SET_TIMERKEY5: CJNE R1,#01H,KEY6 ;K4键按下MOV 30H,#0FEH ;设置音阶#2MOV 31H,#06EHLJMP SET_TIMERKEY6: CJNE R1,#03H,KEY7 ;K5键按下MOV 30H,#0FEH ;设置音阶3MOV 31H,#085HLJMP SET_TIMERKEY7: CJNE R1,#05H,KEY8 ;K6键按下MOV 30H,#0FEH ;设置音阶4MOV 31H,#09AHLJMP SET_TIMERKEY8: CJNE R1,#00H,KEY9 ;K7键按下MOV 30H,#0FEH ;设置音阶#4MOV 31H,#0AEHLJMP SET_TIMERKEY9: CJNE R1,#02H,KEY10 ;K8键按下MOV 30H,#0FEH ;设置音阶5MOV 31H,#0C1HLJMP SET_TIMERKEY10:CJNE R1,#04H,KEY11 ;K9键按下MOV 30H,#0FEH ;设置音阶#5MOV 31H,#0D3HLJMP SET_TIMERKEY11:CJNE R1,#06H,KEY12 ;KA键按下MOV 30H,#0FEH ;设置音阶6MOV 31H,#0E4HLJMP SET_TIMERKEY12:CJNE R1,#07H,KEY13 ;KB键按下MOV 30H,#0FEH ;设置音阶#6MOV 31H,#0F4HLJMP SET_TIMERKEY13:CJNE R1,#0EH,KEY14 ;KC键按下MOV 30H,#0FFH ;设置音阶7MOV 31H,#03HLJMP SET_TIMERKEY14:CJNE R1,#0FH,KEY15 ;KD键按下MOV 30H,#0FFH ;设置音阶1MOV 31H,#011HLJMP SET_TIMERKEY15:CJNE R1,#0DH,KEY16 ;KE键按下MOV 30H,#0FFH ;设置音阶#1MOV 31H,#1FHLJMP SET_TIMERKEY16:CJNE R1,#0BH,KEY17 ;KF按下MOV 30H,#0FFH ;设置音阶2MOV 31H,#2BHLJMP SET_TIMERKEY17:CJNE R1,#10H,KEY18 ;TV/ME按下,停止LJMP STARTKEY18:CJNE R1,#12H,KEY19 ;EG/DL按下MOV 30H,#0FCH ;设置音阶低#1MOV 31H,#79HLJMP SET_TIMERKEY19:CJNE R1,#14H,KEY20 ;CLB键按下MOV 30H,#0FCH ;设置音阶低2MOV 31H,#0ADHLJMP SET_TIMERKEY20:CJNE R1,#16H,KEY21 ;EXEC键按下MOV 30H,#0FCH ;设置音阶低#2MOV 31H,#0DCHLJMP SET_TIMERKEY21:CJNE R1,#11H,KEY22 ;RG/FS键按下MOV 30H,#0FDH ;设置音阶低3MOV 31H,#0AHLJMP SET_TIMERKEY22:CJNE R1,#13H,KEY23 ;RW/IS键按下MOV 30H,#0FDH ;设置音阶低4MOV 31H,#33HLJMP SET_TIMERKEY23:CJNE R1,#15H,KEY24 ;COMP键按下MOV 30H,#0FDH ;设置音阶低#4MOV 31H,#5CHLJMP SET_TIMERKEY24:CJNE R1,#17H,KEY25 ;SCAL按下MOV 30H,#0FDH ;设置音阶低5MOV 31H,#82HLJMP SET_TIMERKEY25:CJNE R1,#18H,KEY26 ;FI/LS按下MOV 30H,#0FDH ;设置音阶低#5MOV 31H,#0A5HLJMP SET_TIMERKEY26:CJNE R1,#1AH,KEY27 ;EV/UN按下MOV 30H,#0FDH ;设置音阶低6MOV 31H,#0C7HLJMP SET_TIMERKEY27:CJNE R1,#1CH,KEY28 ;MOVE键按下MOV 30H,#0FDH ;设置音阶低#6MOV 31H,#0E7HLJMP SET_TIMERKEY28:CJNE R1,#1EH,KEY29 ;STEP键按下MOV 30H,#0FFH ;设置音阶高5MOV 31H,#60HLJMP SET_TIMERKEY29:CJNE R1,#19H,KEY30 ;F2/NX键按下MOV 30H,#0FFH ;设置音阶高#2MOV 31H,#37HLJMP SET_TIMERKEY30:CJNE R1,#1BH,KEY31 ;EC/EP键按下MOV 30H,#0FFH ;设置音阶高3MOV 31H,#042HLJMP SET_TIMERKEY31:CJNE R1,#1DH,NOKEY ;SRB键按下MOV 30H,#0FFH ;设置音阶高4MOV 31H,#4DHLJMP SET_TIMERSET_TIMER:SETB TR0 ;发声LJMP KENOKEY:CLR TR0 ;无键按下LJMP KESTART0:MOV 40H,#00HNEXT0: MOV A,40HMOV DPTR,#TABLEMOVC A,@A+DPTR ;查表取音调和节拍MOV R2,AJZ END0 ;为零,返回startANL A,#0FHMOV R5,A ;将节拍存入R5MOV A,R2SW AP AANL A,#0FHJNZ SING ;根据音调决定是否演奏.CLR TR0JMP D1SING: DEC AMOV 22H,A ;将音调存入22H.RL AMOV DPTR,#TABLE1MOVC A,@A+DPTR ;根据音调决定定时器初值.MOV TH0,A ;放入TH0MOV 21H,AMOV A,22HRL AINC AMOVC A,@A+DPTRMOV TL0,A ;放入TL0MOV 20H,ASETB TR0 ;启动定时D1 :LCALL KEYCJNE R1,#0FFH,D9LJMP STARTD9: CALL DELAYCJNE R1,#10H,D8LJMP STARTD8: INC 40HJMP NEXT0END0: CLR TR0JMP STARTINT_T0: ;T0中断服务程序CJNE R1,#1FH,D6PUSH ACCPUSH PSWMOV TL0,20H ;重赋初值.MOV TH0,21HCPL P1.0POP PSWPOP ACCSJMP D7D6:MOV TH0,30H ;定时器赋初值MOV TL0,31HCPL BUZZ ;输出方波D7:RETIKEY:MOV A,#81HMOV DPTR,#0FFFFHMOVX @DPTR,AKEY1:ACALL KSJNZ LK1ACALL DELAJMP ALSLK1:ACALL DELACALL KSJNZ LK2AJMP ALSLK2:MOV R3,#0FEHMOV R4,#00HLK:MOV DPTR,#0FFFDHMOV A,R3MOVX @DPTR,AINC DPTRMOVX A,@DPTRJB ACC.0,LONEMOV A,#00HAJMP LKPLONE:JB ACC.1,LTWOMOV A,#08HAJMP LKPLTWO:JB ACC.2,LTHEMOV A,#10HAJMP LKPLTHE:JB ACC.3,NEXTMOV A,#18HAJMP LKPLKP:ADD A,R4PUSH ACCLK4:ACALL DELACALL KSJNZ LK4POP ACCMOV R1,AKEND:RETNEXT:INC R4MOV A,R3JNB ACC.7,ALSRL AMOV R3,AAJMP LKALS: MOV A,#0FFHAJMP KENDDEL:MOV R7,#01HDEL1:MOV R6,#0FFHDJNZ R6,$DJNZ R7,DEL1RETKS:MOV DPTR ,#0FFFDHMOV A,#00HMOVX @DPTR,AINC DPTRMOVX A,@DPTRCPL AANL A,#0FHRETDELAY:MOV R7,#02H ;延时子程序D2: MOV R4,#50D3: MOV R3,#248DJNZ R3,$DJNZ R4,D3DJNZ R7,D2DJNZ R5,DELAYRET。

51单片机电子琴程序-11页word资料

51单片机电子琴程序-11页word资料

#include<reg51.h>#include<absacc.h>#include<stdio.h>#include<math.h>#define uchar unsigned char#define uint unsigned intuchar STH0; //定时器计数初值uchar STL0;bit FY=0; //放乐曲时FY=1,电子琴弹奏时FY=0uchar Song_Index=0,Tone_Index=0; //放音乐的参数uchar k,key;sbit SPK=P3^7;sbit LED1=P1^0;sbit LED2=P1^1;uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6f,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79 ,0x71};uchar code Song[][50]={{1,2,3,5,7,8,4,3,4,3,4,5,4,6,3,4,5},{5,5,3,5,4,2,4,5,7,4,2,10,10,10,2,1,2,1,2,10,10},{5,5,10,9,8,5,5,5,5,10,9,8,6,6,6,11,12,9,6,8-1},{13,14,13,12,12,10,12,13,14,15,14,14},{6,6,11,10,9,12,12,12,12,13,12,11,9,8,10,10,10,-1},{9,13,13,13,13,8,13,13,13,13,14,15,14,13,13,14,12,13},uchar code Len[][50]={{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,2,1,2,2,1,2,2},{1,1,1,1,1,1,2,1,1,1,2,2,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,2,0,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1,2,0,1,2,1,2,1,2,1,2,1,2},{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},}; //音符与计数值对应表uint code tab[]={0,63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283};void delay1(uint ms) //播放歌曲时实现节拍的延时函数uchar t;while(ms--) for(t=0;t<120;t++);//键消抖延时函数void delay(void)uchar i;for(i=300;i>0;i--);//键扫描函数uchar getkey(void)uchar scancode,tmpcode;if((P0&0xf0)==0xf0)return(0);scancode=0xfe;while((scancode&0x10)!=0)P0=scancode; //输入行扫描码if((P0&0xf0)!=0xf0) //本行有键按下tmpcode=(P0&0xf0)|0x0f;return((~scancode)+~(tmpcode));else scancode=(scancode<<1)|0x01; //外部中断0void EX0_INT() interrupt 0FY=0;LED1=1;LED2=0;//外部中断1,这里是播放按键void EX1_INT() interrupt 2FY=1;LED1=0;LED2=1;//定时器0中断服务子程序void time0_int(void) interrupt 1 using 0TH0=STH0;TL0=STL0;SPK=!SPK;P2=DSY_CODE[k];void main(void)LED1=1;LED2=0;P2=0x3f;IE=0x87;TMOD=0x01;IT0=1;IT1=1;while(1)P0=0xf0;if((P0&0xf0)!=0xf0)delay();if((P0=0xf0)!=0xf0)key=getkey();switch(key)case 0x11:k=0;break;case 0x21:k=1;break;case 0x41:k=2;break;case 0x81:k=3;break;case 0x12:k=4;break;case 0x22:k=5;break;case 0x42:k=6;break;case 0x82:k=7;break;case 0x14:k=8;break;case 0x24:k=9;break;case 0x44:k=10;break;case 0x84:k=11;break;case 0x18:k=12;break;case 0x28:k=13;break;case 0x48:k=14;break;case 0x88:k=15;break;default:break;if(FY==0)STH0=tab[k]/256;STL0=tab[k]%256;TR0=1;while((P0&0xf0)!=0xf0);TR0=0;elsewhile(FY==1)if(Song[k][Tone_Index]==-1)Tone_Index=0;STH0=(tab[Song[k][Tone_Index]])/256;STL0=(tab[Song[k][Tone_Index]])%256;P2=DSY_CODE[Song[k][Tone_Index]];TR0=1;delay1(300*Len[k][Tone_Index]);Tone_Index++;TR0=0;关于“世上只有妈妈好”的单片机音乐演奏程序2009-11-22 21:45单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。

基于51单片机的简易电子琴汇编程序实验报告

基于51单片机的简易电子琴汇编程序实验报告

单片机应用课程设计报告——简易电子琴电子信息科学与技术2013-2xxx单片机应用课程设计报告——简易电子琴xxx摘要本设计是一个基于AT89C52系列单片机的简易电子琴,通过硬件电路制作以及软件编译,设计制作出一个由按键电路、复位电路、数码管显示电路,定时器及蜂鸣器组成简易的电子琴。

通过键盘按键确定键号送去显示以及产生对应的频率的方波。

本次实验的难点是键盘的扫描程序设计,因为本次实验实用的键盘是通过P3.4-P3.7端口输入测试信号,从P3.0-P3.3端口进行检测的,涉及到端口的读入写出原理等问题,后来通过先送出F0数值使低四位处于读入状态,高四位处于输出状态等方法实现。

还有一个问题是如何使单片机产生确定频率的波形,后来利用定时器计时结束后的溢出信号,控制信号反转实现。

关键词:电子琴扫描式键盘数码管1、设计任务和要求1.1设计任务利用AT89C52单片机以及各种元器件自行设计编程制作一个简易电子琴。

1.2任务要求基本要求:利用查询式键盘,数字键1、2、3、4、5、6、7作为电子琴的按键,按键按下时发出Do、Re、Mi、Fa、So、La、Xi的声音。

在弹奏音乐的同时将音符显示在数码管上。

扩展要求:具备存储播放所弹奏的音乐的功能,用三个功能键进行切换状态:按一下按键控制是否进入存储状态。

;按键二控制是否进入演奏状态;按键三为复位键。

1.3方案论证(1)如何产生一定频率的方波信号首先我们知道,每一个音符都有一个固定的频率,当蜂鸣器根据不同频率的方波信号便会震动产生对应的音符。

其次要产生音频脉冲,只要算出某一音频的周期(1/f),然后将此周期除以2,即为半周期的时间,由于使用的是12MHz的晶振,所以每一个计数的脉冲长度为1us,脉冲的个数用半周期时间除以1us,用65536减去脉冲的个数便可以得到计数初值。

利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

基于51单片机实现简易电子琴

基于51单片机实现简易电子琴

2012年-2013年第二届“萌芽计划”报告题目名称:简易电子琴2013年3月目录一.问题重述 (3)二.方案比较 (3)1.方案说明 (3)2.方案比较 (3)三.原理简述 (4)1.用单片机产生音频脉冲 (4)2.音频功放 (4)四.电路原理图和说明以及主要元件说明 (5)1.硬件结构框图 (5)2.仿真电路原理图及说明 (5)3.主要元件及说明 (6)1).STC89C52单片机 (6)2).LM386 (7)3).矩阵式键盘 (8)4.软件设计 (8)五.实现的功能 (9)六.附件 (11)一.问题重述(一)任务设计一个简易的电子琴,实现发不同音调的功能。

(1)采用555做振荡器。

(2)通过扬声器(喇叭)发出不同频率的声音。

(二)要求二.方案比较1.方案说明方案一.用NE555做振荡器,产生不同频率发声。

方案二.用51单片机产生音频脉冲,通过扩音器发声;a.用独立链接式键盘做发声的按键;b.用矩阵式键盘做发声的按键;c.用三极管8050做音频功放电路;d.用LM386做音频功放电路;e.用蜂鸣器发声;f.用喇叭发声。

2.方案比较对于方案一,如果用555振荡器,则实现不了许多发挥的功能。

对于方案二,单片机功能强大,能实现许多的功能,再加上本身也在学习单片机知识,所以我们就选择了方案二而在是用独立链接是键盘还是用矩阵式键盘上,我们看到,独立链接是键盘需要占据单片机的I/O口数量多,而且不好排版,考虑到矩阵式键盘只需接单片机8个I/O口,而且有16个按键,可以实现的音调较多,所以我们选择了用矩阵式键盘在用8050还是用LM386的问题上,刚开始还没有很清晰的决定。

但是我们倾向于用LM386,虽然用8050做功放电路相对于LM386来说电路相对简单,但是用8050三极管不是太了解,再网上搜索资料后,我们感觉,用LM386显得高端一些,而且功放的电压增益在20~200V之间,可供选择的空间大,所以我们选择了用LM386.对于是用蜂鸣器发声还是用喇叭发声,之前买的开发板上有蜂鸣器,感觉那个声音太难听了,所以我们就选用了音色好一点的喇叭。

基于51单片机的液晶显示电子琴设计

基于51单片机的液晶显示电子琴设计

基于51单片机的液晶显示电子琴设计摘要单片机是一种集成电路芯片,是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口、中断系统和定时器/计数器等集成到一块硅片上构成一个小而完善的微型计算机系统。

单片机具有体积小、功耗低、速度快、控制能力强、扩展灵活和使用方便等优点,已渗透到我们生活的各个领域,广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制的领域。

音乐现在也成了人们生活的一部分,生活的压力,学习的压力,工作的压力,一切的不顺利可以在音乐声中放松下来,让人们心情舒畅,听着音乐放松心情,让我们提高生活质量。

本次课程设计是基于51单片机的简易电子琴系统设计。

电子琴是现代电子科技与音乐结合的产物,是一种键盘乐器。

本系统以STC89C52为主芯片,4*4矩阵键盘、1602液晶显示屏、扬声器等电路组成,完成显示输入信息、播放相应音符等基本功能。

关键词:STC89C52;LCD1602;电子琴系统Design Of Liquid Crystal Display Keyboard Based On51Single-chip MicrocomputerABSTRACTMCU is an integrated circuit chip,is the CPU,RAM,ROM,I/O interface, interrupt system and timer/counter,etc.integrated into a silicon chip to form a small and perfect micro-computer system.SCM has a small size,low power consumption,speed,control,strong,flexible and easy to expand and other advantages,has infiltrated all areas of our lives,widely used in instrumen -tation,household appliances,medical equipment,aerospace,special equipment of the intelligent management and process control areas.Music is now also a part of people's lives,the pressure of life,the pressure of learning,work pressure,everything is not smooth can relax in the music,let people feel comfortable,listening to music relax,let us improve the quality of life.This course design is based on the 51 single-chip simple keyboard system design.Keyboard is a combination of modern electronic technology and music products,is a keyboard instrument.This system is mainly composed of STC89C52 chip, 4*4 matrix keyboard,1602 LCD screen,speaker and other circuits to complete the display input information,play the corresponding notes and other basic functions.Keyword: STC89C52, LCD1602, keyboard system目录第一章引言 ........................................................................................................... - 1 -1.1 课题设计目的及其意义 ......................................................................... - 1 -1.2 课题设计的任务与主要内容 ................................................................. - 2 - 第二章系统总体方案设计.................................................................................. - 3 -2.1 系统设计要求 ......................................................................................... - 3 -2.2 系统电路框图 ......................................................................................... - 3 - 第三章硬件设计.................................................................................................. - 5 -3.1 STC89C52芯片 ....................................................................................... - 5 -3.2 1602LCD .................................................................................................. - 6 -3.3 矩阵键盘 ................................................................................................. - 7 -3.4 振荡电路 ................................................................................................. - 8 -3.5 复位电路 ................................................................................................. - 9 -3.6 扬声器模块 ........................................................................................... - 10 - 第四章软件设计与调试.................................................................................... - 11 -4.1 使用AltiumDesigner绘制电路图........................................................ - 11 -4.2 程序调试 ............................................................................................... - 11 - 第五章总结与致谢............................................................................................ - 13 -5.1 总结 ....................................................................................................... - 13 -5.2 致谢 ....................................................................................................... - 14 - 参考文献................................................................................................................ - 15 - 附录........................................................................................................................ - 17 - 附录A 实物图............................................................................................. - 17 - 附录B 程序代码......................................................................................... - 18 -第一章引言1.1 课题设计目的及其意义单片机(单片微型计算机)是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠等特点。

(完整word版)基于51单片机的电子琴设计

(完整word版)基于51单片机的电子琴设计

摘要随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。

我们都会抽空欣赏世界名曲,作为对精神的洗礼。

本论文设计一个基于单片机的简易电子琴。

电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。

它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经融入现代人们的生活中,成为不可替代的一部分。

本文的主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴。

以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有8个按键和扬声器。

本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高,具有一定的实用和参考价值。

关键词:AT89C51单片机;数码管;电子琴目录1 系统方案设计 (1)1.1 设计指标 (1)1.2 系统方案综述 (1)1.3 系统设计思路 (1)2 硬件设计 (2)2.1 电路图 (2)2.2 单片机AT89C51简介 (2)2.3 单片机的工作过程 (4)2.4 键盘电路 (5)2.5 显示电路 (6)2.6 声音电路 (7)3 系统软件设计 (8)3.1延时程序设计 (9)3.2定时器初始化及其中断函数 (10)3.3示例音乐播放程序 (10)3.4单独按键中断处理函数 (11)4 实验结果与分析 (11)4.1 Proteus软件简介 (11)4.2仿真调试 (12)5 设计心得 (14)6 参考文献 (14)附录 (15)附录A 元件清单、器件识别与检测 (15)附录B 程序源代码 (16)1 系统方案设计1.1 设计指标①设计一个简易的八音符电子琴,它可通过按键输入来控制音响。

②演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存曲目,并且在演奏完已存曲目后可自动复位。

1.2系统方案综述从系统实现的功能上来看,电子琴的设计主要利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出八个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键再发出另外一种音调的声音。

基于单片机的简易电子琴设计C语言编程

基于单片机的简易电子琴设计C语言编程

基于单片机的简易电子琴设计摘要电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。

它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

本文的主要内容是用AT89S51单片机作为核心控制元件,设计一个电子琴。

以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。

本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。

关键词:单片机键盘扬声器电子琴AbstractElectronic organ is a modern electronic music technology and the product is a new type of keyboard instruments. It played an important role in modern music. SCM has powerful control functions and flexible programming characteristics. It has converged with modern people's lives, become an irreplaceable part. The main content is AT89S51 control of the core components, design of a electronic organ. SCM as a host to the core, with the keyboard, speaker and other core modules. In the main control module has 16 keys and a speaker. The system is steady, its simple hardware circuits, software functions, reliability of control system and high cost performance is its advantages. It also has certain practical and reference value.Key words : SCM keyboard speaker electronic organ目录摘要................................................................................................................................................................ - 1 - Abstract.......................................................................................................................................................... - 2 - 目录.................................................................................................................................................................. - 3 -1 引言.............................................................................................................................................................. - 4 -2 原理图.......................................................................................................................................................... - 5 -2.1 系统板硬件连线.............................................................................................................................. - 6 -3 主要芯片简介.............................................................................................................................................. - 7 -3.1 AT89S51简介................................................................................................................................... - 7 -3.1.1 主要功能特性...................................................................................................................... - 8 -3.1.2 引脚功能.............................................................................................................................. - 8 -3.2 LM386................................................................................................................................................ - 9 -3.2.1 LM386的引脚图................................................................................................................. - 10 -3.2.2 音频放大器电路................................................................................................................ - 10 -3.3 LED数码管..................................................................................................................................... - 11 -4 模块原理.................................................................................................................................................... - 12 -4.1 4X4行列式键盘识别及显示......................................................................................................... - 12 -4.1.1 系统板上硬件连线设计.................................................................................................... - 12 -4.1.2 程序设计内容.................................................................................................................... - 14 -图4-2 行列式键盘电路............................................................................................................... - 14 -4.1.3 I/O并行口直接驱动LED显示 ......................................................................................... - 15 -4.1.4 键盘识别程序............................................................................................................................ - 18 -4.2 音乐产生的方法............................................................................................................................ - 24 -4.2.1 原理.................................................................................................................................... - 24 -4.2.2 程序框图............................................................................................................................ - 26 -4.2.3源程序:............................................................................................................................. - 27 -5 结束语........................................................................................................................................................ - 35 - 致谢.............................................................................................................................................................. - 36 - 参考文献........................................................................................................................................................ - 37 -1 引言单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。

51单片机c语言编写电子琴+音乐播放器

51单片机c语言编写电子琴+音乐播放器

此程序是51单片机c语言编写的电子琴+音乐播放器,当用杜邦线将P1^0管脚接地时,单片机就会放出《世上只有妈妈好》,将P1^1 管脚接地时单片机就播放《祝你生日快乐》,两者为高电平时进入电子钢琴模式,利用16个矩阵键盘发出相应的哆、瑞、米、发、索。

此文档的乐谱是借鉴别人的,因为本人是音乐白痴!这是我第一次发表,我希望能帮到有需要的人啦........#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit beep=P2^3; //定义蜂鸣器sbit music=P1^0; //music为低电平播放《世上只有妈妈好》(工作模式为音乐播放器),music1为低电平时播放祝你生日快乐,music、music1都为高电平时(工作模式为电子钢琴)sbit music1=P1^1;uchar timer0h,timer0l,time,key,flag; //flag==0时为电子钢琴模式,flag==1时为音乐播放器uchar code yuepu[]={ 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 }; //世上只有妈妈好乐谱uchar code yuepu1[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};//祝你生日快乐乐谱uchar code TH_0[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, // 28个音阶高八位频率表装进定时器高八位0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;uchar code TL_0[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, // 28个音阶低八位频率表装进定时器低八位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 song(){TH0=timer0h;TL0=timer0l; // 唱歌程序TR0=1;delay(time); //延时,让此音节播放的长短TR0=0; //关定时器,为下个音节响做准备}void delayms(uint x){uint i,j; //去抖延时for(i=x;i>0;i--)for(j=110;j>0;j--);}void keyscan() //检测十六个发出音乐按键函数{ uchar temp;P3=0xfe;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(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;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1;//使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xfd;temp=P3;temp=0xf0&temp;if(temp!=0x0f) // 检测第二行按键{ delayms(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;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xfb;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(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;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xf7;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(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;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}}void main(){uchar k,i;TMOD=1;EA=1;ET0=1;while(1){if(music&&music1) //当两个都为高电平时没有放音乐,扫描键盘{ flag=0;keyscan();}if(!music) //当P1^0管脚为低电平时,播放《世上只有妈妈好》{ flag=1;i=0;while(i<100) //音乐数组长度,唱完从头再来{if(music) //在播放音乐时P1^0为高电平时退出播放此歌曲{ beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开break;}k=yuepu[i]+7*yuepu[i+1]-1;timer0h=TH_0[k]; // 把对应的音乐频率放进定时器0timer0l=TL_0[k];time=yuepu[i+2]; //音乐节拍i+=3;song();}}if(!music1) // music为低电平时,播放《祝你生日快乐》{ flag=1;i=0;while(i<75) //乐谱的长度{if(music1){beep=1;break;}k=yuepu1[i]+7*yuepu1[i+1]-1;timer0h=TH_0[k];timer0l=TL_0[k];time=yuepu1[i+2];i+=3;song();}}}}void time0() interrupt 1{if(flag==0){beep=!beep; //电子琴模式时进入此语句TH0=TH_0[key];TL0=TL_0[key];}else{ beep=!beep;TH0=timer0h; //音乐播放器模式进入此语句TL0=timer0l;}}。

51单片机电子琴设计C语言设计实例

51单片机电子琴设计C语言设计实例

#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个 52 标准内核的头文件//char code dx516[3] _at_ 0x003b;//这是为了仿真设置的sbit BEEP=P1^7; //喇叭输出脚//sbit K1= P3^2;sbit K2= P3^5;sbit K3= P2^4;sbit K4= P2^5;uchar th0_f; //在中断中装载的 T0 的值高 8 位uchar tl0_f; //在中断中装载的 T0 的值低 8 位//T0 的值,及输出频率对照表uchar code freq[36*2]={0xA9,0xEF,//00220HZ ,1 //00x93,0xF0,//00233HZ ,1#0x73,0xF1,//00247HZ ,20x49,0xF2,//00262HZ ,2#0x07,0xF3,//00277HZ ,30xC8,0xF3,//00294HZ ,40x73,0xF4,//00311HZ ,4#0x1E,0xF5,//00330HZ ,50xB6,0xF5,//00349HZ ,5#0x4C,0xF6,//00370HZ ,60xD7,0xF6,//00392HZ ,6#0x5A,0xF7,//00415HZ ,70xD8,0xF7,//00440HZ 1 //12 0x4D,0xF8,//00466HZ 1# //13 0xBD,0xF8,//00494HZ 2 //14 0x24,0xF9,//00523HZ 2# //15 0x87,0xF9,//00554HZ 3 //16 0xE4,0xF9,//00587HZ 4 //17 0x3D,0xFA,//00622HZ 4# //18 0x90,0xFA,//00659HZ 5 //19 0xDE,0xFA,//00698HZ 5# //20 0x29,0xFB,//00740HZ 6 //21 0x6F,0xFB,//00784HZ 6# //22 0xB1,0xFB,//00831HZ 7 //23 0xEF,0xFB,//00880HZ `10x2A,0xFC,//00932HZ `1#0x62,0xFC,//00988HZ `20x95,0xFC,//01046HZ `2#0xC7,0xFC,//01109HZ `30xF6,0xFC,//01175HZ `40x22,0xFD,//01244HZ `4#0x4B,0xFD,//01318HZ `50x73,0xFD,//01397HZ `5#0x98,0xFD,//01480HZ `60xBB,0xFD,//01568HZ `6#0xDC,0xFD,//01661HZ `7 //35 };//定时中断 0,用于产生唱歌频率timer0() interrupt 1{TL0=tl0_f;TH0=th0_f; //调入预定时值BEEP=~BEEP; //取反音乐输出 IO}//按键控制音阶声音输出(电子琴)void main(void) // 主程序{ulong n;uchar code jie8[8]={12,14,16,17,19,21,23,24};//`1 八个音符在频率表中的位置TMOD = 0x01; //使用定时器 0 的 16 位工作模式TR0 = 0;ET0 = 1;EA = 1;while(1){if(!K1){tl0_f=freq[jie8[0]*2]; //置一个音符的值th0_f=freq[jie8[0]*2+1];TR0 = 1;for(n=0;n<10000;n++); //延时}if(!K2){tl0_f=freq[jie8[1]*2]; //置一个音符的值th0_f=freq[jie8[1]*2+1];TR0 = 1;for(n=0;n<10000;n++); //延时}if(!K3){tl0_f=freq[jie8[2]*2]; //置一个音符的值th0_f=freq[jie8[2]*2+1];TR0 = 1;for(n=0;n<10000;n++); //延时}if(!K4){tl0_f=freq[jie8[3]*2]; //置一个音符的值th0_f=freq[jie8[3]*2+1];TR0 = 1;for(n=0;n<10000;n++); //延时}TR0 = 0;}}/*******************************新的好用的电子琴*************************/#include<reg52.h>#include<intrins.h>#include<absacc.h>#define uchar unsigned char//#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit BEEP=P3^0;uchar rr;uchar k;uchar keydata;uchar th0_f; //在中断中装载的 T0 的值高 8 位uchar tl0_f; //在中断中装载的 T0 的值低 8 位uchar code freq[36*2]={0xA9,0xEF,//00220HZ ,1 //00x93,0xF0,//00233HZ ,1#0x73,0xF1,//00247HZ ,20x49,0xF2,//00262HZ ,2#0x07,0xF3,//00277HZ ,30xC8,0xF3,//00294HZ ,40x73,0xF4,//00311HZ ,4#0x1E,0xF5,//00330HZ ,50xB6,0xF5,//00349HZ ,5#0x4C,0xF6,//00370HZ ,60xD7,0xF6,//00392HZ ,6#0x5A,0xF7,//00415HZ ,70xD8,0xF7,//00440HZ 1 //120x4D,0xF8,//00466HZ 1# //130xBD,0xF8,//00494HZ 2 //140x24,0xF9,//00523HZ 2# //150x87,0xF9,//00554HZ 3 //160xE4,0xF9,//00587HZ 4 //170x3D,0xFA,//00622HZ 4# //180x90,0xFA,//00659HZ 5 //190xDE,0xFA,//00698HZ 5# //200x29,0xFB,//00740HZ 6 //210x6F,0xFB,//00784HZ 6# //220xB1,0xFB,//00831HZ 7 //230xEF,0xFB,//00880HZ `10x2A,0xFC,//00932HZ `1#0x62,0xFC,//00988HZ `20x95,0xFC,//01046HZ `2#0xC7,0xFC,//01109HZ `30xF6,0xFC,//01175HZ `40x22,0xFD,//01244HZ `4#0x4B,0xFD,//01318HZ `50x73,0xFD,//01397HZ `5#0x98,0xFD,//01480HZ `60xBB,0xFD,//01568HZ `6#0xDC,0xFD,//01661HZ `7 //35};//定时中断 0,用于产生唱歌频率timer0() interrupt 1{TL0=tl0_f;TH0=th0_f; //调入预定时值BEEP=~BEEP; //取反音乐输出 IO}//按键控制音阶声音输出(电子琴)void key_scan(void); //键盘函数定义段;uchar key_tab(uchar k);void delay(void);void key_in(uchar k);code unsigned char ledmap[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66,0x6D, 0x7D, 0x07, 0x7F, 0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00}; //8段显示//---------------------------------------------------------------void main(void){ //ulong n;uchar code jie8[8]={12,14,16,17,19,21,23,24};//`1 八个音符在频率表中的位置TMOD = 0x01; //使用定时器 0 的 16 位工作模式TR0 = 0;ET0 = 1;EA = 1;while(1){ P2=0x00;key_scan();tl0_f=freq[jie8[keydata]*2]; //置一个音符的值th0_f=freq[jie8[keydata]*2+1];TR0 = 1;//延时P0=ledmap[keydata];}}//---------------------------------------------------------------------------------------------void key_scan(void){ uchar sccode,recode,i;P1=0xf0;if((P1&0xf0)!=0xf0){delay();if((P1&0xf0) !=0xf0){sccode=0xfe;for(i=0;i<4;i++){P1=sccode;if((P1&0xf0) !=0xf0){recode=(P1&0xf0)|0x0f; k=(~recode)+(~sccode); rr=P1;key_in(k);break;}elsesccode=(sccode<<1)|0x01; }}}//do {ta=P2;}while(ta==rr);}void delay() //去抖动{int a=2500;while(--a);}void key_in(uchar k){ uchar ta;//uchar keydata;do {ta=P1;}while(ta==rr);keydata=key_tab(k);}//------------------------------------------------------------- uchar key_tab(uchar k){ uchar kb;switch(k){ case 0x11:kb=0x0c;break;case 0x21:kb=0x0d;break;case 0x41:kb=0x0e;break;case 0x81:kb=0x0f;break;case 0x12:kb=0x08;break;case 0x22:kb=0x09;break;case 0x42:kb=0x0a;break;case 0x82:kb=0x0b;break;case 0x14:kb=0x04;break;case 0x24:kb=0x05;break;case 0x44:kb=0x06;break;case 0x84:kb=0x07;break; case 0x18:kb=0x00;break; case 0x28:kb=0x01;break; case 0x48:kb=0x02;break; case 0x88:kb=0x03;break; default :kb=0x00;break; }return kb;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
case 0xef:EA=1;count1=0xfb;count0=0x4a;P0=Tab[5];delayms(50);break;
case 0xdf:EA=1;count1=0xfb;count0=0xcf;P0=Tab[6];delayms(50);break;
case 0xbf:EA=1;count1=0xfc;count0=0x0c;P0=Tab[7];delayms(50);break;
case 0xef:EA=1;count1=
0xfd;count0=0xa2;P0=Tab[5];delayms(50);break;
case 0xdf:EA=1;count1=0xfd;count0=0xd8;P0=Tab[6];delayms(50);break;
*函数名:TIM0_init
*参数:无
*功能:定时器0初始化
*****************************************************/
void TIM0_init(void)
{
TMOD=0x01;
TH0=count1;TL0=count0;
EA=1;ET0=1;TR0=1;
case 0xfb:EA=1;count1=0xfe;count0=0x9f;P0=Tab[3];delayms(50);break;
case 0xf7:EA=1;count1=0xfe;count0=0xad;P0=Tab[4];delayms(50);break;
case 0xef:EA=1;count1=0xfe;count0=0xd2;P0=Tab[5];delayms(50);break;
sbit P31=P3^0;//低音阶按键行
sbit P32=P3^1;//中音阶按键行
sbit P33=P3^2;//高音阶按键行
sbit P35=P3^4;//播放音乐按键
unsigned int i,j,k=0,l=0;
unsigned char count1=0xff,count0=0x50;
defaule:break;
}
}
}
//else {EA=0;P13=1;}
P2=0xff;
P3=0xfd;
if(P2!=0xff)
{ delayms(20);
if(P2!=0xff)
{P10=1;P11=0;P12=1;
switch(P2)
{
case 0xfe:EA=1;count1=0xfc;count0=0x79;P0=Tab[1];delayms(50);break;
#include &lt;AT89X52.h&gt;
sbit P10=P1^0;//高音阶,红灯
sbit P11=P1^1;//中音阶,黄灯
sbit P12=P1^2;//低音阶,绿灯
sbit P13=P1^3;//蜂鸣器控制端口
for(b=10*n;b&gt;0;b--);
}
/*****************************************************
*函数名:key_check
*参数:无
*功能:扫描按键并运行对应功能
*****************************************************/
*功能:开跑程序
*****************************************************/
void main(void)
{ P35=1;
TIM0_init();
//play_music();
//
while(1)
{ if(P35==0) {delayms(20);P35=1;play_music();}
*函数名:delayms
*参数:n 延时毫秒数
*功能:延时N毫秒
*****************************************************/
void delayms(unsigned char n)
{unsigned char a,b;
for(a=100;a&gt;0;a--)
0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,//数组7~13 中音
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff};//数组14~20 高音
music_data_low[]= {0xf3,0xb8,0x15,0xb9,0x4a,0xcf,0x0c,//数组0~6 低音
/***************************
******数码管码表(P0)********
***************************/
unsigned char Tab[]={0XBF,0X06,0X5B,0X4F,0X66,//数码管0~4
0X6D,0X7D,0X07,0X7F,0X6F,//数码管5~9
0X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//数码管A~F
/***************************
*********音阶控制***********
***************************/
music_data_high[]={0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,//数组0~6 低音
}
void timer0(void) interrupt 1 using 0
{
TH0=count1;TL0=count0;
P13=!P13;
}
/*****************************************************
*函数名:main
*参数:无
case 0xfd:EA=1;count1=0xf9;count0=0xb8;P0=Tab[2];delayms(50);break;
case 0xfb:EA=1;count1=0xfa;count0=0x15;P0=Tab[3];delayms(50);break;
case 0xf7:EA=1;count1=0xfa;count0=0xb9;P0=Tab[4];delayms(50);break;
case 0xdf:EA=1;count1=0xfe;count0=0xf3;P0=Tab[6];delayms(50);break;
case 0xbf:EA=1;count1=0xff;count0=0x02;P0=Tab[7];delayms(50);break;
// defaule:break;
key_check();
}
}
{ delayms(20);
if(P2!=0xff)
{P10=0;P11=1;P12=1;
switch(P2)
{
case 0xfe:EA=1;count1=0xfe;count0=0x4c;P0=Tab[1];delayms(50);break;
case 0xfd:EA=1;count1=0xfe;count0=0x6d;P0=Tab[2];delayms(50);break;
void play_music(void)
{
unt0=music_data_low[0];
EA=1;delayms(50);EA=0;delayms(5);
}
/*****************************************************
}
}
}
if(P2==0xff) {EA=0;P13=1;}
}
/*****************************************************
*函数名:play_music
*参数:无
*功能:播放音乐
*****************************************************/
0x44,0xac,0x09,0x34,0x82,0xc8,0x05,//数组7~13 中音
0x4c,0x6d,0x94,0xad,0xd2,0xf3,0x02};//数组14~20 高音
/*****************************************************
case 0xbf:EA=1;count1=0xfe;count0=0x05;P0=Tab[7];delayms(50);break;
// defaule:break;
}
}
}
//else {EA=0;P13=1;}
P2=0xff;
P3=0xfb;
if(P2!=0xff)
case 0xfd:EA=1;count1=0xfc;count0=0xbc;P0=Tab[2];delayms(50);break;
case 0xfb:EA=1;count1=0xfd;count0=0x09;P0=Tab[3];delayms(50);break;
case 0xf7:EA=1;count1=0xfd;count0=0x44;P0=Tab[4];delayms(50);break;
void key_check(void)
{
P2=0xff;
P3=0xfe;
if(P2!=0xff)
相关文档
最新文档