转-单片机通用软件模拟串口 三倍采样 同步收发 C/C++

admin 2020-5-29 1905

异步收发                接收和发送同时进行互不影响

三倍采样率        如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


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