异步收发 接收和发送同时进行互不影响
三倍采样率 如9600波特率,定时器中断时间为34.6uS
使用方法:
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=UART_RX_BUFF; //UART_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从串口发送出去
}
#ifndef __UART_H
#define __UART_H
/****软件串口开始**********************************************/
/////三倍采样率 如9600波特率,定时器中断时间为34.6uS
////2018 BY:问星
//********************************************************************
//定义接收和发送的IO口
sbit IO_RX P2^1;
sbit IO_TX P2^2;
/*
使用方法:
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从串口发送出去
}
*/
//********************************************************************
//结构体定义
volatile struct{ //标志变量
unsigned STA:2; //接收状态标志 0:空闲;1:开始接收;2:接收完成
unsigned NUM:4; //8位单字节接收计数
unsigned CNT:2; //接收周期计数
}f_rx;
volatile struct{ //标志变量
unsigned STA:2; //发送状态标志 0:空闲;1:准备发送;2:正在发送;3:发送停止位;0:发送完成
unsigned NUM:4; //8位单字节发送计数
unsigned CNT:2; //发送周期计数
}f_tx;
#define UART_RX_STA f_rx.STA //接收状态
#define UART_TX_STA f_tx.STA //发送状态
#define RX_FREE 0 //接收空闲状态
#define RX_DATAOK 3 //数据接收完成状态
#define TX_FREE 0 //发送空闲状态
//********************************************************************
//变量定义
volatile unsigned char rx_buff,tx_buff; //
//********************************************************************
//串口初始化
#define UART_INIT() IO_TX=1;f_rx.STA=0;f_tx.STA=0
//********************************************************************
//串口接收
#define UART_RX() {switch(f_rx.STA){case 0:{if(IO_RX==0){f_rx.STA=1;f_rx.NUM=8;rx_buff=0;f_rx.CNT=0;}}break;case 1:{f_rx.CNT++;if(f_rx.CNT==3){if(IO_RX){rx_buff|=0x80;}else{rx_buff&=0x7F;}f_rx.CNT=0;f_rx.NUM--;if(f_rx.NUM>0){rx_buff>>=1;}else{f_rx.STA=2;}}}break;case 2:{f_rx.CNT++;if(f_rx.CNT==3){f_rx.STA=3;}}break;default:break;}
//********************************************************************
//准备接收下一数据
#define UART_RREST() f_rx.STA=0
//********************************************************************
//串口发送数据
#define UART_TDATA(data) tx_buff=data;f_tx.STA=1;f_tx.CNT=0
//********************************************************************
//串口发送
#define UART_TX() {switch(f_tx.STA){case 0:break;case 1:{f_tx.CNT++;if(f_tx.CNT==1){IO_TX=0;}else if(f_tx.CNT==3){f_tx.STA=2;f_tx.CNT=0;f_tx.NUM=8;}}break;case 2:{f_tx.CNT++;if(f_tx.CNT==1){IO_TX=tx_buff&0X01;tx_buff=(tx_buff>>1);f_tx.NUM--;}else if(f_tx.CNT==3){f_tx.CNT=0;if(f_tx.NUM==0){f_tx.STA=3;}}}break;case 3:{f_tx.CNT++;if(f_tx.CNT==1){IO_TX=1;}else if(f_tx.CNT==3){f_tx.STA=0;}}break;default:break;}}
//********************************************************************
/*****软件串口结束*******************************************************/
#endif