📄 pca_uart_device.c
字号:
while( Tx_data_ready == 0 ) //等待准备发送数据
{
;
}
Tx_buffer = send_data;//将要发送的数据放入缓冲区
Tx_data_ready = 0;
if( Tx_timer_en != 1 )
{
Tx_time = (uint16)CL + (uint16)( CH << 8 );//读出计数器的值
Tx_time += TX_FULL_BIT;//加入一个位的时间
CCAP1L = (uint8)Tx_time;//放入模块1中
CCAP1H = (uint8)( Tx_time >> 8 );
CCAPM1 = TIMER_INI;//设置为定时模式
Tx_timer_en = 1;//设为1,即下次准备
}
}
/******************************************************************************
函数:Rx_enable()
功能:接收使能
说明:设置接收状态及PCA模块0低电平触发以允许使能接收
******************************************************************************/
void Rx_enable(void)
{
Rx_state = S_RX_START_EDGE;//开始使能接收
CCAPM0 = NEG_CAP_INT;//设置为下降沿捕获
}
/******************************************************************************
函数:Rx_disable()
功能:禁止接收
说明:在程序开始时进行的状态初始化,禁止接收,之后通过接收使能函数开始
******************************************************************************/
void Rx_disable(void)
{
Rx_state = S_RX_START_EDGE;//开始接收状态
CCAPM0 = DISABLED_MODE;//禁止模式
}
/******************************************************************************
函数:Receive()
功能:接收函数
说明:接收函数对应的模块为PCA模块0
******************************************************************************/
void Receive(void)
{
if(Rx_state != S_RX_START_EDGE) //检测 起始下降沿 判断
{
if(Rx_state != S_RX_START_BIT) //检测 起始位 判断
{
if(Rx_state != S_RX_DATA_BIT ) //检测 数据位 判断
{
if( Rx_state != S_RX_STOP_BIT ) //检测 停止位 判断
{
Rx_state = S_RX_START_EDGE;//恢复初始状态
CCAPM0 = NEG_CAP_INT;//下降沿捕获
}
else
{
Rx_buffer = Rx_shift;//将接收到的数据存入变量中
CCAPM0 = NEG_CAP_INT;//恢复为下降沿捕获
Rx_state = S_RX_START_EDGE;//恢复初始状态
Rx_data_error = RXD_PIN;//可不用这句,但为了得到正确的状态加以描述
Rx_data_ready = 1;//开始准备
Send_UART(Rx_buffer);//将得到的数据发送到串口中观察结果
Display_LED();
}
}
else
{ //接收数据
Rx_shift >>= 1;//接收数据,向右移动
if( RXD_PIN == 1 )//接收数据
{
Rx_shift |= 0x80;
}
else
{
Rx_shift &= 0x7f;
}
Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
Rx_time += RX_FULL_BIT;
CCAP0L = (uint8)(Rx_time); //低8位重新放入寄存器中
CCAP0H = (uint8)( Rx_time >> 8 );//高8位重新放入寄存器中
Rx_count--; //状态递减,也就是发送位一位一位的进行
if( Rx_count == 0 )
{
Rx_state = S_RX_STOP_BIT;
}
}
}
else
{ //接收起始位
if( RXD_PIN != 1 )
{
Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
Rx_time += RX_FULL_BIT;
CCAP0L = (uint8)(Rx_time);
CCAP0H = (uint8)( Rx_time >> 8 );
Rx_state = S_RX_DATA_BIT;
Rx_count = 0x08;
}
else
{
Rx_data_error = 1;//错误状态
Rx_state = S_RX_START_BIT;
}
}
}
else
{ //接收起始位初始化
Rx_time = (uint16)CCAP0L + (uint16)( CCAP0H << 8 );
Rx_time += RX_HALF_BIT;//这里延时半个位,以便之后进行采样
CCAP0L = (uint8)(Rx_time);
CCAP0H = (uint8)( Rx_time >> 8 );
CCAPM0 = TIMER_INI;
Rx_state = S_RX_START_BIT;
}
}
/******************************************************************************
函数:Transmit()
功能:发送函数
说明:发送函数对应的模块为PCA模块1
******************************************************************************/
void Transmit(void)
{
if( Tx_state != S_TX_START_BIT ) //是否发送起始位 状态
{
if( Tx_state != S_TX_DATA_BIT) //是否发送数据位 状态
{
if( Tx_state != S_TX_STOP_BIT ) //是否发送停止位 状态
{
if( Tx_state != S_TX_STOP_END ) //是否发送结束 状态
{ //不是
Tx_state = S_TX_START_BIT;
Tx_data_ready = 1;
CCAPM1 = DISABLED_MODE;
}
else
{ //是
Tx_state = S_TX_START_BIT;
if( Tx_data_ready != 1 ) //是否成功发送停止位
{ //没有
Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
Tx_time += TX_FULL_BIT;
CCAP1L = (uint8)Tx_time;
CCAP1H = (uint8)( Tx_time >> 8 );
}
else
{ //有
CCAPM1 = DISABLED_MODE;
Tx_timer_en = 0; //使能发送定时器标志位,0为禁止
}
}
}
else
{
TXD_PIN = 1;
Tx_state = S_TX_STOP_END;
Tx_data_ready = 1;
Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
Tx_time += TX_FULL_BIT;
CCAP1L = (uint8)Tx_time;
CCAP1H = (uint8)( Tx_time >> 8 );
}
}
else
{ //发送数据位
if( ( Tx_shift & 0x01) == 0x01 )
{
TXD_PIN = 1;
}
else
{
TXD_PIN = 0;
}
Tx_shift >>= 1;
Tx_count--;
if( Tx_count == 0 )
{
Tx_state = S_TX_STOP_BIT;
}
Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
Tx_time += TX_FULL_BIT;
CCAP1L = (uint8)Tx_time;
CCAP1H = (uint8)( Tx_time >> 8 );
}
}
else
{ //发送起始位
TXD_PIN = 0;
Tx_state = S_TX_DATA_BIT;
Tx_count = 0x08;
Tx_shift = Tx_buffer;
Tx_time = (uint16)CCAP1L + (uint16)( CCAP1H << 8 );
Tx_time += TX_FULL_BIT;
CCAP1L = (uint8)Tx_time;
CCAP1H = (uint8)( Tx_time >> 8 );
}
}
/******************************************************************************
函数:delay()
功能:延时函数
说明:这里采用的是软件延时 ,延时一点时间
******************************************************************************/
void delay(uint16 idata In,uint16 idata Out)
{
uint16 idata i,j;
for( i = 0;i < In;i++ )
{
for( j = 0;j < Out;j++ )
{
;
}
}
}
/******************************************************************************
函数:PCA_IRQ()
功能:PCA串口中断服务程序
说明:采用PCA作串口时,模块1作发送端,模块0作接收端
******************************************************************************/
void PCA_IRQ(void) interrupt 7
{
if( CCF0 == 1 )//模块0作为接收端
{
CCF0 = 0;
Receive();//接收函数
}
if( CCF1 == 1 )//模块1作发送端
{
CCF1 = 0;
Transmit();//发送函数
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -