⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pca_uart_device.c

📁 STC单片机基本程序和模块的介绍和源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -