本文共 10233 字,大约阅读时间需要 34 分钟。
//宏定义部分#define L1 262 //低音1#define L2 286 //低音2#define L3 311 //低音3#define L4 349 //低音4#define L5 392 //低音5#define L6 440 //低音6#define L7 494 //低音7#define Z1 523 //中音1#define Z2 587 //中音2#define Z3 659 //中音3#define Z4 698 //中音4#define Z5 784 //中音5#define Z6 880 //中音6#define Z7 987 //中音7#define H1 1046 //高音1#define H2 1174 //高音2#define H3 1318 //高音3#define H4 1396 //高音4#define H5 1567 //高音5#define H6 1760 //高音6#define H7 1975 //高音7//硬件端口定义sbit sound = P1 ^ 4; //蜂鸣器sbit KAISHI = P1 ^ 0; //开始sbit ZANTING = P1 ^ 1; //暂停sbit PRE_KEY = P1 ^ 2; //上一首sbit NEXT_KEY = P1 ^ 3; //下一首sbit yianjian = P1 ^ 5; //选择第1首歌的按键sbit eranjian = P1 ^ 6; //选择第2首歌的按键sbit sananjian = P1 ^ 7; //选择第3首歌的按键//程序变量定义unsigned int C;unsigned char u, t;unsigned char velocity = 60; //100ms一个拍子unsigned char press_key = 0; //按键按下状态unsigned char open_flag = 1; //1表示正在播放unsigned char music_crr = 0; //当前播放的音乐编号(0、1、2)//音乐节拍定义unsigned int code music0[] = { Z6, Z7, H1, Z7, H1, H3, Z7, Z3, Z3, Z6, Z5, Z6, H1, Z5, Z3, Z3, Z4, Z3, Z4, H1, Z3, H1, H1, H1, Z7, Z4, Z4, Z7, Z7, Z6, Z7, H1, Z7, H1, H3, Z7, Z3, Z3, Z6, Z5, Z6, Z5, Z3, Z3, Z4, H1, Z7, H1, H2, H2, H2, H1, H1, Z6, Z6, Z5, Z6, H1, Z5, Z3, Z4, H1, Z7, H1, H2, H5, H5, H2, Z5, Z5, Z6, Z6, Z3, Z2, Z3, Z5, Z3, Z2, Z1, Z1, Z2, Z1, 0xff};unsigned char code music0_JP[] = { 4, 4, 12, 4, 8, 8, 20, 4, 4, 12, 4, 8, 8, 20, 4, 4, 4, 12, 4, 8, 8, 20, 4, 4, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 2, 2, 4, 12, 8, 8};unsigned int code music1[] = { Z3, Z3, Z5, Z6, H1, H1, Z6, Z5, Z5, Z6, Z5, Z3, Z3, Z3, Z5, Z6, H1, H1, Z6, Z5, Z5, Z6, Z5, Z3, Z3, Z2, Z3, Z5, Z3, Z2, Z1, Z1, Z2, Z1, 0xff};unsigned char code music1_JP[] = { 16, 8, 8, 8, 8, 8, 8, 16, 8, 8, 32, 16, 8, 8, 32, 16, 16, 16, 8, 8, 16, 16, 32, 16, 8, 8, 16, 8, 8, 32, 1, 8, 8};unsigned int code music2[] = { H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6, H1, H2, H5, H5, H2, H1, H2, H2, Z1, H3, H3, H3, H2, H1, H2, H5, H5, H1, H1, H1, H1, Z6, Z7, H3, H3, Z5, Z6, H6, H5, H4, H3, H2, H1, H1, Z6};unsigned char code music2_JP[] = { 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 4, 4, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 2, 2, 4, 4, 8, 8, 2, 2, 2, 2, 4, 4, 8, 4, 2, 2, 4, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2};//延时函数void delay(uint z) { uint x; while (z--) { for (x = 125; x > 0; x--) { ; } }}void delay1() { uint i, j; for (i = 0; i < velocity; i++) { for (j = 0; j < 125; j++) { ; } }}void init_timer() { EA = 1; //总中断使能 ET1 = 1; //定时器T1中断允许 TMOD &= 0x0f; //清除TMOD的低4位 TMOD |= 0x01; //使用定时器T1的模式1(13位计数器) TR1 = 1; //启动定时器T1 ET0 = 1; //定时器T0中断允许}unsigned char ScanKey() { if (KAISHI == 0) { delay(1); if (KAISHI == 0) { while (KAISHI == 0) { return 1; } } } if (ZANTING == 0) { delay(1); if (ZANTING == 0) { while (ZANTING == 0) { return 2; } } } if (PRE_KEY == 0) { delay(1); if (PRE_KEY == 0) { while (PRE_KEY == 0) { return 3; } } } if (NEXT_KEY == 0) { delay(1); if (NEXT_KEY == 0) { while (NEXT_KEY == 0) { return 4; } } } if (yianjian == 0) { delay(1); if (yianjian == 0) { while (yianjian == 0) { return 5; } } } if (eranjian == 0) { delay(1); if (eranjian == 0) { while (eranjian == 0) { return 6; } } } if (sananjian == 0) { delay(1); if (sananjian == 0) { while (sananjian == 0) { return 7; } } } return 0;}void delay_key() { if (press_key == 1) { open_flag = 1; press_key = 0; } if (press_key == 2) { open_flag = 0; press_key = 0; } if (press_key == 3) { press_key = 0; if (music_crr > 0) { music_crr = (music_crr - 1) % 3; } else { music_crr = 2; } LCD_write_char(9, 0, music_crr + '1'); rtc_hour = 0; rtc_min = 0; rtc_sec = 0; } if (press_key == 4) { press_key = 0; music_crr = (music_crr + 1) % 3; LCD_write_char(9, 0, music_crr + '1'); rtc_hour = 0; rtc_min = 0; rtc_sec = 0; } if (press_key == 5) { press_key = 0; music_crr = 0; LCD_write_char(9, 0, music_crr + '1'); rtc_hour = 0; rtc_min = 0; rtc_sec = 0; open_flag = 1; } if (press_key == 6) { press_key = 0; music_crr = 1; LCD_write_char(9, 0, music_crr + '1'); rtc_hour = 0; rtc_min = 0; rtc_sec = 0; open_flag = 1; } if (press_key == 7) { press_key = 0; music_crr = 2; LCD_write_char(9, 0, music_crr + '1'); rtc_hour = 0; rtc_min = 0; rtc_sec = 0; open_flag = 1; } if (open_flag == 1) { TR0 = 1; } else { TR0 = 0; } LCD_dis_TIME(6, 1, rtc_hour, rtc_min, rtc_sec);}void main() { LCD_init(); LCD_write_str(0, 0, " WELCOME!"); delay(1000); LCD_write_str(0, 0, "Playing: "); LCD_write_char(9, 0, '1'); LCD_write_str(0, 1, "Time:"); LCD_dis_TIME(6, 1, rtc_hour, rtc_min, rtc_sec); init_timer(); TR1 = 0; sound = 0; open_flag = 0; TR0 = 0; LCD_dis_TIME(6, 1, rtc_hour, rtc_min, rtc_sec); while (1) { press_key = ScanKey(); delay_key(); if (music_crr == 0 && open_flag == 1) { u = 0; changdu = sizeof(music0); while (music0[u] != 0xff) { press_key = ScanKey(); delay_key(); if (music_crr != 0) { init_timer(); TR1 = 0; sound = 1; break; } if (open_flag == 0) { while (open_flag == 0) { press_key = ScanKey(); delay_key(); } } C = 460830 / music0[u]; TH1 = (8192 - C) / 32; TL1 = (8192 - C) % 32; TR1 = 1; changdu--; for (t = 0; t < music0_JP[u]; t++) { delay1(); } TR1 = 0; u++; } init_timer(); TR1 = 0; sound = 1; } if (music_crr == 1 && open_flag == 1) { u = 0; changdu = sizeof(music1); while (music1[u] != 0xff) { press_key = ScanKey(); delay_key(); if (music_crr != 1) { init_timer(); TR1 = 0; sound = 1; break; } if (open_flag == 0) { while (open_flag == 0) { press_key = ScanKey(); delay_key(); } } C = 460830 / music1[u]; TH1 = (8192 - C) / 32; TL1 = (8192 - C) % 32; TR1 = 1; changdu--; for (t = 0; t < music1_JP[u]; t++) { delay1(); } TR1 = 0; u++; } init_timer(); TR1 = 0; sound = 1; } if (music_crr == 2 && open_flag == 1) { u = 0; changdu = sizeof(music2); while (music2[u] != 0xff) { press_key = ScanKey(); delay_key(); if (music_crr != 2) { init_timer(); TR1 = 0; sound = 1; break; } if (open_flag == 0) { while (open_flag == 0) { press_key = ScanKey(); delay_key(); } } C = 460830 / music2[u]; TH1 = (8192 - C) / 32; TL1 = (8192 - C) % 32; TR1 = 1; changdu--; for (t = 0; t < music2_JP[u] / 2; t++) { delay1(); } TR1 = 0; u++; } init_timer(); TR1 = 0; sound = 1; } }}void Time1() interrupt 3 { sound = !sound; TH1 = (8192 - C) / 32; TL1 = (8192 - C) % 32;}void Time0() interrupt 1 { TH0 = (65535 - 50000) / 255; TL0 = (65535 - 50000) % 255; num2++; if (num2 == 20) { num2 = 0; rtc_sec++; if (rtc_sec == 60) { rtc_sec = 0; rtc_min++; if (rtc_min == 60) { rtc_min = 0; rtc_hour++; if (rtc_hour == 24) { rtc_hour = 0; } } } }} 转载地址:http://fkce.baihongyu.com/