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

📄 serial.c

📁 是KC51下的已经测试通过的X5045的c程序!
💻 C
字号:
//==============================================================================
//2005-03-28...2005-03-31
//串口模块的C51程序头文件
//File Name=serial.c
//==============================================================================

#include "public.h"
#include "serial.h"
#include <Intrins.h>
#include "W78E52.h"
#include "delay_s.h"

/********************************************************/
//序号:
//		HD_SERIAL_S00
//功能:	
//		串口初始化,查询模式,使用Timer2,使用11位数据字节格式
//输入:	
//		bt	=56600, 38400, 28800, 19200, 14400, 9600, 4800, 2400, 1200 (bps)
//输出:	
//		无
//参数出错时,缺省的波特率是9600bps
/********************************************************/
void serial_init_set_with_11bit(uint bt)
{
uint data timer2;
	TR2 =0;
	ET2 =0;
	switch(bt)
	{	//TIMER2作为波特率发生器的值,F=11M0592,Baut=9600,T=12osc,=65536-f/(32*Baut)
		case 56600:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/55600);
			break;
			
		case 38400:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/38400);
			break;
					
		case 28800:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/28800);
			break;
			
		case 19200:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/19200);
			break;
			
		case 14400:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/14400);
			break;
			
		case 9600:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/9600);
			break;
			
		case 4800:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/4800);
			break;
			
		case 2400:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/2400);
			break;
			
		case 1200:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/1200);
			break;
			
		default:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/CONST_BAUT_RATE);
			break;
	}

	TH2 =RCAP2H =timer2 >>8;
	TL2 =RCAP2L =timer2 &0xff;
	
	PCON &=CONST_SERIAL_PCON_MASK;
	T2CON =CONST_SERIAL_T2CON_SETS;
	SCON =CONST_SERIAL_SCON_SETS_B11;		
}


/********************************************************/
//序号:
//		HD_SERIAL_S01
//功能:	
//		串口初始化,查询模式,使用Timer2
//输入:	
//		bt	=56600, 38400, 28800, 19200, 14400, 9600, 4800, 2400, 1200 (bps)
//输出:	
//		无
//参数出错时,缺省的波特率是9600bps
/********************************************************/
void serial_init_set(uint bt)
{
uint data timer2;
	TR2 =0;
	ET2 =0;
	switch(bt)
	{	//TIMER2作为波特率发生器的值,F=11M0592,Baut=9600,T=12osc,=65536-f/(32*Baut)
		case 56600:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/55600);
			break;
			
		case 38400:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/38400);
			break;
					
		case 28800:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/28800);
			break;
			
		case 19200:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/19200);
			break;
			
		case 14400:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/14400);
			break;
			
		case 9600:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/9600);
			break;
			
		case 4800:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/4800);
			break;
			
		case 2400:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/2400);
			break;
			
		case 1200:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/1200);
			break;
			
		default:
			timer2 =(uint)(65536-(SYS_FREQ_MHZ*31250)/CONST_BAUT_RATE);
			break;
	}

	TH2 =RCAP2H =timer2 >>8;
	TL2 =RCAP2L =timer2 &0xff;
	
	PCON &=CONST_SERIAL_PCON_MASK;
	T2CON =CONST_SERIAL_T2CON_SETS;
	SCON =CONST_SERIAL_SCON_SETS;		
}

/********************************************************/
//序号:
//		HD_SERIAL_S02
//功能:	
//		接收一个字节
//输入:	
//		recv	存放接收字节的指针
//输出:	
//		TRUE/FALSE 是/否收到一个字节
/********************************************************/
bit serial_recv_byte(uchar *rb)
{
	uchar data count =CONST_SERIAL_RECV_BYTE_DEALY_MAX;
	uchar data tmp;
	do{
		for(tmp =154; tmp >0; tmp --)
		{
			if( _testbit_(RI) ) {
				*rb =SBUF;
				return true;
			}
		}
	}while(	--count >0 ); 
	tmp =SBUF;
	return false;
}

/********************************************************/
//序号:
//		HD_SERIAL_S03
//功能:	
//		发送一个字节
//输入:	
//		sb		要发送的字节
//输出:	
//		无
/********************************************************/
void serial_send_byte(uchar sb)
{
	uchar data count =CONST_SERIAL_SEND_BYTE_DEALY_MAX;
	uchar data tmp;
	SBUF =sb;
	do{
		for(tmp =228; tmp>0; tmp--)
		{
			if(_testbit_(TI))
				return;
		}
	}while( --count>0);
}

/********************************************************/
//序号:
//      HD_SERIAL_S04
//功能: 
//      限时接收一个定长的数据串;
//输入: 
//      str     存放接收的数据串指针;
//      rlen    接收长度1...CONST_SERIAL_RECV_STR_LEN_MAX, =0 不接收;
//	first_delay 接收首个字符的最大延时时间数,单位是接收一个字节的延时时间!
//输出: 
//      实际接收的字节数
/********************************************************/
uchar serial_recv_str(uchar *str, uchar rlen, uchar first_delay)
{
	uchar data i;
	if(rlen ==0) return false;
	if(rlen >CONST_SERIAL_RECV_STR_LEN_MAX)
	{
		rlen =CONST_SERIAL_RECV_STR_LEN_MAX;
	}
	
	do{
		if(serial_recv_byte(str))
		{
			for(i=1; i<rlen; i++)
			{
				if(!serial_recv_byte(str+i))
				{
					return i;
				}
			}
			return(i);
		}
	}while(--first_delay !=0);
	return(0);
}

/********************************************************/
//序号:
//		HD_SERIAL_S05
//功能:	
//		发送一个定长数据串
//输入:	
//		str	要发送的数据串指针;
//		slen	发送长度1...CONST_SERIAL_RECV_STR_LEN_MAX, =0 不发送;
//		遵从设置接收/发送字节间的最大延时时间-1
//输出:	
//		无
/********************************************************/
void serial_send_str(uchar *str, uchar slen)
{
	uchar data count;	
	if(slen ==0) return ;
	if(slen >CONST_SERIAL_RECV_STR_LEN_MAX)
	{
		slen =CONST_SERIAL_RECV_STR_LEN_MAX;
	}
	for(count=0; count<slen; count++) {
		serial_send_byte(str[count]);
	}
}

/*
//********************************************************
//序号:
//		HD_SERIAL_S06
//功能:	
//		得到指定长度串的LRC字节
//输入:	
//		str	要计算的数据串指针;
//		slen	数据串字节数
//输出:	
//		lrc字节
//********************************************************
uchar serial_get_lrc(uchar *str, uchar slen)
{
uchar i, lrc;
	for(i=0, lrc =0; i<slen; i++)
	{
		lrc ^=str[i];
	}
	return(lrc);
}
*/

//==============================================================================
//End Of File

⌨️ 快捷键说明

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