📄 uart.c
字号:
//---------------------uart.c---------------------
#include "includes.h"
extern uchar volatile cmd;
#define CF_HEADWH 0xa5 // 通讯帧前导高字节
#define CF_HEADWL 0x6d // 通讯帧前导低字节
typedef enum tagGSSTATEWORD
{
GS_STANDBY = 0x10, // 等待
GS_GET_HEADH = 0x20, // 接收帧前导高字节
GS_GET_HEADL, // 接收帧前导低字节
GS_GET_LOFH, // 接收帧长度高字节
GS_GET_LOFL, // 接收帧长度低字节
GS_GET_TAGADRH, // 接收来源地址高字节
GS_GET_TAGADRL, // 接收来源地址低字节
GS_GET_FRAME // 接收帧内容
} GSSTATEWORD;
uchar rs = GS_STANDBY;
//-------------------------------------------------------
void init_uart(uchar cBaudRate)
{
// 初始化T1作波特率发生器
ES = FALSE;
TR1 = FALSE;
TMOD = TMOD & 0x0f | 0x20; //定时器1工作于方式2(8位自动重载)
TH1 = cBaudRate;
PCON = 0x80; // 若SMOD=1, 波特率倍增
TR1 = TRUE;
SCON = 0x50; // 方式1 波特率可变的10位异步方式,包括1个起始位8个数据位1个停止位
// SCON = 0xd0; // 方式2 固定波特率的11位UART方式,比方式1增加了第9位,来自TB8
IP = 0x10;
ES = TRUE; //开中断
}
//-------------------------------------------------------
void uart_send(uchar *buf, uint len)
{
while(len)
{
len--;
SBUF=*buf++;
while(~TI){}
TI=0;
}
}
//-------------------------------------------------------
const uchar code HexAsc[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//-------------------------------------------------------
void print(uchar *label,uchar * value,uchar len,uchar type)
{
uchar s[4];
uchar data i=0,j=0;
while(*label)
{
SBUF = *label++;
while(~TI){}
TI=0;
}
if(type)
{
for(i=0;i<len;i++)
{
SBUF = *value++;
while(~TI){}
TI=0;
}
}
else
{
for(i=0;i < (len*3);i=i+3 )
{
s[0]= HexAsc[*value >>4];
s[1]= HexAsc[*value &0x0f];
s[2]=' ';
for(j=0;j<3;j++)
{
SBUF = s[j];
while(~TI){}
TI=0;
}
value++;
}
}
SBUF = '\n';
while(~TI){}
TI=0;
}
//-------------------------------------------------------
void uart_receive(void) interrupt 4 using 1 //串口接收命令进入ISP
{
/*
static uint temp;
if (RI && !FrameOK)
{
switch (rs)
{
case GS_STANDBY:
p = urxbuf;
if (SBUF == CF_HEADWH)
{ rs = GS_GET_HEADL; *p = CF_HEADWH;}
break;
case GS_GET_HEADL:
if (SBUF == CF_HEADWL)
rs = GS_GET_LOFH;
break;
case GS_GET_LOFH:
len += SBUF;
len = len << 8;
rs = GS_GET_LOFL;
break;
case GS_GET_LOFL:
len += SBUF;
len -= 4;
temp = len;
p = DataBuf;
rs = GS_GET_FRAME;
break;
case GS_GET_FRAME:
*p++ = SBUF;
if (--temp == 0)
{ rs = GS_STANDBY; FrameOK=TRUE;}
break;
default:
rs = GS_STANDBY;
p = urxbuf;
break;
}
RI=0;
}
*/
if(RI==1)
{
ACC=SBUF;
if(ACC==0x12)
{
delay_us(DY200MS);
delay_us(DY200MS);
delay_us(DY200MS);
delay_us(DY200MS);
delay_us(DY200MS);
ISP_CONTR=0x60;
}
cmd=ACC;
RI=0;
}
}
//-------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -