51单片机简易音乐盒(可切歌)

it2025-03-14  22

#include<reg52.h> sbit beep = P1 ^ 5; sbit k1 = P3 ^ 1; sbit k2 = P3 ^ 0; sbit k3 = P3 ^ 2; #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar th0_h, tl0_l, time; uint key; ulong i, j;//不能用char或int 因为j的值会很大 code uchar th0high_8[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF }; //28个频率的初始TH0值 code uchar tl0light_8[] = { 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16 };//28个初始TL0的值 code uchar song_1[] = { 0,2,2,1,2,1,5,2,2,5,2,1,5,2,2,5,2,1,5,2,2,3,2,1,3,2,2,3,2,1,3,2,2,3,2,1,4,2,2,5,2,1,2,2,3,1,2,3, 5,2,2,5,2,1,5,2,2,5,2,1,5,2,2,3,2,1,5,2,2,5,2,1,3,2,2,3,2,1,3,2,2,5,2,1,2,2,3,1,2,3,3,2,6,2,2,1,3,2,6,2,2,1, 3,2,3,5,2,3,5,2,6,5,2,1,2,2,6,1,2,1,2,2,6,1,2,1,5,2,2,1,2,3,1,2,2,7,1,3, 1,2,3,1,2,3,2,1,1,3,2,3,3,2,1,5,2,3,5,2,1,1,2,3,2,2,3,1,2,3,7,2,1,1,2,3,1,2,3,2,2,1,3,2,3,1,3,1, 7,2,3,7,2,1,1,2,3,1,2,1,2,2,3,2,2,1,1,2,3,7,2,1,1,2,3,1,2,2,1,2,3,1,2,1,3,2,3,3,2,1,3,2,3,3,2,1,2,2,3,2,2,1,1,2,3, 2,2,3,0,2,3,0,2,3,0,2,2,1,2,1,5,2,3,5,2,1,5,2,3,5,2,1,5,2,3,6,2,1,3,2,3,2,2,1, 3,2,3,3,2,3,3,2,2,1,3,3,7,2,2,5,2,3,5,2,1,5,2,3,7,2,1,3,2,3,2,2,1,3,2,3,2,2,1,2,2,3,2,2,1,1,2,3,7,1,3, 1,2,3,7,2,1,5,1,3,3,2,3,2,2,1,2,2,3,1,2,1,1,2,3,2,2,4,1,2,1,3,2,1,1,2,1,2,2,1,1,2,2,1,2,4,3,2,4,2,2,4,1,2,4 7,1,4,1,2,4,7,1,4,1,2,4, };//《朗朗晴天》的音乐码 code uchar song_2[] = { 5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我和我的祖国 1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12, //一刻也不能分割 6, 2, 2, 7, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 6, 1, 6, //无论我走到哪里 7, 1, 2, 6, 1, 2, 5, 1, 2, 5, 2, 2, 1, 2, 3, 2, 2, 1, 3, 2, 12, //都唱出一首赞歌 5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我歌唱每一座高山 1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 2, 3, 3, 1, 3, 1, 6, 2, 12, //我歌唱每一条河 1, 3, 2, 7, 2, 2, 6, 2, 2, 5, 2, 6, //袅袅炊烟 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 6, //小小村落 7, 1, 4, 6, 1, 2, 5, 1, 4, 2, 2, 2, 1, 2, 12, //路上一道辙 8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12,//我最亲爱的祖国 8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 5, 2, 3, 3, 2, 1, 6, 2, 12,//我永远紧依着你的心窝 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 7, 1, 2, 6, 1, 2, 5, 1, 2, 3, 2, 6, 4, 2, 6, 2, 2, 4, 1, 2, 2, 1, 2, 10,//你用你那母亲的脉搏和我诉说 };//《我和我的祖国》的音乐码 code uchar song_3[] = { 1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,2,2,3,3,7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,6,2,2,2,3,2,2, 4,2,4,1,3,3,7,2,1,7,2,1,1,3,2,5,2,4,4,2,3,3,2,2,4,2,1,4,2,4,1,3,3,7,2,1,7,2,1,6,2,1,5,2,5,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3, 7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,6,2,2,2,3,2,2,4,2,4,5,2,3,4,2,2,4,2,2,5,2,2,3,2,3,5,2,3,1,3,3,3,3,3, 2,3,4,2,3,2,2,3,2,1,3,3,1,3,2,1,3,6,0,2,3,0,2,3,0,2,3,0,2,3,0,2,3,0,2,3,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3, 7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3,3,2,4,2,2,2,3,2,2,4,2,4,1,3,3,7,2,2,1,3,2,5,2,4,4,2,3,3,2,3,4,2,1, 4,2,4,1,3,3,7,2,2,7,2,2,6,2,2,5,2,5,1,3,2,2,3,2,3,3,3,1,3,2,6,2,2,6,2,3,2,3,3,7,2,3,5,2,2,3,2,2,3,2,3,7,2,3,6,2,3,5,2,2,1,2,2,1,2,3,5,2,3, };//《lemon》的音乐码 void delay1(uint m) { while (m--); }//用于识别按键的延时函数与前面的延时函数不同 uchar key_1()//返回值为0或1,用于后面的判断 { key = 0; if (k1 == 0) //检测按键K1是否按下 { delay1(1000); //消除抖动 一般大约10ms if (k1 == 0) //再次判断按键是否按下 { key = 1; } while (!k1); //检测按键是否松开 } if (key == 1) return 1; else return 0; } uchar key_2() { key = 0; if (k2 == 0) //检测按键K1是否按下 { delay1(1000); //消除抖动 一般大约10ms if (k2 == 0) //再次判断按键是否按下 { key = 1; } while (!k2); //检测按键是否松开 } if (key == 1) return 1; else return 0; } uchar key_3() { key = 0; if (k3 == 0) //检测按键K1是否按下 { delay1(1000); //消除抖动 一般大约10ms if (k3 == 0) //再次判断按键是否按下 { key = 1; } while (!k3); //检测按键是否松开 } if (key == 1) return 1; else return 0; } void t0int() interrupt 1//定时中断 { TR0 = 0; beep = !beep; TH0 = th0_h; TL0 = tl0_l; TR0 = 1; } void delay(uchar t)//延时函数 { uchar t1; ulong t2; for (t1 = 0;t1 < t;t1++) for (t2 = 0;t2 < 2765;t2++);//可以设置t2的数值,根据具体歌的简谱大调来选择 TR0 = 0;//关闭T0 } void sing() { TH0 = th0high_8; TL0 = tl0light_8; TR0 = 1; delay(time); } void play_1() { i = 0; time = 1; while (time) { a: j = song_1[i] + 7 * song_1[i + 1] - 1; th0_h = th0high_8[j]; tl0_l = tl0light_8[j]; time = song_1[i + 2]; if (song_1[i] != 0)//休止符 { sing(); i += 3; } else { beep = 1; delay(time); i += 3; goto a; } if (key_3() == 1 || key_2() == 1) { beep = 1; break; } } } void play_2() { i = 0; time = 1; while (time) { a: j = song_2[i] + 7 * song_2[i + 1] - 1; th0_h = th0high_8[j]; tl0_l = tl0light_8[j]; time = song_2[i + 2]; if (song_2[i] != 0)//休止符 { sing(); i += 3; } else { beep = 1; delay(time); i += 3; goto a; } if (key_1() == 1 || key_3() == 1) { beep = 1; break; } } } void play_3() { i = 0; time = 1; while (time) { a: j = song_3[i] + 7 * song_3[i + 1] - 1; th0_h = th0high_8[j]; tl0_l = tl0light_8[j]; time = song_3[i + 2]; if (song_3[i] != 0)//休止符 { sing(); i += 3; } else { beep = 1; delay(time); i += 3; goto a; } if (key_1() == 1 || key_2() == 1) { beep = 1; break; } } } void main(void) { TMOD = 1; ET0 = 1; EA = 1; while (1) { beep = 1; if (key_1()) { play_1(); } if (key_2()) { play_2(); } if (key_3()) { play_3(); } } }

懒得打解释了,等有空再打上去 除了中间那首歌是完整的 其他两首歌我还没有编写完全,工作量太大了

最新回复(0)