|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
简易电子琴单片机源程序
$ l3 v8 N% d& w8 m8 s! h, c( J8 J N) l \) Z1 l9 Z& S: [; h! s2 f9 _$ ~2 p0 U
$ N2 y3 a+ k+ U P2 i3 a) H. F电子琴按键音乐器:
0 [# b) X& `3 ]9 G, |/*
0 U5 T" r! D$ c; J/ C9 {. Y# j5 `& P跳线设置:默认跳线位
6 l6 j" E6 o; d* g/ {程序效果:用按键T0 S4 S5控制音符的输出4 R } {+ e( X) ^7 J# ^
*/
6 u% ^( g2 O2 N( L/ P/ l. ^#include<reg52.h> //头文件; g+ r3 f5 _# \: H8 m& Z6 t& m
#define uchar unsigned char //宏定义
1 q2 M; v- k+ E" m( O& L#define uint unsigned int& Q3 g2 [0 s( ^* `& P4 r! L6 P
sbit fmq=P2^2; //定义蜂鸣器的引脚% `/ I& ~$ F+ r/ b, C
uchar code freq[36*2]={ //这些音乐频率我也不懂,关键是我不懂音律" ~' @+ {5 O7 o+ X5 Y
0xA9,0xEF,//00220HZ ,1 //0
7 Q# l2 o- {: d6 r6 Q4 N 0x93,0xF0,//00233HZ ,1#
! R7 ^6 u6 y/ Z% p( S" i: Y8 Q6 r 0x73,0xF1,//00247HZ ,2! B, `6 p3 y, y1 Y
0x49,0xF2,//00262HZ ,2#
2 ~4 S* H, Z# K 0x07,0xF3,//00277HZ ,3
1 N/ ?& X) l0 ?! A/ u7 t" r! L. O6 J 0xC8,0xF3,//00294HZ ,4
% V0 m" t1 Y2 G 0x73,0xF4,//00311HZ ,4#
% C. z8 J) m7 @- Z C' L 0x1E,0xF5,//00330HZ ,5 * X- T+ N2 h( K2 r' x% l1 z4 m
0xB6,0xF5,//00349HZ ,5#
( W3 [0 z/ f- z7 Y$ N- B) N1 t 0x4C,0xF6,//00370HZ ,6
( [$ Z! x+ V \ 0xD7,0xF6,//00392HZ ,6#
* u; V$ J' e& ~2 d* Q/ y$ | 0x5A,0xF7,//00415HZ ,7 / |3 o. v: j0 J; F2 ?
0xD8,0xF7,//00440HZ 1 //12
5 w U" ]3 g( s 0x4D,0xF8,//00466HZ 1# //13, J* `1 m: ~8 o( O
0xBD,0xF8,//00494HZ 2 //14
& j% j% u% Z, j% [ 0x24,0xF9,//00523HZ 2# //153 Q6 `8 h4 G/ Z. g; e" L' K5 n: q
0x87,0xF9,//00554HZ 3 //16
5 j' g `) t) \, z 0xE4,0xF9,//00587HZ 4 //17+ j. C% q+ g& y) b6 l. a" v' P q
0x3D,0xFA,//00622HZ 4# //18
# [+ r. Y4 B) O4 S. b+ h' Y 0x90,0xFA,//00659HZ 5 //19
1 S5 N' o/ P& {& Y2 R o 0xDE,0xFA,//00698HZ 5# //20& X, ~8 O k; ]7 X" Q
0x29,0xFB,//00740HZ 6 //215 p' D! h$ \" I9 @7 z" X
0x6F,0xFB,//00784HZ 6# //22
; S4 \8 [0 _1 T: O' L 0xB1,0xFB,//00831HZ 7 //23
' O0 ?5 z3 k& B7 L3 I9 g# N) _( G 0xEF,0xFB,//00880HZ `1) e+ O+ S9 x/ `
0x2A,0xFC,//00932HZ `1#
8 U! t7 @+ [6 P 0x62,0xFC,//00988HZ `2, ^, H, x/ H, @ O% Q4 p' @9 O/ Q0 F
0x95,0xFC,//01046HZ `2#
0 M! ~% P8 g6 j1 | 0xC7,0xFC,//01109HZ `3
1 f9 z ^# i' y+ @ 0xF6,0xFC,//01175HZ `4$ b$ I: g2 A. V2 j; F D
0x22,0xFD,//01244HZ `4#9 X! c7 r9 C" H
0x4B,0xFD,//01318HZ `53 b6 M9 n# R. {" S' o3 J) }3 l3 x
0x73,0xFD,//01397HZ `5#$ H3 e8 r; H$ s0 m6 n4 r; l
0x98,0xFD,//01480HZ `6
9 [4 C9 _& G* D" u6 S 0xBB,0xFD,//01568HZ `6#" ?5 J/ N: y/ Z+ B3 B7 ^; R
0xDC,0xFD,//01661HZ `7 //35
# q! I2 [9 W1 @- J+ O" G};
5 L9 _( ?, b. duchar code jie[]={12,14,16,17,19,21,23,24}; //音符在频率表中的位置. E7 L, `, V+ X2 @ C1 d6 h$ @
uchar th,tl; //分别装载T0值得高低位
; t& b* [( }- P. {9 O* E9 Svoid main() u4 L6 d0 V4 { e+ ]# I& z, H
{
$ `) ~. I7 V4 P G uint i; //延时变量
6 P; a# ]. B& G1 G6 _ EA=1; //打开总中断2 M1 j& t! _1 n7 n
ET0=1; //打开定时器02 c* Y. x3 R k, v- \9 \ H+ w+ E) e
TR0=1; //启动定时器0
0 S- K: |9 e# g0 q! L, i9 H P3=0xf0;//判断按键是否按下的标志) y9 u" v2 ^! v: @/ v! F
while(1)' H c4 B1 H2 O) a' k. S+ k
{2 `1 B8 m2 E- Y5 s& c
fmq=1;//关闭蜂鸣器 B: x0 d+ }/ j2 n& e6 O
if((P3&0xf0)!=0xf0)//判断按键是否俺按下! U0 O( u4 C* U) d! B! Y
{ //在这我并没有延时消抖,有经验的人 就知道,
* U' F) }( w7 c if(P3==0x70) //在要求严不格的情况下是可以不写消抖语句的9 W9 m, ~ p- L) `
{. Y( `! ]- x. x# Y( ^5 U
tl=freq[jie[0]*2]; //装初值
8 P$ F4 N' |+ \5 Z# A. \) @8 K th=freq[jie[0]*2+1];5 H" x4 X4 v5 C+ O5 Z0 N
TR0=1; //启动定时器0
2 W8 g5 ]& V! l9 h8 D& }; D for(i=1000;i>0;i--); //延时
% j _, _% s- t* A9 e }8 ]" ^) t4 p! i3 u5 D( K
if(P3==0xb0)( ?. K- d; q0 J5 R
{" i$ t8 L: L0 O6 v C! k, G/ S5 Q) `
tl=freq[jie[1]*2];
, P; v$ G1 ^: z7 ?4 j; C1 { th=freq[jie[1]*2+1];
2 r# C, u$ M9 W TR0=1;9 w, \7 F+ V* l0 y* a8 |9 g' L/ Z
for(i=1000;i>0;i--);
1 d( Y+ w0 e' E$ j }; o1 F) C+ P) N
if(P3==0xd0)
6 m' t2 G8 v' e* P4 ~/ E {0 W7 W/ N( o W% A# _
tl=freq[jie[2]*2];
- U: E( D8 e4 @. l' z, z6 |! Z th=freq[jie[2]*2+1];
/ r! M+ f- l# a( ?/ R7 Z TR0=1;
! R+ x, P$ A0 D% i9 r for(i=1000;i>0;i--);
- D9 f' |9 o$ T& V" u }' A5 L* I7 G4 G8 v
if(P3==0xe0)! I& i: ?! ?% b0 }
{
1 c2 s7 K2 Q% Z/ I2 B/ a* | tl=freq[jie[3]*2];
6 D& i$ V8 Q" i* B( j0 w6 \ th=freq[jie[3]*2+1];# g7 t* v0 c6 g+ v6 B4 N
TR0=1;
+ I" V8 |: s+ X% U$ } for(i=1000;i>0;i--);
a4 F; p- o- L( m" S1 s& D. C% S3 a }
w6 ~# ?; t" C5 r+ _" l4 S } " M7 V7 Z8 E. K4 s% U% E
TR0=0;//关闭定时器0 : u @. N) M; O
}
8 n6 R# T6 R; I% o0 o0 R}2 k4 p% @. m/ `* b6 E
void time0() interrupt 1 //用于产生唱歌的频率, q5 r8 I" c, k4 x) t
{8 S$ ~: H/ p) g. J
TH0=th; //装初值/ l8 [5 F; ^# R! w6 J. A% J/ | m
+ x6 o6 A+ P/ I B& H1 D4 g3 S" M
- Q( ~& j( F5 J' X6 J1 w+ y. w+ q
…………限于本文篇幅 余下代码请从论坛下载附件…………- N: C( F( i/ k1 g; E! @0 x
电子按键音乐器c.rar
(9.97 KB, 下载次数: 0)
, Y& i* z; ]0 y3 z- }7 S3 T$ X5 n7 ^
_% A1 P' {# x* E( T1 l |
|