单片机源程序如下:
/**************************************************************
程序名称:模拟电子琴
**************************************************************/
#include
#define uchar unsigned char //宏定义
#define led P0 //定义LED等位P0口
#define sw_port P1 //中间变量。。。使按键和led对应
sbit buzzer=P2^7; //扬声器管脚
sbit key1=P3^2; //播放音乐与弹奏歌曲转换
sbit key3=P3^4; //掉电存储按键
sbit key4=P3^5; //播放掉电存储的歌曲
sbit keybofang=P3^3; //播放刚才弹奏的歌曲
sbit key7=P3^0; //音调键。。。 和 歌曲键
sbit key8=P3^1; //音调键。。。 和 歌曲键
sbit key6=P1^7;
sbit key5=P1^6;
sbit sda=P1^1; //24c02数据线
sbit scl=P1^0; //24c02时钟线
uchar keyd,i,keys,b; //定义变量
uchar tone_H; //定义变量
uchar tone_L; //定义变量
void beat_125(unsigned char); //声明函数
uchar code beat1[]={16,8,8,8,8,4,4,16,8,4,4,8,4,4,4, //歌曲1节拍
4,4,4,16,16,8,8,4,4,12,8,16,16,8,4,4,4,4,16};
uchar code song1[]={6,5,3,5,7,6,5,6,3,5,6,5,3, //歌曲1简谱
2,1,6,5,3,2,2,3,5,5,6,3,2,1,5,3,2,1,6,1,1,15};
uchar code beat2[]={7,7,7, 7,8,9, 1,2,3, 6,2,4, 4,4,4, 12, //歌曲二节拍
8,2,2, 4,4,4, 8,2,2, 4,4,4, 2,2,4,4, 12,};
uchar code song2[]={1,2,8, 8,5,1, 3,3,3, 5,4,3, //歌曲二简谱
5,4,3, 2, 2,1,0, 1,2,3, 4,3,2, 3,4,5, 5,4,3, 2,1,15};
uchar code beat4[]={4,4,4, 6,2,4, 4,4,4, 6,2,4, 4,4,4, 12,
8,2,2, 4,4,4, 8,2,2, 4,4,4, 2,2,4,4, 12,};
uchar code song4[]={1,1,1, 3,2,1, 3,3,3, 5,4,3,
5,4,3, 2, 2,1,0, 1,2,3, 4,3,2, 3,4,5, 5,4,3, 2,1, 15};
uchar code tone[]={115,102,91,86,77,68,61,57}; //歌曲音调
unsigned int code tone1[]={1012,956,852,759,716,638,568,506,478,426,379,531,10}; //歌曲音调
uchar song3[43]; //定义空数组
void play(uchar*,uchar*); //演奏歌曲函数
void delay8um(uchar); //第一8um延时函数
void sound(uchar); //弹奏发声函数
/*******************************************
函数功能:节拍的延时的基本单位,用于24c08简单延时
******************************************/
void delay() //简单延时函数
{;;}
/*******************************************
函数功能:节拍的延时的基本单位,延时1ms
******************************************/
void delay1ms(uchar x) //1um延时函数
{
uchar j;
while(x--)
for(j=120;j>0;j--);
}
/**************************************************************
函数功能:24c02驱动程序 用IIC总线进行传输
**************************************************************/
void init_c02() //24c02初始化
{
sda=1;
delay();
scl=1;
delay();
}
void start_c02() //24c02的启动信号
{
scl=1;
delay();
sda=1;
delay();
sda=0;
delay();
}
void stop_c02() //24c02停止信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void response_c02() //24c02的应答信号
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void write_c02byte(uchar date) //对24c02写一个字节
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_c02byte() //对24c02读一个字节
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
void write_addc02(uchar address,uchar date) //对24c02写一个数据
{
start_c02();
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』