- /***********************************************************************
-
- 內容:LCD1602音樂播放器
- 作者:QQ:1181826414
- 交流:http://www.zg4o1577.cn/bbs/mcu-h24-1.html
- ***********************************************************************/
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- /*------------------------------------------------
- 硬件端口位定義
- ------------------------------------------------*/
- sbit BEEP=P2^0; //定義音樂輸出端口
- sbit key1=P3^2; //定義按鍵 用于 暫停和播放
- sbit key2=P3^3; //定義按鍵 用于 切換歌曲
- sbit RS=P2^1;
- sbit RW=P2^2;
- sbit EN=P2^3;
- void Delayms(uint ValMS)
- {
- uchar uiVal;
- while(ValMS--)
- {
- for(uiVal=0;uiVal<120;uiVal++);
- }
- }
- /* ***************************************************** */
- // 函數名稱:Busy_Check()
- // 函數功能:液晶遇忙檢測
- // 入口參數:無
- // 出口參數:無
- /* ***************************************************** */
- uchar Busy_Check()
- {
- uchar LCD_Status;
- RS = 0;
- RW = 1;
- EN = 1;
- Delayms(1);
- LCD_Status = P0;
- EN = 0;
- return LCD_Status;
- }
- /* ***************************************************** */
- // 函數名稱:write_com()
- // 函數功能:向液晶寫命令
- // 入口參數:命令(ComVal)
- // 出口參數:無
- /* ***************************************************** */
- void write_com(uchar com)
- {
- RS=0;
- RW=0;
- EN=0;
- P0=com;
- Delayms(2);
- EN=1;
- Delayms(2);
- EN=0;
- Delayms(2);
- }
- /* ***************************************************** */
- // 函數名稱:write_dat()
- // 函數功能:向液晶寫數據
- // 入口參數:數據(DatVal)
- // 出口參數:無
- /* ***************************************************** */
- void write_dat(uchar dat)
- {
- RS=1;
- RW=0;
- EN=0;
- P0=dat;
- Delayms(2);
- EN=1;
- Delayms(2);
- EN=0;
- Delayms(2);
- }
- /* ***************************************************** */
- // 函數名稱:init_1602()
- // 函數功能:液晶初始化
- // 入口參數:無
- // 出口參數:無
- /* ***************************************************** */
- void init_1602()
- {
- write_com(0x38);
- write_com(0x01);
- write_com(0x06);
- write_com(0x0c);
- }
- void write_zfc(uchar *p)
- {
- while(*p!=0)
- write_dat(*p++);
- }
- unsigned char W=0,T; //用于選擇音樂
- unsigned char Timer0_H,Timer0_L,Time;
- //世上只有媽媽好 數據表 音譜,高中低音,音長
- code unsigned char MUSIC[102]={ 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
- };
- //送別 數據表 音譜,高中低音,音長
- code unsigned char MUSIC1[174]={ 5,2,2, 3,2,1, 5,2,1, 1,3,4,
- 6,2,2, 1,3,2, 5,2,4,
- 5,2,2, 1,2,1, 2,2,1, 3,2,2, 2,2,1, 1,2,1,
- 2,2,8,
- 5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1,
- 6,2,2, 1,3,2, 5,2,4,
- 5,2,2, 2,2,1, 3,2,1, 4,2,3, 7,1,1,
- 1,2,8,
- 6,2,2, 1,3,2, 1,3,4,
- 7,2,2, 6,2,1, 7,2,1, 1,3,4,
- 6,2,1, 7,2,1, 1,3,1, 6,2,1, 6,2,1, 5,2,1, 3,2,1, 1,2,1,
- 2,2,8,
- 5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1,
- 6,2,2, 1,3,2, 5,2,4,
- 5,2,2, 2,2,1, 3,2,1, 4,2,3, 7,1,1,
- 1,2,8
- };
- //新年好 數據表 音譜,高中低音,音長
- code unsigned char MUSIC2[90]={ 1,2,1, 1,2,1, 1,2,2, 5,1,2,
- 3,2,1, 3,2,1, 3,2,2, 1,2,2,
- 1,2,1, 3,2,1, 5,2,2, 5,2,2,
- 4,2,1, 3,2,1, 2,2,4,
- 2,2,1, 3,2,1, 4,2,2, 4,2,2,
- 3,2,1, 2,2,1, 3,2,2, 1,2,2,
- 1,2,1, 3,2,1, 2,2,2, 5,1,2,
- 7,1,1, 2,2,1, 1,2,4
- };
- //童年 數據表 音譜,高中低音,音長
- code unsigned char MUSIC3[423]={ 5,1,1, 5,1,1, 3,1,1, 5,1,2, 3,1,1, 5,1,2,
- 6,1,1, 6,1,1, 1,2,1, 6,1,2, 6,1,1, 1,2,2,
- 2,2,1, 2,2,1, 3,2,1, 2,2,2, 5,1,1, 6,1,1, 5,1,1,
- 1,2,1, 1,2,1, 5,1,1, 1,2,1, 1,2,1, 1,2,2, 1,2,1,
- 1,2,1, 5,1,2, 1,2,1, 6,1,1, 5,1,1, 3,1,1, 2,1,1,
- 1,1,2, 3,1,1, 5,1,1, 5,1,2, 5,1,1, 3,1,1,
- 6,1,1, 6,1,1, 1,2,1, 6,1,1, 6,1,1, 6,1,1, 6,1,1, 5,1,1,
- 1,2,2, 1,2,1, 1,2,1, 1,2,1, 6,1,1, 1,2,1, 6,1,1,
- 5,1,2, 0,2,1, 3,1,1, 6,1,1, 1,2,1, 6,1,1, 5,1,1,
- 3,1,1, 2,1,1, 3,1,1, 5,1,1, 5,1,2, 5,1,1, 3,1,1,
- 6,1,1, 6,1,1, 1,2,1, 6,1,1, 6,1,1, 6,1,1, 6,1,1, 5,1,1,
- 1,2,2, 1,2,1, 1,2,1, 1,2,1, 6,1,1, 6,1,1, 1,2,1,
- 2,2,2, 0,2,1, 5,1,1, 2,2,1, 5,2,1, 2,2,2,
- 5,2,1, 5,2,2, 5,2,1, 5,2,1, 5,2,1, 3,2,1, 2,2,1,
- 1,2,1, 1,2,2, 6,1,1, 6,1,1, 1,2,1, 6,1,1, 1,2,1,
- 2,2,1, 2,2,1, 2,2,1, 2,2,1, 2,2,1, 1,2,1, 3,2,1, 2,2,1,
- 2,2,8,
- 3,2,1, 3,2,2, 3,2,1, 3,2,2, 2,2,2,
- 1,2,1, 1,2,2, 1,2,1, 2,2,1, 1,2,1, 6,1,1, 5,1,1,
- 5,1,1, 5,1,2, 5,1,1, 6,1,1, 5,1,1, 2,2,1, 3,2,1,
- 1,2,8,
- 1,2,1, 5,1,2, 1,2,1, 6,1,1, 5,1,1, 3,1,1, 2,1,1,
- 1,2,6, 0,2,2
- };
- // 音階頻率表 高八位
- code unsigned char FREQH[]={
- 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
- 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
- 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
- 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
- } ;
- // 音階頻率表 低八位
- code unsigned char FREQL[]={
- 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
- 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
- 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
- 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
- };
- /*------------------------------------------------
- 節拍延時函數
- 各調1/4節拍時間:
- 調4/4 125ms
- 調2/4 250ms
- 調3/4 187ms
- ------------------------------------------------*/
- void delay(uchar t)
- {
- uchar i;
- for(i=0;i<t;i++)
- Delayms(250);
- TR0=0;
- }
- /*------------------------------------------------
- 定時器0中斷
- ------------------------------------------------*/
- void TIM0_ISR() interrupt 1
- {
- TR0=0;
- BEEP=!BEEP;
- TH0=Timer0_H;
- TL0=Timer0_L;
- TR0=1;
- }
- /*------------------------------------------------
- 歌曲處理函數
- ------------------------------------------------*/
- void Song()
- {
- TH0=Timer0_H;//賦值定時器時間,決定頻率
- TL0=Timer0_L;
- TR0=1; //打開定時器
- delay(Time); //延時所需要的節拍
- }
- /*------------------------------------------------
- 主函數
- ------------------------------------------------*/
- void led(unsigned char a);
- void main(void)
- {
- unsigned int i;
- unsigned char k;
- TMOD|=0x01; //置定時器0工作方式1
- EA=1; //打開全局中斷
- ET0=1; //打開 定時器0 中斷
- EX0=1; //打開 外部中斷0 中斷
- IT0=1; //設置為下降沿中斷
- EX1=1; //打開 外部中斷1 中斷
- IT1=1; //設置為下降沿中斷
- PX1=1; //設置 外部中斷1 為高優先級
- init_1602();
-
- while(1)
- {
- //i=0;
-
- if(W==0)
- {
- T=W;
- write_com(0x81);
- write_zfc("shishangziyou");
- write_com(0xc4);
- write_zfc("mamahao");
- for(i=0;i<100;i=i+3)
- { //音樂數組長度 ,唱完從頭再來
- led(MUSIC[i]);
-
- k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振蕩頻率所需數據
- Timer0_H=FREQH[k];
- Timer0_L=FREQL[k];
- Time=MUSIC[i+2]; //節拍時長
- // i=i+3;
- Song();
- if(T!=W)
- break;
- }
- }
-
- if(W==1)
- {
- T=W;
- write_com(0x01);
- write_com(0x80);
- write_zfc(" songbie ");
- for(i=0;i<174;i=i+3)
- { //音樂數組長度 ,唱完從頭再來
- led(MUSIC1[i]);
-
- k=MUSIC1[i]+7*MUSIC1[i+1]-1;//去音符振蕩頻率所需數據
- Timer0_H=FREQH[k];
- Timer0_L=FREQL[k];
- Time=MUSIC1[i+2]; //節拍時長
- // i=i+3;
- Song();
- if(T!=W)
- break;
- }
- }
- if(W==2)
- {
- T=W;
- write_com(0x80);
- write_zfc(" xinnianhao ");
- for(i=0;i<90;i=i+3)
- { //音樂數組長度 ,唱完從頭再來
- led(MUSIC2[i]);
-
- k=MUSIC2[i]+7*MUSIC2[i+1]-1;//去音符振蕩頻率所需數據
- Timer0_H=FREQH[k];
- Timer0_L=FREQL[k];
- Time=MUSIC2[i+2]; //節拍時長
- // i=i+3;
- Song();
- if(T!=W)
- break;
- }
- }
-
- if(W==3)
- {
- T=W;
- write_com(0x80);
- write_zfc(" tongnian ");
- for(i=0;i<423;i=i+3)
- { //音樂數組長度 ,唱完從頭再來
- led(MUSIC3[i]);
-
- k=MUSIC3[i]+7*MUSIC3[i+1]-1;//去音符振蕩頻率所需數據
- Timer0_H=FREQH[k];
- Timer0_L=FREQL[k];
- Time=MUSIC3[i+2]; //節拍時長
- // i=i+3;
- Song();
- if(T!=W)
- break;
- }
- }
- }
- }
- // 頻譜函數
- void led(unsigned char a)
- {
- switch(a)
- {
- case 0:P1=0xff;break;
- case 1:P1=0x7f;break;
- case 2:P1=0x7e;break;
- case 3:P1=0x7c;break;
- case 4:P1=0x78;break;
- case 5:P1=0x70;break;
- case 6:P1=0x60;break;
- case 7:P1=0x40;break;
- case 8:P1=0x00;break;
- }
- }
- // 外部中斷0 中斷服務程序 用于暫停
- void zhongduan0() interrupt 0
- {
- Delayms(5); //按鍵去抖
- if(!key1)
- {
- while(!key1); //松手檢測
- while(key1&&T==W); //檢測按鍵是否按下
- Delayms(5); //按鍵去抖
- while(key1&&T==W); //檢測按鍵是否按下
- while(!key1&&T==W); //松手檢測
- }
- }
- // 外部中斷1 中斷服務程序
- void zhongduan1() interrupt 2
- {
- Delayms(5); //按鍵去抖
- if(!key2)
- {
- if(W==3)
- W=0;
- else
- W++;
- while(!key2); //松手檢測
- Delayms(500);
-
- }
- }
復制代碼
資料下載:
1602音樂播放器(帶仿真).zip
(122.97 KB, 下載次數: 85)
2016-12-8 22:45 上傳
點擊文件名下載附件
|