本人前段时间参考小小调度器写的单片机通用软件模拟串口
使用方法:
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;
}