📄 p89c669.txt
字号:
/*******************************************************************************************
* 程序名: P89C669双串口轴温转发盒程序
* 功能描述:串口0的硬软件
*******************************************************************************************/
//包含文件
#include <reg669.h>
//常量定义
#define MyAddr 0x0a //本中转盒地址(沿用这个ID)
#define BPS 9600L //波特率
#define FX 2*11059200L //本单元时钟频率:由于669是24MHz的CPU时钟,一个机器周期包含6个时钟周期,
//所以*2
#define STX 0xaa //数据祯头标志
#define ETX 0x55 //数据祯尾标志
#define FMaxLength 40
#define TOTAL 13
#define CmdRST 0
#define CmdTEP 1
#define TMEDIR 0
#define HostDIR 0x80 //主机数据(bit7)
//变量定义
sbit TXEN =P3^4; //TXD 串口0发送使能
sbit TXEN1 =P1^3; //TXD1 串口1发送使能
unsigned char idata TmpVal[20]; //数据接收缓存
unsigned char idata data1Buf[FMaxLength]; //接收和发送数据区,半双工485可以只用一个数据区
unsigned char idata data2Buf[FMaxLength];
unsigned char *bfpt0[9],*bfpt1[9];
unsigned char data RXLength; //暂时存储长度,RXD
unsigned char data TXLength;
unsigned char data *TX_P; //指向PCji缓冲区的指针(指向数组,注意回到数组首址
unsigned char data *RX_P;
unsigned char data RXTimeOut; //数据帧过长或帧在接收完整前等待的时间,即接收超时。
bit gRXCompFlag=0; //接收完一帧数据标记
//宏定义
#define TXD_EN() TXEN=1 //485_0发送有效
#define RXD_EN() TXEN=0 //485_0允许接受
#define TXD1_EN() TXEN1=1 //485_1发送有效
#define RXD1_EN() TXEN1=0 //485_1允许接受
/*******************************************************************************************
* 函数名: Uart1Init UART1
* 功能描述:初始化串口0、串口1
× 详细说明:串口0的设置:中断方式收发
串口1按查询方式收发,有主程序调用控制。
*******************************************************************************************/
void Uart1Init( void )
{
//串口0初始化
TMOD|=0X20; //||TMOD; //T1方式2uart
TH1=0xfa;//256-(FX)/(384*BPS); //0xfd; //0xfd:9600bps //0xf4:2400bps
TL1=0xfa;//256-FX/(384*BPS); //0xfd; //11.0592MHz //d0:600bps
TR1=1; //定时器开始运行
SCON=0X50;
ES0=1;
PS0=1;
RXD_EN(); //相对主机而言,转发单元的串口0应常处于接收状态
//串口1初始化
S1STAT = 0x20 ; //区分接收和发送中断
S1CON = 0x00 ; //串口控制寄存器清零
REN_1 = 1 ; //串口1接受允许
SM0_1 = 0 ; //设定串口通讯方式为模式1
SM1_1 = 1 ;
BRGCON = 0 ; //设置波特率
BRGR1 = 1136 >> 8 ;
BRGR0 = 1136 & 0x0ff ;
BRGCON = 1 ;
TI_1=1;
}
/*********************************************************************************************************
** 函数名称: 串口中断服务子程序serial
** 功能描述: 结束和发送数据并处理链路(帧格式),发送数据在data1Buf/*TX_P中,指明长度TXLength
接收没有考虑缓冲区
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void serial(void) interrupt 4 using 1
{
static unsigned char data FRXLength;
static unsigned char data sumCS;
unsigned char data comBuff;
if(TI_0)
{
TI_0=0;
if (TXLength==0)
RXD_EN();
else
{
SBUF=*TX_P;TX_P++;
TXLength--;
}
}
if(RI_0) //接收
{
RI_0=0;
comBuff=SBUF;
RXTimeOut=10;
RXLength++;
*RX_P=comBuff;
RX_P++;
sumCS=sumCS+comBuff;
if (RXLength==1)
{
if (comBuff!=STX)
{ RXLength=0;
RX_P=data2Buf;
}
return;
}
if (RXLength==2)
{
FRXLength=comBuff;
sumCS=comBuff;
if (comBuff>FMaxLength)
{
RXLength=0;
RX_P=data2Buf;
}
return;
}
if (RXLength==3)
{
if(comBuff!=MyAddr)
{
RX_P=data2Buf;
RXLength=0;
}
return;
}
if (RXLength>FRXLength+3)
{
RX_P--;RX_P--;
comBuff=(*RX_P)<<1;
if (sumCS==(comBuff+ETX))
gRXCompFlag=1;
RX_P=data2Buf;
RXLength=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -