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

📄 text1.c

📁 双串口于单片机通讯
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define WAIT 100

bit bdata bUart0RFlag, bUart1RFlag, bUart2RFlag, bUartRFlag;
/** receiving memory of upper machine, read data while Uart0RFlag=1 */
uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf;
/** upper machine sends state flag, '1' means com port 'busy'
 * (sending data to sub com port, just sending new data to sending buffer of 
 * sub comport. '0' means idle, user application should set 'TI=1' to launch
 * data sending of sub comport
 */
bit bdata bUartBusy;		
/* upper request flag of sending instruction. Before sending upper machine must 
 * put instruction to be transmitted into 'InstructBuf'. Then set this flag to 
 * '1', after this flag being changed to '0', this process could be done again
*/							
bit bdata bInstructFlag;	

uchar idata InstructBuf;	//指令缓冲(用户可将设置SP2328/SP2338的指令放入
							//该寄存器,由驱动程序自动完成指令发送)
uchar idata UartPointer;	//子串口发送数据指针,中断服务程序通过该指针轮询
							//发送数据到各子串口,保证各子串口的数据不丢失

uchar idata Uart0Tbuf[8]; 	/* sub Uart 0 data sending buffer*/
uchar idata Uart1TBuf[8]; 	/* sub Uart 1 data sending buffer*/
uchar idata Uart2TBuf[8]; 	/* sub Uart 2 data sending buffer*/
uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf;	//上位机接收子串口数据缓
							//冲存储器,上位机通过判断"bUart0RFlag"等标志
							//是否为"1",来决定是否读取该寄存器的数据
uchar idata Uart0TNum,Uart1TNum,Uart2TNum;	//等待发送到各
							//子串口的字节数,"0"表示相应子串口发送缓冲区"空"
							//主程序可以通过判断该标志是否为"0"来决定是否向
							//相应子串口发送后续数据

sbit 	AdrIn0 =P1^0;	
sbit	AdrIn1 =P1^1;		
sbit	AdrOut0=P1^2;		
sbit	AdrOut1=P1^3;	
							

uint data buffer1=0, buffer0=0;  //定时器计数变量
sbit green=P1^4;           
sbit red=P1^5;

/*串口服务子程序*/
serial () interrupt 4
{
	if(RI)
	{
		RI=0;                   //准备解析刚接收到的数据来自于哪个子串口
		bUartRFlag=1;           //产生串口中断标志位
		if(AdrIn1){				//子串口2接收到一个字节(未用)
			Uart2RBuf=SBUF;		//缓存子串口2收到的数据,以便接收后续数据
			bUart2RFlag=1;		//置子串口2收到数据标志,便于主程序查询
		} else if(AdrIn0){		//子串口1接收到一个字节
			Uart1RBuf=SBUF;		//缓存子串口1收到的数据,以便接收后续数据
			bUart1RFlag=1;		//置子串口1收到数据标志,便于主程序查询
		}
		else {					//子串口0接收到一个字节
			Uart0RBuf=SBUF;		//缓存子串口0收到的数据,以便接收后续数据
			bUart0RFlag=1;		//置子串口0收到数据标志,便于主程序查询
		}
	}else{
		TI=0;							//已经产生发送中断,准备解析下一个需要发送的数据
		switch(UartPointer){			//判断即将向哪个子串口发送数据?
			case 0:{					//准备向子串口0发送数据
				UartPointer++;			//下一次发送中断准备向子串口1发送数据
				if(Uart0TNum){			//串口0发送缓存区是否有数据需要发送?
					AdrOut0=0;			//有数据需要发送,则选通子串口0的地址
					AdrOut1=0;
					SBUF=Uart0Tbuf[--Uart0TNum];//将串口0发送缓存中的一个字节
					break;						//由子串口0发送到下位机
				}
				else goto T_NopInstruction;	//若子串口0没有数据发送则准备发送空指令
			}

			case 1:{					//准备向子串口1发送数据
				UartPointer++;			//下一次发送中断准备向串口2发送数据
				if(Uart1TNum){			//串口1发送缓存区是否有数据需要发送?
					AdrOut0=1;			//有数据需要发送,则选通子串口1的地址
					AdrOut1=0;
					SBUF=Uart1TBuf[--Uart1TNum];//将串口1发送缓存中的一个字节
					break;						//由子串口1发送到下位机
				}
				else goto T_NopInstruction;	//若子串口1没有数据发送则准备发送空指令
			}								//而只能够发送一条空指令用于时序配合

			case 2:{			//准备向子串口2发送数据
				UartPointer++;	//下一次发送中断准备发送空指令
				if(Uart2TNuzm){			//串口2发送缓存区是否有数据需要发送?
					AdrOut0=0;			//有数据需要发送,则选通子串口2的地址
					AdrOut1=1;
					SBUF=Uart2TBuf[--Uart2TNum];//将串口2发送缓存中的一个字节
					break;						//由子串口2发送到下位机
				}
				else goto T_NopInstruction;	//若子串口2没有数据发送则准备发送空指令
			}								//而只能够发送一条空指令用于时序配合

			default:{
				UartPointer=0;			//下一次发送中断准备向串口0发送数据
T_NopInstruction:
				AdrOut0=1;				//选通目串口准备发送空指令或者其他指令
				AdrOut1=1;
				if(bInstructFlag){		//判断是否需要发送其他指令?
					bInstructFlag=0;	//清除指令发送标志
					SBUF=InstructBuf;	//将需要发送的指令发送到串口扩展IC
					break;
				}
				else if(Uart0TNum|Uart1TNum|Uart2TNum){//判断所有子串口的数据是否
					SBUF=0;				//都已经全部发送完毕

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -