單片機(jī)與PC機(jī)通信示例
#define SENDBUFSIZE 0x0f
#define BR_19K20xfd
#defineRMAX0x10//必須是2的整數(shù)次冪。21ic上看到的,好像是“劉前輩”的創(chuàng)意
unsigned char xdata*cpSendBufPtr;
unsigned charcFront;
unsigned charcBack;
unsigned charsendData;
bitcTranFlag;
unsigned charcTranData;
bitcRecFlag;
unsigned charcRecData;
bitcJudge;
unsigned chartemp;
void HardWareInit();
void Uart_Init(void);
void Uart_Init(void);
void COMM_Init(unsigned char cBaudRate, bit bSMOD); //初始化UART
//sfr AUXR = 0x8E;
//MODE COM4 19200,0,8,1;ASSIGN COM4
//波特率為19200Hz,將串口接收到的數(shù)據(jù),重新轉(zhuǎn)發(fā)出去?
//數(shù)據(jù)接收速度可能大于發(fā)送速度,增加緩沖區(qū),優(yōu)先保存接收的數(shù)據(jù)
main()
{
sendData=0;
cFront=0; //
cBack=0;//
cRecFlag=0; //還未接收到數(shù)據(jù)
cTranFlag=1;//系統(tǒng)復(fù)位后,只要隊(duì)列非空,隨時(shí)可以發(fā)送數(shù)據(jù)
RS0 = RS1 = 0;// 使用寄存器組0
AUXR = 0x01; //禁止ALE信號輸出
EA = 0;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
P4 = 0xFF;
ES = 0;
TR1 = 0;
TMOD = TMOD & 0x0f | 0x20;
TH1 = BR_19K2;
TL1 = BR_19K2;////------------------------------------------------------------------------------------------
PCON = 0x80; // 若SMOD=1, 波特率倍增
SCON = 0x50;// 8位
IP = 0x10;// 串口優(yōu)先中斷
ES = 1;
// wifi模塊: 波特率19200/38400/57600/115200bps 數(shù)據(jù)位:8bits 校驗(yàn)位:無 停止位:1bits 流控 :無
EA = 1;
TR1 = 1;
//SBUF=0x12;
while(1)
{
/*
*/// 14 15 16 17 18 19 20 21
if(cRecFlag)
{
temp=((cFront+1)^cBack)&0x0f;
if(temp!=0)//循環(huán)鏈表還沒有填滿,可以繼續(xù)添加數(shù)據(jù)
{
cFront=cFront+1;
cFront=cFront&(RMAX-1);
cpSendBufPtr[cFront]=cRecData;
cRecFlag=0;
}
}
if(cTranFlag)
{
temp=(cBack^cFront)&0x0f;//發(fā)送了一個(gè)新的數(shù),這一個(gè)地方是cBack而不是cBack+1
if(temp!=0)//循環(huán)鏈表非空時(shí)可以發(fā)送數(shù)據(jù)
{
cBack=cBack+1;
SBUF=cpSendBufPtr[cBack];
cpSendBufPtr[cBack]=0x00;
cBack=cBack&(RMAX-1);
cTranFlag=0;
}
}
}
}
/*******************************************************************************
// 功能: UART完成數(shù)據(jù)收發(fā)產(chǎn)生中斷程序
// 輸入?yún)?shù): 無
// 輸出參數(shù): 無
// 返回值: 無
*******************************************************************************/
void COMM_INT() interrupt 4 using 3
{
if(RI)//若正在處理接受的數(shù)據(jù),則丟棄SBUF中的數(shù)據(jù)^cRecFlag
{
cRecData=SBUF;
cRecFlag=1;
RI=0;
}
if(TI)
{
cTranFlag=1;
TI=0;
}//發(fā)送完成,同時(shí)cTranData被賦新值*/
}
評論