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

📄 5_uart_sst.c

📁 C51 用PCA 模拟串口
💻 C
📖 第 1 页 / 共 3 页
字号:
								PCA_TEMP = (CH* 0x100)+CL+TIME_COUNT; // 将PCA计数器的值读到PCA_TEMP
								CCAP4L = PCA_TEMP; // 将更新后的匹配值存到
								CCAP4H = (PCA_TEMP/ 0x100);// 模块1捕捉比较寄存器
								CCAPM4 = TIME_INIT;	//0x48; // 允许模块1软件定时器
								UART4_TX_STATE++; // 更新TX状态变量
								break;
							case 1:
							case 2:
							case 3:
							case 4:
							case 5:
							case 6:
							case 7:
							case 8:
							case 9:
								UART4_TX = (UART4_SBUF & 0x01); // 将UART4_SBUF的LSB输出到UART4_TX引脚
								UART4_SBUF >>= 1; // UART4_SBUF右移一位
								UART4_SBUF |= 0x80; // 将一个'1'移入UART4_SBUF的MSB
								PCA_TEMP = (CCAP4H * 0x100)+CCAP4L+TIME_COUNT;// 将模块1内容读到PCA_TEMP
								CCAP4L = PCA_TEMP; // 用新值恢复CCAP1L
								CCAP4H = (PCA_TEMP / 0x100);// 和CCAP1H
								UART4_TX_STATE++; // 更新TX状态变量
								break;
						case 10:
							UART4_TI = 1; // 表示发送完成
							UART4_TX_STATE = 0; // 复位TX状态
							UART4_RX_STATE = 0; // 复位RX状态变量
							UART4_TX = 1; // UART4_TX应保持高电平
							CCAPM4 = NEG_CAP_INT; // 发送完一个字节,便立即回到接收的状态
							UART4_RX_FLAG = 1;	//发送完一个字节,便立即回到接收的状态
							break;
						}
					}
		}

}


//==================UART1通道的函数======================================
//--------------------------------------------------------------------
// UART1_INIT: UART1初始化子程序
// 初始化UART1
// - 配置PCA: 模块0为负沿捕捉方式模块1为软件定时器方式
// PCA时基= SYSCLK/4禁止PCA中断禁止PCA计数器
// - 清除被挂起的PCA模块0和模块1中断
// - 复位TX和RX状态变量
//
void UART1_INIT(void)
{
 	CMOD   = 0x03 ; 					//CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1  
										//TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
 	CCON= 0X0;
 	CL = 0X0;							//PCA计数器初设为00
 	CH = 0X0;
	//----------UART1通道变量的初始化------------------------------------------
 	CCAPM1 = DISABLE_MODE ;			//禁止PCA0的操作
	CCF1 = 0; // 清除被挂起的PCA模块0和模块1 
	UART1_RI = 0; // 清除接收完成标志
	UART1_TI = 1; // 置发送完成标志,初始认为已经没有数据向外发了,这样有利于发前查询上次发送的标志,节省等待时间
	UART1_TX = 1; // TX线初始化为高电平
	UART1_RX_FLAG = 1;	//初始置UART1置于接收状态,只有发送时才置为发送状态
	UART1_TX_STATE = 0; // UART1 TX状态变量
	UART1_RX_STATE = 0; // UART1 RX状态变量
	UART1_RX_SHIFT=8; 			// UART1 RX移位寄存器

	CR = 1; 							// 启动PCA计数器
 	PPC = 1;							//置PCA中断为最高级
 	IPH |= 0x40;//highest PRI			//置PCA中断为最高级
 	EC = 1;							//PCA中断允许
	EA = 1; // 全局中断允许

}
//--------------------------------------------------------------------
// UART1_ENABLE: UART1接收允许子程序
// 允许UART1
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART1_RX_ENABLE(void)
{
	CCAPM1=NEG_CAP_INT;				//置为下降沿捕捉中断方式
	UART1_RX_FLAG = 1;				//置接收标志

}
//--------------------------------------------------------------------
// UART1_ENABLE: UART1发送允许子程序
// 允许UART1
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART1_SEND_OUT(unsigned char data_send)
{
	while (~UART1_TI);			//上次的数据已经发送完毕
	UART1_TI = 0; 		//如果发送完成,清除发送标志,UART1_TI这个标志在发送完一个字节后会自动置1
	UART1_SBUF =data_send;	//将发送的数据放入UART1发送寄存器中
	CCAPM1=TIME_INIT;				//01001001	//置为软件定时器中断方式
	UART1_RX_FLAG = 0;				//置发送标志
}


