void UartInit(void)
{
SCON=0x40;
T2CON=0x34;
RCAP2L=0xD9;
RCAP2H=0xFF;
REN=1;
ES=1;
}
/****************************************************
** 函数名称: UARTSendByte
** 输 入: b 单个字节
** 输 出: 无
** 功能描述: 串口 发送单个字节
*****************************************************/
void UARTSendByte(UINT8 b)
{
SBUF=b;
while(TI==0);
TI=0;
}
/****************************************************
** 函数名称: UARTSendByte
** 输 入: b 单个字节
** 输 出: 无
** 功能描述: 串口 发送单个字节
*****************************************************/
void UartSendNBytes(UINT8 *buf,UINT8 len)
{
while(len--)
{
UARTSendByte(*buf++);
}
}
/****************************************************
** 函数名称: main
** 输 入: 无
** 输 出: 无
** 功能描述: 函数主题
*****************************************************/
void main(void)
{
UINT8 i=0;
UINT8 ucCheckSum=0;
UartInit();//串口初始化
EA=1; //开总中断
while(1)
{
if(bLedOn) //是否点亮Led
{
LED(ON);
}
else
{
LED(OFF);
}
if(bBellOn)//是否响蜂鸣器
{
BELL(ON);
}
else
{
BELL(OFF);
}
if(bReqData)//是否请求数据
{
bReqData=FALSE;
NOT_EN_UART(); //禁止串口中断
PktParityEx.r.m_ucHead1=UCMD_CTRL_HEAD1;//MCU上传数据帧头部1
PktParityEx.r.m_ucHead2=UCMD_CTRL_HEAD2;//MCU上传数据帧头部2
PktParityEx.r.m_ucOptCode=UCMD_REQ_DATA;//MCU上传数据帧命令码
PktParityEx.r.m_ucParity=OddParity(PktParityEx.p,
CTRL_FRAME_LEN+
PktParityEx.r.m_ucDataLength);//计算校验值
/*
这样做的原因是因为有时写数据长度不一样,
导致PktParityEx.r.m_ucParity会出现为0的情况
所以使用BufCpy将校验值复制到相应的位置
*/
BufCpy(&PktParityEx.p[CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength],
&PktParityEx.r.m_ucParity,
PARITY_LEN);
UartSendNBytes(PktParityEx.p,
CTRL_FRAME_LEN+
PktParityEx.r.m_ucDataLength+
PARITY_LEN);//发送数据
EN_UART();//允许串口中断
}
}
}
|