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

📄 uart.txt

📁 电能表源码
💻 TXT
字号:
/*
	函数功能:串口配置
	入口:	val_numb---串口号-----------2/3/4/5
				val_bps----串口波特率-------1200bps/2400bps/4800bps/9600bps
				val_bit----串口方式---------10(bit)/11(bit)
				val_parity-奇偶校验位设定---0(even)/非0(odd)
	出口:	1----设置成功
				0----串口号出错
				-1---串口方式出错
				-2---波特率出错			
	注:目前支持串口方式为10位/11位;波特率支持1200bps,2400bps,4800bps,9600bps		
*/
char CfgEU(unsigned char val_numb,unsigned int val_bps,unsigned char val_bit,unsigned char val_parity)
{
	unsigned char temp1,temp2;
	unsigned char xdata *point;//
	temp2 = 0;
//==================串口号定位================================	
	if(val_numb > 5 || val_numb <2)
	{
		return 0;													// 串口号找不到
	}
	point = 0x2820 + (8*(val_numb-2));	// TCONx
//==================波特率发生器模式设定======================	
	point++;							// TMODx
	*point |= 0x20;				// 8-bit counter with auto-reload
//==================串口波特率设定============================	
	switch(val_bps)
	{
//		case 300:	
//		case 600:
		case 1200:	temp1 = 0xab;break;
		case 2400:	temp1 = 0xab;temp2 = 1;break;
		case 4800:	temp1 = 0xeb;break;
		case 9600:	temp1 = 0xeb;temp2 = 1;break;
//		case 11520:
		default:	return -2;break;				// 波特率不支持
	}		
	point += 2;							// TH1
	*point = temp1;
	point += 2;							// TL1
	*point = temp1;
//==================串口方式设定==============================	
	point++;							// SCONx
	if(val_bit == 11)
	{						
		*point = 0xd0;						// 
		InstPara |= bUrMo;				// 串口模式有校验位
	}
	else if(val_bit == 10)
	{
		*point = 0x50;						//
		InstPara &= ~bUrMo; 				// 串口模式无校验位
	}
	else
	{
		return -1;								// 串口方式不支持
	}
//===================奇偶校验位设定============================	
	if(val_parity)
	{
		InstPara |= bPari;
	}
	else
	{
		InstPara &= ~bPari;
	}
//===================波特率加倍设定============================	
	point -= 6;							// TCONx
	if(temp2)
	{
		*point |= 0x80;					// SET SMOD,波特率加倍
	}
//===================开启波特率发生器==========================		
	*point |= 0x22;						// TR1 = 1 && T1M = 1;
	return 1;
}
/*
	函数功能:向对应串口发送一个字节数据
	入口:val_data:希望发送的数据
				val_numb:希望发送的串口号
	出口:1----发送成功
				0----串口号出错			
*/
char SendUData(unsigned char val_data,unsigned char val_numb)
{
	unsigned char xdata *point;
	unsigned char temp;
	if(val_numb > 5 || val_numb <2)
	{
		return 0;							// 串口号找不到
	}
	temp = 8*(val_numb-2);
	point = 0x2826 + temp;	// SCONx
	if(InstPara & bUrMo)
	{
		temp = InstPara & bPari;
		temp >>= 3;						// InstPara.bit3
		ACC = val_data;
		if(temp == P)
		{
			*point &= ~bPari;		// SCONx.bit3
		}
		else
		{
			*point |= bPari;
		}
	}
	point++;
	*point = val_data;
	return 1;
}
/*
	函数功能:从串口接受一个字节数据
	入口:串口号
	出口:低8位为受到数据
				高8位中0x01表示校验错误,0x02表示串口号出错
*/
int RecvUData(unsigned char val_numb)
{
	unsigned char xdata *point;
	unsigned char temp,temp_data;
	if(val_numb > 5 || val_numb <2)
	{
		return 0x0200;				// 串口号找不到
	}
	temp = 8*(val_numb-2);
	point = 0x2827 + temp;	// SBUFx
	temp_data = *point;
	if(InstPara & bUrMo)
	{
		point--;								// SCONx
		ACC = *point;
		if(P)
		{
			if((*point & 0x08) != (InstPara & bPari))
			{
				return temp_data;
			}
			else
			{
				return (int)temp_data + 0x0100;
			}
		}
		else
		{
			if((*point & 0x08) == (InstPara & bPari))
			{
				return temp_data;
			}
			else
			{
				return (int)temp_data + 0x0100;
			}
		}		
	}
	return temp_data;
}

⌨️ 快捷键说明

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