1到7為7個音節,8為送別,在播放音樂時操作按鍵無效,只有復位或等歌曲放完
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
11.png (74.22 KB, 下載次數: 56)
下載附件
2021-10-13 22:51 上傳
51hei.png (11.7 KB, 下載次數: 44)
下載附件
2021-10-14 03:57 上傳
單片機源程序如下:
- #include "reg52.h"
- #include "absacc.h"
- #include<stdio.h>
- #include"intrins.h"
- sbit CS =P2^7; //8255片選端口
- sbit SPK=P1^0; //定義音樂輸出端口
- #define PA XBYTE[0x0000]
- #define PB XBYTE[0x0401]
- #define PC XBYTE[0x0802]
- #define CN XBYTE[0x0C03]
- #define RS_CLR PB &= ~(1<<0)
- #define RS_SET PB |= (1<<0)
- #define RW_CLR PB &= ~(1<<1)
- #define RW_SET PB |= (1<<1)
- #define EN_CLR PB &= ~(1<<2)
- #define EN_SET PB |= (1<<2)
- #define DataPort PA
- unsigned char state = 0 ;
- unsigned char temp,num,updat ;
- unsigned table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char number=0;
- unsigned char W=0,T; //用于選擇音樂
- unsigned char Timer0_H,Timer0_L,Time;
- void DelayMs(unsigned char t);
- //送別 數據表 音譜,高中低音,音長
- 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 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(unsigned char t)
- {
- unsigned char i;
- for(i=0;i<t;i++)
- DelayMs(250);
- TR0=0;
- }
- /*------------------------------------------------
- 定時器0中斷
- ------------------------------------------------*/
- void TIM0_ISR() interrupt 1
- {
- TR0=0;
- SPK=!SPK;
- TH0=Timer0_H;
- TL0=Timer0_L;
- TR0=1;
- }
- /*------------------------------------------------
- 歌曲處理函數
- ------------------------------------------------*/
- void Song()
- {
- TH0=Timer0_H;//賦值定時器時間,決定頻率
- TL0=Timer0_L;
- TR0=1; //打開定時器
- delay(Time); //延時所需要的節拍
- }
- //微妙延時函數
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- //毫秒延時函數
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- //液晶寫指令函數
- void LCD_Write_Com(unsigned char com)
- {
- DelayMs(5); //延時5毫秒
- RS_CLR; //指令數據端口設置為低電平,指令模式
- RW_CLR; //讀寫端口設置為寫模式
- EN_SET;
- DataPort= com; //寫數據到液晶數據端口
- _nop_();
- EN_CLR; //EN產生下降沿講數據寫入到液晶中
- }
復制代碼
51hei.png (10.93 KB, 下載次數: 74)
下載附件
2021-10-14 03:56 上傳
全部資料51hei下載地址,注意仿真工程只能用Proteus7.5打開:
基于8255的LCD顯示簡易電子琴.7z
(121.57 KB, 下載次數: 46)
2021-10-14 03:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|