单片机使用调度器下通用软件模拟串口 三倍采样 同步收发 C/C++

admin 2020-5-10 1691

本人前段时间参考小小调度器写的单片机通用软件模拟串口
使用方法:
1、定义接收和发送的IO口
        //C51
        sbit IO_RX P2^1;
        sbit IO_TX P2^2;
       
        //PIC
        #define        IO_RX RC3        //定义接收的IO口
        #define        IO_TX RC4        //定义发送的IO口
       
2、在main主程序while(1)循环之前加上串口初始化代码
        UART_INIT();
3、设置一个定时器的中断时间为34.6uS,在定时器中断里加上下边的代码
        UART_TX();
        UART_RX();
4、在main主程序while(1)循环中判断,UART_RX_STA标志是否是RX_DATAOK,如果是则收到新数据,可以处理收到的数据或将数据转存。
        if(UART_RX_STA==RX_DATAOK)
        {
                unsigned char dat;
                dat=rx_buff;        //rx_buff里的数据为串口收到的数据
                UART_RREST();        //准备接收下一字节数据
        }
5、在发送数据前判断UART_TX_STA标志是否是TX_FREE空闲状态,是空闲状态
        if(UART_TX_STA==TX_FREE)
        {
                unsigned char dat;
                dat=0xF2;
                UART_TDATA(dat);        //将dat从串口发送出去
        }

只要T0的中断时间是对的,T0中断里UART_RX();UART_TX();放的位置对的就不会误码。

中断代码

void interrupt ISR(void) //中断处理程序
{
        if (T0IE && T0IF) //TMRE0中断        约34.6us
        {
                TMR0 = c_TMR0; //T0置初值 中断时间约34.6us
                UART_TX(); //串口发送服务
                UART_RX(); //串口接收服务
                T0IF = 0; //清T0中断标志
        }
}

T0初始化

//16M 2T
#define c_TMR0 128                        //定时器0初值 128=34.6us
void Timer0_Init(void)
{
        //option
        T0CS = 0; //0=定时器 1=计数器
        PSA = 0;  //0=预分频给定时器 1=预分频给看门狗
        PS2 = 0;  //预分频
        PS1 = 0;
        PS0 = 0;
        TMR0 = c_TMR0; //赋初值
        T0IF = 0;
        T0IE = 1;
        GIE = 1;
}


上传的附件:
最新回复 [0]
返回