单片机电子琴模拟系统
单片机电子琴模拟系统
实验一:
电子琴模拟系统即电子琴模拟器当选择不同的按键时,扬声器发出不同音阶的声音,仪器的最基本组成部分应包括:扬声器、模数转换电路、单片机控制电路。 设计一个用蜂鸣器模拟电子琴演奏音乐的程序。产生e调8个音阶的振荡频率,它分别由1、2、3、4、5、6、7、0号数字键控制。
实物图连线如图所示:
汇编程序如下:
;电子琴 -----------连续型 查询式键盘;P3.2(INT0) 接扬声器;P1 键盘读入口 查询式
Pulse equ 10h ;脉冲
PulseCNT equ 50h ;脉冲计数
ToneHigh equ 40h ;高音调
ToneLow equ 41h ;低音调
Tone equ 42h ;音调
KeyBuf equ 54hSpeaker BIT P2.0ORG 0000Hljmp Startorg 000bhLJMP Timer0IntORG 0030H
Timer0Int: ;定时中断push PSWclr TR0mov TH0, ToneHighmov TL0, ToneLowsetb TR0mov C, PulseMOV Speaker,CCPL Pulsepop PSWretiToneTable:DW 64578,64686,64778,64821DW 64898,64968,65029TestKey:MOV P1, #0FFHMOV A, P1CPL A ; 读入键状态retKeyTable:DB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FH ; 键码定义
GETKEY:MOV R6,#10ACALL DELAYMOV A,P1CJNE A,#0FFH,K01 ;确有键按下LJMP MLOOP
K01: MOV R3,#8 ;8个键MOV R2,#0 ;键码MOV B,A ;暂存键值MOV DPTR,#KeyTable
K02: MOV A,R2MOVC A,@A+DPTR ;从键值表中取键值CJNE A,B,K04 ;键值比较MOV A,R2 ;得键码INC ARET
K04: INC R2 ;不相等,到继续访问键值表DJNZ R3,K02MOV A,#0FFH ;键值不在键值中,即多键同时按下LJMP MLOOPDelay: ; 延时子程序mov r7, #0
DelayLoop:djnz r7, DelayLoopdjnz r6, Delayret;#########################
Start:mov sp, #70hmov TMOD, #01 ; Timermov IE, #82h ; EA=1, IT0 = 1mov Tone,#0
MLoop:call TestKeyjz MLoopcall GetKeymov b, ajz MLoop ; = 0, < 1anl a, #8jnz MLoop ; > 8dec bmov a, brl a ; a = a*2mov b, amov dptr, #ToneTablemovc a, @a+dptrmov ToneHigh, amov TH0, amov a, binc amovc a, @a+dptrmov ToneLow, amov TL0, aSETB TR0MOV P1,#0FFH
WAIT:MOV A,P1CJNE A,#0FFH, WAITMOV R6,#10ACALL DELAYCLR TR0LJMP MLOOPEND
实验二
把VOICE接到P2.2,能弹奏一首简单的儿歌《两只老虎》,实物图连接如图所示:
C语言代码如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
sbit SDA1=P0^2;//串行数据输入,对应595的14脚SER
sbit SCL1=P0^1;//移位寄存器时钟输入,对应595的11脚SCK
sbit SCL2=P0^0;//存储寄存器时钟输入,对应595的12脚RCK
sbit W1=P0^3;
sbit W2=P0^4;
sbit k1=P1^0; //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
sbit k2=P1^1; //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
sbit k3=P1^2; //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
sbit k4=P1^3; //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
sbit k5=P1^4; //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
sbit k6=P1^5; //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
sbit k7=P1^6; //哆1 啦2 咪3 发4 嗦5 啦6 西7 哆
sbit D1=P2^6; //播放音乐模式
sbit D2=P2^7; //弹奏模式
sbit k8=P3^2; //功能切换键
sbit k9=P3^3; //低音
sbit k10=P3^4; //中音
sbit k11=P3^5; //高音
sbit beep=P2^2;//蜂鸣器接口
uchar code table1[]={ //共阴极数码管0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/0x37,/*N*///中音 0x38,/*L*///低音0x76,/*H*///高音0x79 /*E*/};
/格式为: 频率常数, 节拍常数, 频率常数, 节拍常数///
uchar code table2[]={ //音阶频率表 低八位 0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,};
uchar code table3[]={ 0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
uchar code table4[]={1,2,3,1, 1,2,3,1, 3,4,5, 3,4,5, 5,6,5,4,3,1, 5,6,5,4,3,1, 1,12/*低音5*/,1, 1,12,1};
uchar code table5[]={ //演奏歌曲延时表4,4,4,4, 4,4,4,4, 4,4,8, 4,4,8, 2,1,2,1,4,4, 2,1,2,1,4,4, 4,4,6, 4,4,6};
uchar i;
uchar key,aa=0;
uchar bb,cc;
bit flag=0;//延时子函数
void delay(uint z)
{uint x,y;for(x=z;x>0;x--)for(y=340;y>0;y--);
}
void in(uchar Data)
{uchar i;for(i=0;i<8;i++) //循环8次,刚好移完8位{Data<<=1;SCL1=CY;SDA1=1; //先将移位寄存器控制引脚置为低 _nop_();_nop_();SDA1=0;}
}
void out()
{SCL2=0; //先将存储寄存器引脚置为低_nop_(); SCL2=1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。_nop_(); SCL2=0;
}
//初始化子函数
void init()
{beep=0; //蜂鸣器关闭D1=1; //开始演奏音乐D2=0; //关闭弹奏功能EA=1; //开总中断TCON=0x01; //外部中断0设置为边沿触发
/* 以下是D7~D0 ,0x01=0000 0001 所以该函数相当于 IT0=1
TF1:定时器T1溢出标志位。当定时器T1溢出时,由硬件自动使TF1置1,并向CPU申请中断。CPU响应中断后,自动对TF1清零。TF1也可以用软件清零。
TR1:定时器T 1运行控制位。可由软件置1(或清零)来启动(或关闭)定时器T1,使定时器T1开始计数。用指令SETB TR1(或CLR TR1)使TR1置1(或清零)。
TF0:定时器T0溢出标志位。其功能与TF1相同。
TR0:定时器T0运行控制位。其功能与TR1相同。
IE1:外部中断1请求标志位。
IT1:外部中断1触发方式控制位。
IE0:外部中断0请求标志位。
IT0:外部中断0触发方式控制位。
*/ EX0=1; //开外部中断0ET0=1; //定时器0的中断打开ET1=1; //定时器1的中断打开TMOD=0x11; //定时器0,1工作在定时状态,均为方式1
}
//数码管显示子函数
void display1()
{in(table1[aa]); //再传段码out();W1=0;;delay(1); //延迟时间2ms以内W1=1;in(table1[cc+1]); //再传段码out();W2=0;delay(1); //延迟时间2ms以内W2=1;
}
//高低音选择子函数
void yinjie()
{if(k10==0){ delay(5);if(k10==0){ aa=10;bb=0;//返回10为seg[10]显示C}}if(k9==0){ delay(5);if(k9==0){ aa=11;bb=1;//返回11为seg[11]显示L}}if(k11==0){ delay(5);if(k11==0){ aa=12;bb=2;//返回12为seg[12]显示H}}if(aa==0){aa=13;}
}
//播放音乐子函数
void display_music()
{ TH0=table2[table4[i]-1]; //取频率常数 和 节拍常数 TL0=table3[table4[i]-1];while(flag==0){ if(i<32){TR0=1;delay(57*table5[i]);i++;}if(i==32) i=0;}
}
//演奏模式子函数
void display_play()
{TR0=0;TR1=0;yinjie();in(table1[aa]); //再传段码out();W1=0;;delay(1); //延迟时间2ms以内W1=1;if(aa!=13&&flag==1){ if(k1==0){ TH1=table2[7*bb+cc]; //取频率常数 和 节拍常数 TL1=table3[7*bb+cc];TR1=1; while(k1==0){ cc=0;display1();}}if(k2==0){ TH1=table2[7*bb+cc]; //取频率常数 和 节拍常数 TL1=table3[7*bb+cc];TR1=1;while(k2==0){ cc=1;display1();}} if(k3==0){ TH1=table2[7*bb+cc]; //取频率常数 和 节拍常数 TL1=table3[7*bb+cc];TR1=1;while(k3==0){ cc=2;display1();}}if(k4==0){ //取频率常数 和 节拍常数 TH1=table2[7*bb+cc];TL1=table3[7*bb+cc];TR1=1;while(k4==0){ cc=3;display1(); }}if(k5==0){ TH1=table2[7*bb+cc]; //取频率常数 和 节拍常数 TL1=table3[7*bb+cc];TR1=1;while(k5==0){cc=4;display1();}}if(k6==0){ TH1=table2[7*bb+cc]; //取频率常数 和 节拍常数 TL1=table3[7*bb+cc];TR1=1;while(k6==0){cc=5;display1(); }}if(k7==0){ TH1=table2[7*bb+cc]; //取频率常数 和 节拍常数 TL1=table3[7*bb+cc];TR1=1; while(k7==0){cc=6;display1(); }} }
}
//主函数
void main()
{init(); //初始化子函数while(1){ if(flag==0) display_music(); //演奏音乐else display_play(); //弹奏音乐}
}
//外部0中断子函数
void wb0() interrupt 0
{if(k8==0){delay(5);while(k8==0);flag=~flag;D1=~D1;D2=~D2;}
}
//定时器0中断子函数
void t0() interrupt 1
{ TR0=0;TH0=table2[table4[i]-1]; //取频率常数 和 节拍常数 TL0=table3[table4[i]-1];beep=~beep;TR0=1;
}
//定时器1中断子函数
void t1() interrupt 3
{ TR1=0;TH1=table2[7*bb+cc]; //取频率常数 和 节拍常数 TL1=table3[7*bb+cc];beep=~beep;TR1=1;
}
实验三
连接44矩阵式键盘,实物图连接如所示,可以使用44矩阵键盘自己演奏音乐
可以实现自动播放音乐,可以播放《两只蝴蝶》《生日快乐》《爱情买卖》。需要源代码第147行进行修改,把m=music1则播放《两只蝴蝶》;改成m=music2则播放《生日快乐》;改成m=music3则播放《爱情买卖》。源代码如下:
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
sbit beep = P3^2; //蜂鸣器定义
sbit K1=P2^7;//音乐播放按键
uchar flag_en = 0; //开始放歌
uchar flag_i = 0;
uint TT=0;sbit LED=P3^7;uchar num=0;//初始化num,用于控制数1码管显示的字符 //数码管段选定义 0 1 2 3 4 5 6 7 8 9 uchar code smg_du[]={0x28,0xee,0x34,0xa4,0xe2,0xa1,0x21,0xec,0x20,0xa0, // A B C D E F 不显示 0x60,0x23,0x39,0x26,0x31,0x71,0xbf}; //断码 uchar m,n; uchar code T[49][2]={{0,0},{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB}, {0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81} };uchar code music1[][2]={{0,4}, //两只蝴蝶 {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,24},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{21,24}, {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},{23,4},{26,4},{26,16},{26,4},{28,4},{26,4},{23,24},{21,4},{23,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{16,2},{19,2},{19,24},{0,20}, {26,4},{26,4},{28,4},{31,4},{30,4},{30,4},{28,4},{23,4},{21,4},{21,4},{23,16},{0,4},{23,4},{23,4},{26,4},{28,8},{28,12},{16,4},{23,4},{21,4}, {21,24},{23,4},{26,4},{26,4},{23,4},{26,8},{0,4},{31,8},{30,4},{28,4},{30,4},{23,8},{0,4},{28,4},{28,4},{30,4},{28,4},{26,4},{23,4},{21,8},{23,4},{21,4},{23,4},{26,16}, {0xFF,0xFF}}; uchar code music2[][2]={{0,4}, //生日快乐{17,6},{17,2},{19,8},{17,8},{22,8},{21,16},{17,6},{17,2},{19,8},{17,8},{24,8},{22,16},{17,6},{17,2},{29,8},{26,8},{22,8},{21,8},{19,8},{27,6},{27,2},{26,8},{22,8},{24,8},{22,16}, {0xFF,0xFF}}; uchar code music3[][2]={{0,4}, //爱情买卖 {22,4},{22,4},{17,4},{15,4},{15,4},{17,12}, {15,4},{15,2},{17,2},{15,4},{13,4},{13,4},{15,12},{0,4}, {20,4},{20,4},{20,4},{17,4},{20,4},{20,4},{20,4},{17,4}, {22,4},{17,4},{17,4},{15,4},{15,4},{17,12}, {22,4},{22,4},{17,4},{15,4},{15,4},{17,12}, {15,4},{15,2},{17,2},{15,4},{13,4},{13,4},{15,12}, {20,4},{20,4},{20,2},{17,2},{17,4},{20,4},{20,4},{20,2},{17,2},{17,2},{17,2}, {24,4},{20,4},{20,2},{17,2},{17,4},{20,4},{22,12}, {17,4},{22,4},{25,4},{25,4},{17,4},{22,4},{25,8}, {24,4},{22,2},{24,2},{22,4},{20,4},{15,4},{17,12}, {15,4},{15,4},{15,4},{10,4},{15,4},{17,4},{20,8}, {17,4},{24,4},{24,4},{20,4},{15,4},{17,12}, {17,4},{22,4},{25,4},{25,4},{17,4},{22,4},{25,8}, {29,4},{27,2},{29,2},{27,4},{25,4},{25,4},{27,12}, {29,4},{29,2},{27,4},{25,4},{27,6},{27,2},{25,4},{24,4}, {20,4},{20,2},{17,2},{20,4},{20,2},{22,2},{22,16}, {0xFF,0xFF}}; void delay(uchar p) { uchar i,j; for(;p>0;p--) for(i=181;i>0;i--) for(j=181;j>0;j--); } void pause(){ uchar i,j; for(i=150;i>0;i--) for(j=150;j>0;j--); } /***********************1ms延时函数*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i<q;i++) for(j=0;j<120;j++); } /******************按键程序*************************/uchar key_can;//按键值 void key() //独立按键程序 { static uchar key_new = 0, key_l; key_can = 20; //按键值还原 P2 = 0x0f;if((P2 & 0x0f) != 0x0f) //按键按下{ delay_1ms(1); //按键消抖动 if(((P2 & 0x0f) != 0x0f) && (key_new == 1)) { //确认是按键按下 key_new = 0; key_l = (P2 | 0xf0); //矩阵键盘扫描 P2 = key_l; switch(P2) { case 0xee: key_can = 0; m = 8; TT=0; flag_en=0;TR0 = 1; break; //得到按键值 //打开定时器 case 0xde: key_can = 1; m = 9; TT=0;flag_en=0;TR0 = 1; break; //得到按键值 case 0xbe: key_can = 2; m = 10;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0x7e: key_can = 3; m = 11;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xed: key_can = 4; m = 12;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xdd: key_can = 5; m = 13;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xbd: key_can = 6; m = 14;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0x7d: key_can = 7; m = 15;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xeb: key_can = 8; m = 16;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xdb: key_can = 9; m = 17;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xbb: key_can = 10; m = 18;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0x7b: key_can = 11; m = 19;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xe7: key_can = 12; m = 20;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xd7: key_can = 13; m = 21;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0xb7: key_can = 14; m = 22;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 case 0x77: key_can = 15; m = 23;TT=0;flag_en=0; TR0 = 1; break; //得到按键值 }P1 = smg_du[key_can]; //显示 while(P2 != 0x0f) P2 = 0x0f; TR0 = 0; //关闭定时器 } } else //按键松开 { P1 = 0xdf; //显示小数点 key_new = 1; } /*********************歌曲播放*********************/ K1=1 ; if(K1==0) { delay_1ms(10); //按键去抖动 if(K1==0) { num=8; // P1=smg_du[num];//使数码管显示该音调的字符 flag_en ++; flag_i = 0; if(flag_en > 3) { flag_en = 0; TR0 = 0; } while(!K1) { }//使蜂鸣器发出相应频率的声音; } }
} /******************主程序**********************/ void main() { P0 = P1 = P2 = P3 = 0xff; TMOD=0x11; EA=1; PT1=1; ET0=1; TR1=1; ET1=1; TH1=(65536-50000)/256; TL1=(65536-50000)%256; //定时器0初始化 while(1) { P1 = 0xdf; //显示小数点 key(); //按键程序 if(flag_en == 1) //爱情买卖 { m=music1[flag_i][0];n=music1[flag_i][1]; //放歌 P1 = smg_du[m % 16]; //显示 if(m==0x00) { TR0=0; beep = 1; delay(n); flag_i++; }else if(m==0xFF) //放歌结束 { TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;} else if(m==music1[flag_i+1][0]) { TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; } else {TR0=1;delay(n);flag_i++;} } else beep = 1 ; if(flag_en == 2) //生日歌 { m=music2[flag_i][0];n=music2[flag_i][1]; //放歌 P1 = smg_du[m % 16]; //显示 if(m==0x00) { TR0=0; beep = 1; delay(n); flag_i++; } else if(m==0xFF) //放歌结束 { TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;} else if(m==music2[flag_i+1][0]) {TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; } else {TR0=1;delay(n);flag_i++;} } else { beep = 1 ; }if(flag_en == 3) //新年好 { m=music3[flag_i][0];n=music3[flag_i][1]; //放歌 P1 = smg_du[m % 16]; //显示 if(m==0x00) { TR0=0; beep = 1; delay(n); flag_i++; } else if(m==0xFF) //放歌结束 { TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;} else if(m==music3[flag_i+1][0]) {TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; } else {TR0=1;delay(n);flag_i++;} } else { beep = 1 ; } } } /*****************定时器0中断*********************/ void T0_int() interrupt 1 { beep=!beep; TH0=T[m][0]; TL0=T[m][1]; } void T1_int() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; if(flag_en==0){ TT++; LED=!LED; if(TT>=100) { TT=0; flag_en++; //TR1=0; } } }
实验台型号如下图所示:
大家也可以从源代码中更换简谱,来演奏别的的音乐。这里就不过多解释了。学艺不精,还请各位大佬多多批评指正,提出把宝贵的意见,不胜感激!!!
感兴趣的可以加我qq:779551378
wx:15668141627
最后希望对大家有帮助 !!1
单片机电子琴模拟系统相关推荐
- 0013基于单片机电子琴控制系统设计
文件下载地址!!!!!!!!!!!!!!!!!!!!!! 单片机原理教程--初级(视频,源仿真源代码) 本设计采用STC89C51/52(与AT89C51/52.AT89S51/52通用,指定单片机请 ...
- 单片机多功能电子琴课设_单片机电子琴课程设计
单片机技术及系统设计 题 目 : 基于单片机的电子琴制作 专 业 : 自动化 班 级 : 姓 名 : 学 号 摘要 : 随着电子技术的发展,尤其是大规模集成电路的出现,给人类生活带来 了根本性的改变. ...
- 51单片机用c语言写音符代码,51单片机电子琴设计C语言程序实例
51单片机C程序实例,电子琴设计 #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsi ...
- 基于51单片机 电子琴程序
源程序 /*----------------------------------------------- 名称:电子琴 --------------------------------------- ...
- 基于51单片机电子琴设计
1. 设计要求 设计一个电子琴.利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发另一音调的声音. 2.Prot ...
- 单片机多功能电子琴课设_基于51单片机电子琴的设计(附源码及论文)
单片机最小系统 单片机最小系统 单片机最小系统说明: 时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2.而在芯片的外部,XTAL1和 ...
- Atmega16 AVR 单片机 电子琴 proteus 仿真
每个按键都是一个音.按下去显示,响,松开按键后,不显示,不响.
- 带存储功能的数字电子琴c语言,51单片机电子琴c语言程序代码实现
#include #define KeyPort P1 unsigned char High,Low; //定时器预装值的高8位和低8位 sbit SPK=P3^7; //定义蜂鸣器 ...
- 基于单片机的电子琴设计
第一章 绪论 1.1 课题背景 单片机因其体积小,功能强,价格低廉而得到广泛应用,同时随着我国经济的飞速发展,单片机在越来越多的领域得到了广泛的应用,现在国内的单片机多用于电话,玩具和LCD等产品,预 ...
最新文章
- 独家 | 一文读懂Apache Flink技术
- mysql connector python linux_Python使用mysql.connector链接mysql数据库
- C语言中用函数实现录入信息模块,C语言程序设计用函数实现模块化程序设计(73页)-原创力文档...
- java中的成员变量和局部变量的区别_java中成员变量与局部变量区别分析
- mac java tomcat_mac平台tomcat部署web项目
- Radon变换——MATLAB
- c语言中有队列头文件吗,C语言队列学习竟是如此简单!你,懂了嘛?
- 项目:小型局域网的搭建(基础知识+案例)
- 米克科技 - 全新开发悬赏任务APP系统源码平台
- TensorFlow北大公开课学习笔记-3.1张量计算图会话
- php中hexdec,PHP hexdec()函数
- Android APP启动时出现白屏或者黑屏怎么办?
- linux usleep函数 sleep,LINUX实操:date、sleep和usleep命令
- 2021年智能晾衣机销售增长96%,好易点的增长引擎是什么?
- 半导体术语的中英文版本
- java地址簿管理系统
- SpringCloud(二)——Eureka的使用和集群搭建
- abacus 基本操作
- 2.25嵌入式设计(总结)
- 工作9年程序员面试华为要薪1万,华为员工:公司没这么低工资的岗.