📄 uart.c
字号:
#pragma interrupt INTSR6 MD_INTSR6
#pragma interrupt INTST6 MD_INTST6
#pragma interrupt INTSR0 MD_INTSR0
#pragma interrupt INTST0 MD_INTST0
#include "includes.h"
unsigned char CommPortChose;
unsigned char _wait_time = 0;
unsigned char _baud_rate;
unsigned char _h_baud_rate = DEFAULT_H_BAUD_RATE;
void SetUart2BaudRate( void );
const unsigned char _mcu_br[ ] =
{
0x07, 0x68, //300
0x07, 0x34, //600
0x06, 0x34, //1200
0x06, 0x1A, //2400
0x05, 0x1A, //4800
0x04, 0x1A, //9600
};
unsigned char JudgeUart0BaudRate( void )
{
unsigned char i, brs = _baud_rate;
for ( i = 0; i < 7; i++ )
{
if ( brs &0x02 )
{
return i;
}
brs >>= 1;
}
return 2;
}
/**************************************************************************/
/* */
/**************************************************************************/
void SetUart0BaudRate( void )
{
unsigned char br = JudgeUart0BaudRate() *2;
CKSR6 = _mcu_br[ br ]; //这个是分频多少个2的次方
BRGC6 = _mcu_br[ br + 1 ]; //这个是分频多少次方以后再分频多少次
}
/**************************************************************************/
/* */
/**************************************************************************/
void Uart0StartToRx( void )
{
ASIM6 = 0;
RS485_RX_EN();
_disable_interrupt();
ASIM6 = ( BIT4 | BIT3 | BIT2 | BIT0 ); //偶校验 8位数据
ASICL6 = 0x16;
SetUart0BaudRate();
SRIF6 = 0; //清中断接收标志
SRMK6 = 0;
STMK6 = 1; //接收中断关掉
SRPR6 = 1; //中断优先级
ASIM6 |= ( BIT7 | BIT5 ); //充许操作充许接收
_enable_interrupt();
}
/**************************************************************************/
/* */
/**************************************************************************/
void Uart0StartToSend( void )
{
RS485_TX_EN();
Uar0tSend0xFE();
STMK6 = 0; //开发送中断
FramePointer = 0;
TXB6 = FrameBuffer[ FramePointer++ ];
_wait_time = COMM_TIMEOUT;
}
/**************************************************************************/
/* */
/**************************************************************************/
void Uar0tSend0xFE( void )
{
unsigned short count;
unsigned char i;
_disable_interrupt();
ASIM6 = 0;
ASIM6 = ( BIT4 | BIT3 | BIT2 ); //偶校验 8位数据
ASICL6 = 0x16;
SetUart0BaudRate();
SRIF6 = 0; //清中断接收标志
STMK6 = 1;
SRMK6 = 1; //中断屏蔽
STMK6 = 1; //关接收中断
ASIM6 |= ( BIT7 | BIT6 ); //充许操作充许接收发送
_enable_interrupt();
ClrIORBit( IF0H, BIT1 );
for ( i = 0; i < 4; i++ )
{
count = 0;
TXB6 = 0xFE;
while ( ! ( IF0H &BIT1 ) )
//这是用待发送完成的方式来做发送4个FE
{
if ( count++ > 3000 )
{
break;
}
}
ClrIORBit( IF0H, BIT1 );
}
}
/**************************************************************************/
/* */
/**************************************************************************/
void Uar2tSend0xFE( void )
{
unsigned short count;
unsigned char i;
_disable_interrupt();
ASIM0 &= ~ ( BIT5 | BIT6 ); //按照手册上说的先对RXE0清空
POWER0 = 0;
Delay( 2 );
ASIM0 = ( BIT4 | BIT3 | BIT2 ); //偶校验 8位数据
BRGC0 = 0xCD; //9600
POWER0 = 1;
SRIF0 = 0; //清中断接收标志
SRMK0 = 1; //关中断
ASIM0 |= BIT6; //充许操作充许发送
STMK0 = 1; //关接收中断
_enable_interrupt();
for ( i = 0; i < 4; i++ )
{
count = 0;
TXS0 = 0xFE;
while ( ! ( IF0H &BIT2 ) )
//这是用待发送完成的方式来做发送4个FE
{
ClrWdt();
if ( count++ > 3000 )
{
break;
}
}
ClrIORBit( IF0H, BIT2 );
}
}
/**************************************************************************/
/* */
/**************************************************************************/
__interrupt void MD_INTSR6( void ) //这个是485的第一个
{
if ( ! CommPortChose )
{
CommPortChose = RS485_PORT;
}
if ( CommPortChose == RS485_PORT )
{
UartRxByte = RXB6;
RxFrameDispose();
}
}
/**************************************************************************/
/* */
/**************************************************************************/
__interrupt void MD_INTST6( void ) //这个是485的第一个
{
if ( FramePointer >= FrameBuffer[ FRM_DATALEN ] + 12 )
{
SYS_EVT_ADD(EVT_INIT_COMM);
}
else
{
_wait_time = COMM_TIMEOUT;
TXB6 = FrameBuffer[ FramePointer++ ];
}
}
/**************************************************************************/
/* */
/**************************************************************************/
unsigned char JudgeUart2BaudRate( void )
{
unsigned char i, brs = _h_baud_rate;
for ( i = 0; i < 7; i++ )
{
if ( brs &0x02 )
{
return i;
}
brs >>= 1;
}
return 5;
}
/**************************************************************************/
/* */
/**************************************************************************/
void Uart2StartToRx( void )
{
RS485_RX_EN2();
_disable_interrupt();
ASIM0 &= ~ ( BIT5 | BIT6 ); //按照手册上说的先对TXE0清空
Delay( 2 );
POWER0 = 0;
ASIM0 = ( BIT4 | BIT3 | BIT2 | BIT0 ); //偶校验 8位数据
BRGC0 = 0xCD; //这个是9600波特率
STMK0 = 1;
SRPR0 = 1; //提高一下中断优先级
ASIM0 |= ( BIT5 ); //充许操作充许接
SRIF0 = 0; //清中断接收标志
SRMK0 = 0; //开中断
POWER0 = 1;
_enable_interrupt();
}
/**************************************************************************/
/* */
/**************************************************************************/
void Uart2StartToSend( void )
{
RS485_TX_EN2();
Uar2tSend0xFE();
STMK0 = 0;
_NOP();
FramePointer = 0;
TXS0 = FrameBuffer[ FramePointer++ ];
_wait_time = COMM_TIMEOUT;
}
/**************************************************************************/
/* */
/**************************************************************************/
__interrupt void MD_INTSR0( void )
{
if ( ! CommPortChose )
{
CommPortChose = RS485_2_PORT;
}
if ( CommPortChose == RS485_2_PORT )
{
UartRxByte = RXB0;
RxFrameDispose();
}
}
/**************************************************************************/
/* */
/**************************************************************************/
__interrupt void MD_INTST0( void )
{
if ( FramePointer >= FrameBuffer[ FRM_DATALEN ] + 12 )
{
SYS_EVT_ADD(EVT_INIT_COMM);
}
else
{
_wait_time = COMM_TIMEOUT;
TXS0 = FrameBuffer[ FramePointer++ ];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -