3. 通讯功能的设计
在指令控制的实现上,主要涉及串行通讯的初始化、指令生成与输出等函数。测试过程中,可通过串口助手来验证相应的指令功能。
该设计所用单片机其晶振11.0592MH,故很容易获得9600bps的波特率,其串行通讯的初始化函数如下:
void init_serialcom( void )
{
SCON = 0x50 ;
TMOD |= 0x20 ;
PCON |= 0x80 ;
TH1 = 0xFA ; // 9600bps,11.0592MHz 晶振.
IE |= 0x90 ;
TR1 = 1 ;
TI=1;
}
为实现单个字符的输出,相应的发送函数如下:
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI== 0);
TI=0;
}
为了便于发送各操作指令,指令输出函数是带参数的,并以参数决定发送的,该函数内容如下:
void send_zl(unsigned char h)
{
u8 n=0;
unsigned char m;
while(n<10)
{
if(h==0) m=cmd[n];//play
if(h==1) m=cmd4[n];//pause
if(h==2) m=cmd5[n];//stop
if(h==3) m=cmd3[n];//play index
if(h==4) m=cmd6[n];//set Volume
send_char_com(m);
delay(10);
n++;
}
}
按歌曲顺序播放的函数如下:
void playn(unsigned int index) //play index
{ // index为歌曲顺序号:0~2999
u8 i;
u8 checksum = 0;
cmd3[5] = (u8)(index >> 8);
cmd3[6] = (u8)(index);
for(i=2; i<8; i++)
{
checksum += cmd3[i]; //计算校验和
}
cmd3[8] = (u8)~checksum;
}
调节音量的函数如下:
void setVolume(u8 index) //set Volume
{
// index为音量值:0~30
u8 i;
u8 checksum = 0;
cmd6[6] = (u8)(index);
for (i=2; i<8; i++)
{
checksum += cmd6[i];//计算校验和
}
cmd6[8] = (u8)~checksum;
} |