//==================UART2通道的函数======================================
//--------------------------------------------------------------------
// UART2_INIT: UART2初始化子程序
// 初始化UART2
// - 配置PCA: 模块0为负沿捕捉方式模块1为软件定时器方式
// PCA时基= SYSCLK/4禁止PCA中断禁止PCA计数器
// - 清除被挂起的PCA模块0和模块1中断
// - 复位TX和RX状态变量
//
void UART2_INIT(void)
{
 	CMOD   = 0x03 ; 					//CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1  
										//TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
 	CCON= 0X0;
 	CL = 0X0;							//PCA计数器初设为00
 	CH = 0X0;
	//----------UART2通道变量的初始化------------------------------------------
 	CCAPM2 = DISABLE_MODE ;			//禁止PCA0的操作
	CCF2 = 0; // 清除被挂起的PCA模块0和模块1 
	UART2_RI = 0; // 清除接收完成标志
	UART2_TI = 1; // 置发送完成标志,初始认为已经没有数据向外发了,这样有利于发前查询上次发送的标志,节省等待时间
	UART2_TX = 1; // TX线初始化为高电平
	UART2_RX_FLAG = 1;	//初始置UART2置于接收状态,只有发送时才置为发送状态
	UART2_TX_STATE = 0; // UART2 TX状态变量
	UART2_RX_STATE = 0; // UART2 RX状态变量
	UART2_RX_SHIFT=8; 			// UART2 RX移位寄存器

	CR = 1; 							// 启动PCA计数器
 	PPC = 1;							//置PCA中断为最高级
 	IPH |= 0x40;//highest PRI			//置PCA中断为最高级
 	EC = 1;							//PCA中断允许
	EA = 1; // 全局中断允许

}
//--------------------------------------------------------------------
// UART2_ENABLE: UART2接收允许子程序
// 允许UART2
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART2_RX_ENABLE(void)
{
	CCAPM2=NEG_CAP_INT;				//置为下降沿捕捉中断方式
	UART2_RX_FLAG = 1;				//置接收标志

}
//--------------------------------------------------------------------
// UART2_ENABLE: UART2发送允许子程序
// 允许UART2
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART2_SEND_OUT(unsigned char data_send)
{
	while (~UART2_TI);			//上次的数据已经发送完毕
	UART2_TI = 0; 		//如果发送完成,清除发送标志,UART2_TI这个标志在发送完一个字节后会自动置1
	UART2_SBUF =data_send;	//将发送的数据放入UART2发送寄存器中
	CCAPM2=TIME_INIT;				//01001001	//置为软件定时器中断方式
	UART2_RX_FLAG = 0;				//置发送标志
}

