资料见文章结尾:
1.24C02+蜂鸣器播放音乐仿真(本设计采用Protues7.8版本设计)
功能:
(1)上电后,单片机循环播放音乐。
2.程序设计(采用keil5进行编程)
//引脚定义
sbit SCL = P1^0;
sbit SDA = P1^1;
sbit SPK = P3^0;
//定时器高字节编码
uchar code HI_LIST[] =
{
0,226,229,232,233,236,238,240,241,242,245,246,247,248
};
//定时器低字节编码
uchar code LO_LIST[] =
{
0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
};
//音乐编码
uchar code Song_24C04[] =
{
1,2,3,1,1,2,3,1,3,4,5,3,4,5
};
uchar sidx;
//延时函数
void DelayMS(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
//IIC起始位
void Start()
{
SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;
}
//IIC停止位
void Stop()
{
SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;
}
//IIC应答
void RACK()
{
SDA=1;NOP4();SCL=1;NOP4();SCL=0;
}
void NO_ACK()
{
SDA=1;SCL=1;NOP4();SCL=0;SDA=0;
}
//IIC写入一个字节
void Write_A_Byte(uchar b)
{
uchar i;
for(i=0;i<8;i++)
{
b<<=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;
}
RACK();
}
//向24C04写入一个字节数据
void Write_IIC(uchar addr,uchar dat)
{
Start();
Write_A_Byte(0xa0); //写入指令
Write_A_Byte(addr); //写入地址
Write_A_Byte(dat); //写入数据
Stop();
DelayMS(10);
}
//IIC读取一个字节
uchar Read_A_Byte()
{
uchar i,b;
for(i=0;i<8;i++)
{
SCL=1;b<<=1;B|=SDA;SCL=0;
}
return b;
}
//向24C04读取当前一个数据
uchar Read_Current()
{
uchar d;
Start();
Write_A_Byte(0xa1);
d=Read_A_Byte();
NO_ACK();
Stop();
return d;
}
//向24C04的addr地址读取一个数据
uchar Random_Read(uchar addr)
{
Start();
Write_A_Byte(0xa0);
Write_A_Byte(addr);
Stop();
return Read_Current();
}
//定时器TH寄存器赋值
void T0_INT() interrupt 1
{
SPK=!SPK;
TH0=HI_LIST[sidx];
TL0=LO_LIST[sidx];
}
void main()
{
uchar i;
IE=0x82;
TMOD=0x00;
for(i=0;i<14;i++) //向24C04写入音乐数据
{
Write_IIC(i,Song_24C04[i]);
}
while(1)
{
for(i=0;i<14;i++)
{
sidx=Random_Read(i); //播放音乐
TR0=1;
DelayMS(300);
}
}
}
keil5及Protues7.8软件下载链接:
公众号首页发送关键词-24C02,获取仿真及程序下载链接,或扫以下二维码获取。