//PC讀MCU指令結(jié)構(gòu):(中斷方式,ASCII碼表示)
//幀:幀頭標志| 幀類型| 器件地址| 啟始地址| 長度n| 效驗和| 幀尾標志
//值:’n’ ’y’ | ’ r’ |0x01| x|x |x| 0x130x10
//字節(jié)數(shù):2|1|1|1|1|1|2
//求和:
/////////////////////////////////////////////////////////////////////
//功能描述:中斷方式:本程序為mcu的串口通訊提供(貞結(jié)構(gòu))函數(shù)接口,包括具體協(xié)議部分
//其他說明:只提供對AT89c51具體硬件的可靠訪問接口
//版本:1.0
//信息:
/////////////////////////////////////////////////////////////////////
#include
#include
//預定義
//幀
#defineF_ST10x6e//幀頭標志n
#defineF_ST20x79//幀頭標志y
#defineF_R0x72//幀類型讀
r
#defineF_W0x77//幀類型寫
w
#defineF_D0x64//幀類型數(shù)據(jù)幀d
#defineF_B0x62//幀類型寫回應幀b
#defineF_C0x63//幀類型重發(fā)命令幀c
#defineF_Q0x71//幀類型放棄幀q
#defineF_ADDR0x31//器件地址0-9
#defineF_END0x7a//幀尾標志z
#defineF_SPACE0x30//空標志0
#defineF_ERR10x31//錯誤標志1,flagerr1
#defineF_ERR20x32//錯誤標志2
2
//常數(shù)
#defineS_MAXBUF16//接收/發(fā)送數(shù)據(jù)的最大緩存量
#defineFIELD_MAXBUF48//最小場緩存,可以大于48字節(jié),因為協(xié)議是以20字節(jié)為單
位傳輸?shù)?/p>
#definecommunicationingP1_7//正在通訊(1)標志
#defineERRFRAME_MAX5//連續(xù)NOFRAME_CNT次幀不正確
#defineERR_NOCNTMAX_RESENDif(++errframe_cnt<=ERRFRAME_MAX)resend_frame();
elseerrframe_cnt=communicationing=0;
//若超過
ERRFRAME_MAX次則令通訊停止ERR_NOCNTMAX_RESEND
//public變量
unsignedchardatabuf[FIELD_MAXBUF],errframe_cnt;
//函數(shù)
/////////////////////////////////////////////////////////////////////
//函數(shù)名:send()
//功能描述:向串口發(fā)送一個字符
//函數(shù)說明:
//調(diào)用函數(shù):
//全局變量:
//輸入:ch-要發(fā)送的ASCII字符
//返回:無
//設計者:牛毅
//修改者:
//版本:
/////////////////////////////////////////////////////////////////////
voidsend(unsignedcharch)
{SBUF=ch;while(TI==0);TI=0;}
/////////////////////////////////////////////////////////////////////
//函數(shù)名:receive()
//功能描述:從串口接收一個字符
//函數(shù)說明:
//調(diào)用函數(shù):
//全局變量:
//輸入:無
//返回:一個ASCII字符
//設計者:牛毅
//修改者:
//版本:
/////////////////////////////////////////////////////////////////////
unsignedcharreceive(void)
{while(RI==0);RI=0;returnSBUF;}
/////////////////////////////////////////////////////////////////////
//函數(shù)名:CharToHex()
//功能描述:把ASCII字符轉(zhuǎn)換為16進制
//函數(shù)說明:
//調(diào)用函數(shù):
//全局變量:
//輸入:ASCII字符
//返回:16進制
//設計者:牛毅
//修改者:
//版本:
/////////////////////////////////////////////////////////////////////
unsignedcharCharToHex(unsignedcharbChar){
if((bChar>=0x30)&&(bChar<=0x39))
bChar-=0x30;
elseif((bChar>=0x41)&&(bChar<=0x46))//大寫字母
bChar-=0x37;
elseif((bChar>=0x61)&&(bChar<=0x66))//小寫字母
bChar-=0x57;
elsebChar=0xff;
returnbChar;
}
/////////////////////////////////////////////////////////////////////
//函數(shù)名:HexToChar()
//功能描述:把16進制轉(zhuǎn)換為ASCII字符
//函數(shù)說明:
//調(diào)用函數(shù):
//全局變量:
//輸入:16進制
//返回:ASCII字符
//設計者:牛毅
//修改者:
//版本:
/////////////////////////////////////////////////////////////////////
unsignedcharHexToChar(unsignedcharbHex){
if((bHex>=0)&&(bHex<=9))
bHex+=0x30;
elseif((bHex>=10)&&(bHex<=15))//大寫字母
bHex+=0x37;
elsebHex=0xff;
returnbHex;
}
/////////////////////////////////////////////////////////////////////
//函數(shù)名:com_int()
//功能描述:初始化串口
//函數(shù)說明:默認其他參數(shù)為[baud_rate],n,8,1
//調(diào)用函數(shù):
//全局變量:
//輸入:baud_rate波特率
//返回:無
//設計者:牛毅
//修改者:
//版本:
/////////////////////////////////////////////////////////////////////
voidcom_init(unsignedintbaud_rate){
EA=1;ES=1;//ET1=1;
SCON=0x50;/*0x52;//SCON*/
TMOD=0x20;/*0x20;//TMOD*/
TCON=0x60;/*0x60;//TCON*/
PCON=PCON&0x7f;
switch(baud_rate){//波特率設置
case1200:
TL1=0xe8;TH1=0Xe8;break;//1200
case2400:
TL1=0xf4;TH1=0Xf4;break;//2400
case4800:
TL1=0xfa;TH1=0Xfa;break;//4800
case9600:
TL1=0xfd;TH1=0Xfd;break;//9600
case19200:
PCON=PCON|0x80;TL1=0xfd;TH1=0Xfd;break;//19200
case38400:
PCON=PCON|0x80;TL1=0xfe;TH1=0Xfe;break;//38400
default:
TL1=0xfd;TH1=0Xfd;break;//9600
}
}
/////////////////////////////////////