|
#include <reg52.h>
#define COMM_BAUD_RATE 9600 //串口波特率
#define OSC_FREQ 11059200 //運(yùn)行晶振:11.05926MH
static INT8U Send_buf[10]={0};
void Delay_Ms(INT32U z)//
{
INT32U x=0 , y=0;//
for(x=110 ; x>0 ;x--)//
for(y=z; y>0;y-- );//
}
//
/******************************************************************************
- 功能描述: 串口1初始化
- 注: 設(shè)置為9600波特率
******************************************************************************/
void Serial_init(void)
{
TMOD = 0x20;// // 設(shè)置 T1 為波特率發(fā)生器
SCON = 0x50;// // 0101,0000 8位數(shù)據(jù)位, 無(wú)奇偶校驗(yàn)
PCON = 0x00;// //PCON=0;
TH1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);//設(shè)置為9600波特率
TL1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);
TR1 = 1;// //定時(shí)器1打開(kāi)
REN = 1;// //串口1接收使能
ES= 1;// //串口1中斷使能
}
void Uart_PutByte(INT8U ch)//
{
SBUF = ch;//
while(!TI){;}//
TI = 0;//
}
/******************************************************************************
- 功能描述: 串口向外發(fā)送命令[包括控制和查詢]
- 參數(shù)說(shuō)明: CMD:表示控制指令,請(qǐng)查閱指令表,還包括查詢的相關(guān)指令
feedback:是否需要應(yīng)答[0:不需要應(yīng)答,1:需要應(yīng)答]
data:傳送的參數(shù)
******************************************************************************/
void SendCmd(INT8U len)
{
INT8U i = 0 ;//
Uart_PutByte(0x7E); //起始
for(i=0; i<len; i++)//數(shù)據(jù)
{
Uart_PutByte(Send_buf[i]);//
}
Uart_PutByte(0xEF);//結(jié)束
}
/******************************************************************************
- 功能描述:求和校驗(yàn)
- 和校驗(yàn)的思路如下:
發(fā)送的指令,去掉起始和結(jié)束。將中間的6個(gè)字節(jié)進(jìn)行累加,最后取反碼。接收端就將接收到的一幀數(shù)據(jù),去掉起始和結(jié)束。將中間的數(shù)據(jù)累加,再加上接收到的校驗(yàn)字節(jié)。剛好為0.這樣就代表接收到的數(shù)據(jù)完全正確。
******************************************************************************/
void DoSum( INT8U *Str, INT8U len)
{
INT16U xorsum = 0;//
INT8U i;//
for(i=0; i<len; i++)//
{//
xorsum = xorsum + Str[i];//
}//
xorsum = 0 -xorsum;//
*(Str+i) = (INT8U)(xorsum >>8);//
*(Str+i+1) = (INT8U)(xorsum & 0x00ff);//
}
void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat)
{
Send_buf[0] = 0xff;//保留字節(jié)
Send_buf[1] = 0x06; //長(zhǎng)度
Send_buf[2] = CMD;//控制指令
Send_buf[3] = feedback;//是否需要反饋
Send_buf[4] = (INT8U)(dat >> 8);//datah
Send_buf[5] = (INT8U)(dat);//datal
DoSum(&Send_buf[0],6);//校驗(yàn)
SendCmd(8);//發(fā)送此幀數(shù)據(jù)
}
void main()
{
Serial_init();//串口寄存器的初始化設(shè)置
Uart_SendCMD(0x03 , 0 , 0x01) ;//播放第一首
Delay_Ms(1000) ;//延時(shí)大概6S
Uart_SendCMD(0x03 , 0 , 0x02) ;//播放第二首
Delay_Ms(1000) ;//延時(shí)大概6S
Uart_SendCMD(0x03 , 0 , 0x04) ;//播放第四首
while(1) ;
}
編的時(shí)候static INT8U Send_buf[10]={0};總是出錯(cuò),
錯(cuò)誤提示C6: error C129: missing `;` before `send_buf `
|
|