?? seriele.c
字號:
#ifndef _SERIAL_H
#define _SERIAL_H
#include <AT89X51.H>
#include <intrins.h>
#include <string.h>
//數(shù)據(jù)類型定義
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
//串口狀態(tài)定義
#define RCV_IDH 0 //接收描述符的高8位
#define RCV_IDL 1 //接收id的低3位+rtr位+dlc(4位)
#define RCV_DATA 2 //接收數(shù)據(jù)
uchar data Rcv_Status=0; //接收狀態(tài)字節(jié)
uchar data Rcv_Point =0; //接收計數(shù)
uchar data Send_Point=0; //發(fā)送計數(shù)
uchar idata RcvBuf[0x10]; //接收數(shù)據(jù)緩沖區(qū)
uchar idata SendBuf[0x10]; //發(fā)送數(shù)據(jù)緩沖區(qū)
extern uchar data DispBuf[5];
bit UartRcvGood;
void InitUart(void); //初始化串口
void Exe_Scon(uchar cmd,uchar dlc,uchar *databuf);//串口發(fā)送函數(shù)
/*-------------------------------------------------------------------------------------------
串口中斷函數(shù)
-------------------------------------------------------------------------------------------*/
void Uart_Val(void) interrupt 4 using 3
{
uchar TempData; //臨時變量
if(_testbit_(RI))
{
TempData=SBUF;
switch(Rcv_Status)
{
case RCV_IDH:
RcvBuf[0]=TempData;
Rcv_Status++;
break;
case RCV_IDL:
RcvBuf[1]=TempData;
if((RcvBuf[1]&0x10)!=0) //遠程幀
{
Rcv_Status=0;
UartRcvGood=1;
}
else //數(shù)據(jù)幀
{
Rcv_Point=2;//TempData&0x0f; //取數(shù)據(jù)長度
Rcv_Status++;
}
break;
case RCV_DATA:
RcvBuf[Rcv_Point]=TempData;
Rcv_Point++;
if((Rcv_Point-2)==(RcvBuf[1]&0x0f))
{
Rcv_Point=0;
Rcv_Status=0;
UartRcvGood=1;
}
break;
default:
break;
}
} //結束if(_testbit(RI))
if(_testbit_(TI))
{
Send_Point++;
if(Send_Point<(SendBuf[2]+4)) //未發(fā)送完畢,繼續(xù)發(fā)送
SBUF=SendBuf[Send_Point];
else
{
Send_Point=0;
}
}//結束if(_testbit(TI))
}
/*-------------------------------------------------------------------------------------------
函數(shù)原型: void InitUart(void)
參數(shù)說明: 無
返回值: 無
說明: 用于初始化串口
-------------------------------------------------------------------------------------------*/
void InitUart(void)
{
SCON = 0x50; //串口工作方式1
TMOD |= 0x20; //T1,初值自動重裝
TH1 = 0xfd; //波特率9600bps @ 11,0592M
TL1 = 0xfd;
TR1 = 1; //開始計數(shù)
IE |= 0x90; //開放串口中斷
}
//
void Exe_Scon(uchar cmd,uchar dlc,uchar *databuf)
{
uchar i,bcc=0;
SendBuf[0] = 0x00;
SendBuf[1] = cmd;
SendBuf[2] = dlc;
memcpy(&(SendBuf+3),databuf,dlc);
for(i=0; i<dlc+3;i++)
bcc^=SendBuf[i];
SendBuf[dlc+3] = bcc;
Send_Point=0;
SBUF = SendBuf[0];
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -