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

📄 main.c

📁 用SST89系列单片机实现6个UART串口的源程序
💻 C
字号:
//===========================SST MCU扩展的5个UART使用说明==============================
//	本例程是使用SST MCU(SST89E/V52RD,54RD,58RD,516RD)的特殊硬件功能做的,新增加2个扩展UART的功能.
//  扩展UART的特点:采用全双工方式,即:收发不用分时;采用半双工方式,可扩展5个新的UART
//  
//  1.发送和接收均采用中断方式,不占用标准8052的资源(定时器,硬件中断,RAM),
//    占用的资源均是SST MCU的特殊资源,因此这个例子只适合SST的单片机,不能用于其它非SST的MCU
//	2.发送采用UART4_SEND_OUT(data)函数,直接取要发送的数据即可.
//	3.接收采用中断方式接收,接收的数据放在自己定义的变量"UART4_SBUF"单元内.
//	4.使用本例程请参考MAIN.C函数.//
//		4.0	 加入本文件进行一些函数的声明和设置参数(晶振频率,通讯的波特率,缓冲区的大小,UART的I/O口定义)
//		4.2  对扩展UART进行初始化和打开:
//					UART4_INIT(); // 初始化UART4
//					UART4_RX_ENABLE(); // 允许UART4接收
//		4.3  接收首先查询UART通道的数据接收到标志--UART4_RI,若为1,说明已接收到数据,则从UART4_SBUF单元取出数据即可
//			  if (UART4_RI)				//已经接收到数据,将接收到的数据存入UART4_BUF的内存中
//					{	UART4_RI = 0;   // 清除接收标志,UART4_RI这个标志在接收到一个字节后会自动置1
//						UART4_BUF[] = UART4_SBUF; // 取出接收到的数据,送到缓冲区内
//					}
//	5. 本示例可用串口调试串口进行测试,上电开始即会发送--"12"2个字符到PC,
//		然后从PC端发送一串数据到UART,应在马上可收到返回的数据,从而验证了UART的收发结果.
//		然后再换成其余4个UART的I/O,应都能正常工作.
//  6.  在11.0592M晶振,双倍速模式下,波特率为9600,在单倍速模式下,波特率为4800,
//		对应的波特率和晶振的关系,在单倍速模式下:
//      4800--11.0592Mhz;     9600--18.432Mhz;    19200--40MHZ  
//===============================================================================================
//			香港弘微科技有限公司(SPAC)
//			技术支持:田伯运  0755-26010579    andy.tian@spacltd.com.cn
//===============================================================================================  


#include <stdio.h>
#include <5_UART_SST.h>			//包含5个UART程序所用到的定义和函数
//--------------------------------------------------------------------
// 主程序
//--------------------------------------------------------------------
// - 初始化并允许UART0
// - 调用测试程序
//



void MAIN (void)
{
	unsigned int count_time=0;
	unsigned char UART0_receive_counter,UART1_receive_counter,UART2_receive_counter;
	unsigned char UART3_receive_counter,UART4_receive_counter;	//5个UART通道的数据接收个数变量
	char k, m; // 测试下标
	char xdata UART0_BUF[80]; // UART0 测试接收缓冲区
	char xdata UART1_BUF[80]; // UART1 测试接收缓冲区
	char xdata UART2_BUF[80]; // UART2 测试接收缓冲区
	char xdata UART3_BUF[80]; // UART3 测试接收缓冲区
	char xdata UART4_BUF[80]; // UART4 测试接收缓冲区

		TIME_COUNT=SYSCLK/BAUD_RATE/4;   //计算对应一个位时间的PCA计数值,(PCA 配置为对SYSCLK/4计数)

		//-------UART0通道的调用-------------------
		UART0_INIT(); // 初始化UART0
		UART0_RX_ENABLE(); // 允许UART0接收
		//======test1:上电主动发送"123"3个字符=====
		UART0_SEND_OUT(0x31);
		UART0_SEND_OUT(0x32);
		UART0_SEND_OUT(0x33);

		//-------UART0通道的调用-------------------
		UART1_INIT(); // 初始化UART1
		UART1_RX_ENABLE(); // 允许UART1接收
		//======test1:上电主动发送"123"3个字符=====
		UART1_SEND_OUT(0x31);
		UART1_SEND_OUT(0x32);

		//-------UART2通道的调用-------------------
		UART2_INIT(); // 初始化UART2
		UART2_RX_ENABLE(); // 允许UART2接收
		//======test1:上电主动发送"123"3个字符=====
		UART2_SEND_OUT(0x31);
		UART2_SEND_OUT(0x32);

		//-------UART3通道的调用-------------------
		UART3_INIT(); // 初始化UART3
		UART3_RX_ENABLE(); // 允许UART3接收
		//======test1:上电主动发送"123"3个字符=====
		UART3_SEND_OUT(0x31);
		UART3_SEND_OUT(0x32);

		//-------UART4通道的调用-------------------
		UART4_INIT(); // 初始化UART4
		UART4_RX_ENABLE(); // 允许UART4接收
		//======test1:上电主动发送"123"3个字符=====
		UART4_SEND_OUT(0x31);
		UART4_SEND_OUT(0x32);

		//======test2:接收数据,并发送"接收到的数据+10H"到对方=====
	 while(0)	
	 	{
			while(UART0_RI)				//已经接收到UART0通道的数据,将"接收到的数据加10H后"重新发送出去
					{
						UART0_RI = 0; 	// 清除接收标志,UART0_RI这个标志在接收到一个字节后会自动置1
						UART0_SEND_OUT(UART0_SBUF+0x10);
						}
			while(UART1_RI)				//已经接收到UART1通道的数据,将"接收到的数据加10H后"重新发送出去
					{
						UART1_RI = 0; 	// 清除接收标志,UART1_RI这个标志在接收到一个字节后会自动置1
						UART1_SEND_OUT(UART1_SBUF+0x10);
						}
			while(UART2_RI)				//已经接收到UART2通道的数据,将"接收到的数据加10H后"重新发送出去
					{
						UART2_RI = 0; 	// 清除接收标志,UART2_RI这个标志在接收到一个字节后会自动置1
						UART2_SEND_OUT(UART2_SBUF+0x10);
						}
			while(UART3_RI)				//已经接收到UART3通道的数据,将"接收到的数据加10H后"重新发送出去
					{
						UART3_RI = 0; 	// 清除接收标志,UART3_RI这个标志在接收到一个字节后会自动置1
						UART3_SEND_OUT(UART3_SBUF+0x10);
						}
			while(UART4_RI)				//已经接收到UART4通道的数据,将"接收到的数据加10H后"重新发送出去
					{
						UART4_RI = 0; 	// 清除接收标志,UART4_RI这个标志在接收到一个字节后会自动置1
						UART4_SEND_OUT(UART4_SBUF+0x10);
						}

					
		}

		//=========test3:接收数据,并发送"接收到的数据"到对方====================
	k=m=0; // 清0测试计数器变量
	while(1)
	{
		if (count_time>0x0200)								//连续250次都没有接收到数据,便要发送数据
			{										//接收等待的次数超过250次,便认为没有数据发来,便进行向外发送数据
				//---------UART0通道发送接收到的数据--------------------
				for(m=0;m<UART0_receive_counter;m++)
					{
						UART0_SEND_OUT(UART0_BUF[m]); 	//开始转换为发送的状态
					}
				UART0_receive_counter=0x00;				//UART0的接收个数清零

				//---------UART1通道发送接收到的数据--------------------
				for(m=0;m<UART1_receive_counter;m++)
					{
						UART1_SEND_OUT(UART1_BUF[m]); 	//开始转换为发送的状态
					}
				UART1_receive_counter=0x00;				//UART1的接收个数清零

				//---------UART2通道发送接收到的数据--------------------
				for(m=0;m<UART2_receive_counter;m++)
					{
						UART2_SEND_OUT(UART2_BUF[m]); 	//开始转换为发送的状态
					}
				UART2_receive_counter=0x00;				//UART2的接收个数清零

				//---------UART3通道发送接收到的数据--------------------
				for(m=0;m<UART3_receive_counter;m++)
					{
						UART3_SEND_OUT(UART3_BUF[m]); 	//开始转换为发送的状态
					}
				UART3_receive_counter=0x00;				//UART3的接收个数清零
				//---------UART4通道发送接收到的数据--------------------
				for(m=0;m<UART4_receive_counter;m++)
					{
						UART4_SEND_OUT(UART4_BUF[m]); 	//开始转换为发送的状态
					}
				UART4_receive_counter=0x00;				//UART4的接收个数清零
				//=======================================
				count_time=0;			
			}

		//=====================UART0通道将接收到的数据存储到UART0的缓冲区内===========
    	else if (UART0_RI)							//已经接收到数据,将接收到的数据存入UART0_BUF的内存中
			{
				UART0_RI = 0; 					// 清除接收标志,UART0_RI这个标志在接收到一个字节后会自动置1
				UART0_BUF[UART0_receive_counter++] = UART0_SBUF; // 读接收缓冲器
				count_time = 0;				//接收到一个数据,便清等待的次数
			}
		//=====================UART1通道将接收到的数据存储到UART1的缓冲区内===========
    	else if (UART1_RI)							//已经接收到数据,将接收到的数据存入UART1_BUF的内存中
			{
				UART1_RI = 0; 					// 清除接收标志,UART1_RI这个标志在接收到一个字节后会自动置1
				UART1_BUF[UART1_receive_counter++] = UART1_SBUF; // 读接收缓冲器
				count_time = 0;				//接收到一个数据,便清等待的次数
			}

		//=====================UART2通道将接收到的数据存储到UART2的缓冲区内===========
    	else if (UART2_RI)							//已经接收到数据,将接收到的数据存入UART2_BUF的内存中
			{
				UART2_RI = 0; 					// 清除接收标志,UART2_RI这个标志在接收到一个字节后会自动置1
				UART2_BUF[UART2_receive_counter++] = UART2_SBUF; // 读接收缓冲器
				count_time = 0;				//接收到一个数据,便清等待的次数
			}
		//=====================UART3通道将接收到的数据存储到UART3的缓冲区内===========
    	else if (UART3_RI)							//已经接收到数据,将接收到的数据存入UART3_BUF的内存中
			{
				UART3_RI = 0; 					// 清除接收标志,UART3_RI这个标志在接收到一个字节后会自动置1
				UART3_BUF[UART3_receive_counter++] = UART3_SBUF; // 读接收缓冲器
				count_time = 0;				//接收到一个数据,便清等待的次数
			}

		//=====================UART4通道将接收到的数据存储到UART4的缓冲区内===========
    	else if (UART4_RI)							//已经接收到数据,将接收到的数据存入UART4_BUF的内存中
			{
				UART4_RI = 0; 					// 清除接收标志,UART4_RI这个标志在接收到一个字节后会自动置1
				UART4_BUF[UART4_receive_counter++] = UART4_SBUF; // 读接收缓冲器
				count_time = 0;				//接收到一个数据,便清等待的次数
			}
	 	count_time++;						//没有接收到数据,等待的次数加一		
	}

	
}

⌨️ 快捷键说明

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