//==================UART3通道的函数======================================
//--------------------------------------------------------------------
// UART3_INIT: UART3初始化子程序
// 初始化UART3
// - 配置PCA: 模块0为负沿捕捉方式模块1为软件定时器方式
// PCA时基= SYSCLK/4禁止PCA中断禁止PCA计数器
// - 清除被挂起的PCA模块0和模块1中断
// - 复位TX和RX状态变量
//
void UART3_INIT(void)
{
 	CMOD   = 0x03 ; 					//CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1  
										//TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
 	CCON= 0X0;
 	CL = 0X0;							//PCA计数器初设为00
 	CH = 0X0;
	//----------UART3通道变量的初始化------------------------------------------
 	CCAPM3 = DISABLE_MODE ;			//禁止PCA0的操作
	CCF3 = 0; // 清除被挂起的PCA模块0和模块1 
	UART3_RI = 0; // 清除接收完成标志
	UART3_TI = 1; // 置发送完成标志,初始认为已经没有数据向外发了,这样有利于发前查询上次发送的标志,节省等待时间
	UART3_TX = 1; // TX线初始化为高电平
	UART3_RX_FLAG = 1;	//初始置UART3置于接收状态,只有发送时才置为发送状态
	UART3_TX_STATE = 0; // UART3 TX状态变量
	UART3_RX_STATE = 0; // UART3 RX状态变量
	UART3_RX_SHIFT=8; 			// UART3 RX移位寄存器

	CR = 1; 							// 启动PCA计数器
 	PPC = 1;							//置PCA中断为最高级
 	IPH |= 0x40;//highest PRI			//置PCA中断为最高级
 	EC = 1;							//PCA中断允许
	EA = 1; // 全局中断允许

}
//--------------------------------------------------------------------
// UART3_ENABLE: UART3接收允许子程序
// 允许UART3
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART3_RX_ENABLE(void)
{
	CCAPM3=NEG_CAP_INT;				//置为下降沿捕捉中断方式
	UART3_RX_FLAG = 1;				//置接收标志

}
//--------------------------------------------------------------------
// UART3_ENABLE: UART3发送允许子程序
// 允许UART3
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART3_SEND_OUT(unsigned char data_send)
{
	while (~UART3_TI);			//上次的数据已经发送完毕
	UART3_TI = 0; 		//如果发送完成,清除发送标志,UART3_TI这个标志在发送完一个字节后会自动置1
	UART3_SBUF =data_send;	//将发送的数据放入UART3发送寄存器中
	CCAPM3=TIME_INIT;				//01001001	//置为软件定时器中断方式
	UART3_RX_FLAG = 0;				//置发送标志
}


//==================UART4通道的函数======================================
//--------------------------------------------------------------------
// UART4_INIT: UART4初始化子程序
// 初始化UART4
// - 配置PCA: 模块0为负沿捕捉方式模块1为软件定时器方式
// PCA时基= SYSCLK/4禁止PCA中断禁止PCA计数器
// - 清除被挂起的PCA模块0和模块1中断
// - 复位TX和RX状态变量
//
void UART4_INIT(void)
{
 	CMOD   = 0x03 ; 					//CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1  
										//TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
 	CCON= 0X0;
 	CL = 0X0;							//PCA计数器初设为00
 	CH = 0X0;
	//----------UART4通道变量的初始化------------------------------------------
 	CCAPM4 = DISABLE_MODE ;			//禁止PCA0的操作
	CCF4 = 0; // 清除被挂起的PCA模块0和模块1 
	UART4_RI = 0; // 清除接收完成标志
	UART4_TI = 1; // 置发送完成标志,初始认为已经没有数据向外发了,这样有利于发前查询上次发送的标志,节省等待时间
	UART4_TX = 1; // TX线初始化为高电平
	UART4_RX_FLAG = 1;	//初始置UART4置于接收状态,只有发送时才置为发送状态
	UART4_TX_STATE = 0; // UART4 TX状态变量
	UART4_RX_STATE = 0; // UART4 RX状态变量
	UART4_RX_SHIFT=8; 			// UART4 RX移位寄存器

	CR = 1; 							// 启动PCA计数器
 	PPC = 1;							//置PCA中断为最高级
 	IPH |= 0x40;//highest PRI			//置PCA中断为最高级
 	EC = 1;							//PCA中断允许
	EA = 1; // 全局中断允许

}
//--------------------------------------------------------------------
// UART4_ENABLE: UART4接收允许子程序
// 允许UART4
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART4_RX_ENABLE(void)
{
	CCAPM4=NEG_CAP_INT;				//置为下降沿捕捉中断方式
	UART4_RX_FLAG = 1;				//置接收标志

}
//--------------------------------------------------------------------
// UART4_ENABLE: UART4发送允许子程序
// 允许UART4
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART4_SEND_OUT(unsigned char data_send)
{
	while (~UART4_TI);			//上次的数据已经发送完毕
	UART4_TI = 0; 		//如果发送完成,清除发送标志,UART4_TI这个标志在发送完一个字节后会自动置1
	UART4_SBUF =data_send;	//将发送的数据放入UART4发送寄存器中
	CCAPM4=TIME_INIT;				//01001001	//置为软件定时器中断方式
	UART4_RX_FLAG = 0;				//置发送标志
}


// 文件结束

	















⌨️ 快捷键说明

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