1到7为7个音节,8为送别,在播放音乐时操作按键无效,只有复位或等歌曲放完
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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下载地址,注意仿真工程只能用Proteus7.5打开:
基于8255的LCD显示简易电子琴.7z
(121.57 KB, 下载次数: 46)
|