51单片机 串行口驱动

#include <REGX52.H>

//===================================================================
//文件名:serial_traveler.h 
//  51单片机 串行口数据传输接口说明:
//	串行收发数据需要占用定时器1 和串行口 TXD、RXD
//	接口中定义了忙标志 busy_serial 1表示接口被此接口占用,0表示未被此接口占用
//	此接口中 串口工作方式1、8位异步收发、允许接收数据、需要接收有效的停止位
//	如需其它工作方式,请自行修改
//	挂起串口时,释放定时器 和 串口,串口失去时钟源,任何读 或 写串口的操作都会失败
//	如有指教,请联系我:759981398@qq.com 
//==================================================================

#ifndef _SERIAL_TRAVELER_H_
#define _SERIAL_TRAVELER_H_
#define _TRUE_TRAVELER_ 1
#define _FALSE_TRAVELER_ 0

//==================================================================
//函数名:  serialStartup()
//功能:    初始化串口
//输入参数:无
//返回值:  无
//其他: 	同时占用定时器1
//==================================================================
void serialStartup();

//==================================================================
//函数名:  serialClose()
//功能:    关闭串口
//输入参数:无
//返回值:  无
//其他: 	同时关闭定时器1
//==================================================================
void serialClose();

//==================================================================
//函数名:  serialSelectBode
//功能:    设定串口波特率
//输入参数:波特率值/100
//返回值:  操作成功返回 _TRUE_TRAVELER_ ;操作失败返回 _FALSE_TRAVELER_
//其他: 	无
//==================================================================
char serialSelectBode(unsigned char bodeValue);

//==================================================================
//函数名:  serialRun()
//功能:    串口开始工作
//输入参数:无
//返回值:  无
//其他: 	占用定时器T1
//==================================================================
#ifndef serialRun
#define serialRun() TR1 = 1 
#endif

//==================================================================
//函数名:  serialClear()
//功能:   清除溢出标志位,为下一次传输做准备
//输入参数:无
//返回值:  无
//其他: 	无
//==================================================================
#ifndef serialClear
#define serialClear() TI = 0; RI = 0
#endif

//==================================================================
//函数名:  serialPauseResume
//功能:    挂起/恢复 串口
//输入参数:操作码 _TRUE_TRAVELER_~挂起串口;_FALSE_TRAVELER_~恢复串口
//返回值:  无
//其他: 	挂起后 可以解除定时器绑定 串口的sfr也可以修改作其他用处
//			恢复后串口可像挂起前一样正常工作
//==================================================================
void serialPauseResume(char opcode);

//==================================================================
//函数名:  serialWriteChar
//功能:    写字符到串口
//输入参数:待发送的字符
//返回值:  _FALSE_TRAVELER_~发送失败  /// _TRUE_TRAVELER_ ~ 发送成功
//其他: 	无
//==================================================================
char serialWriteChar(unsigned char chr);

//==================================================================
//函数名:  serialReadChar
//功能:    从串口读取1个字符
//输入参数:接收字符的单元地址
//返回值:  _FALSE_TRAVELER_~接收失败  /// _TRUE_TRAVELER_ ~ 接收成功
//其他: 	无
//==================================================================
char serialReadChar(unsigned char *chr);

//==================================================================
//函数名:  serialWriteString
//功能:    写字符串到串口
//输入参数:str 字符串首地址,应注意使字符串结束的字节为'\0'
//返回值:  返回发送成功的字符数
//其他: 	无
//==================================================================
char serialWriteString(const unsigned char *str);

//==================================================================
//函数名:  serialReadString
//功能:    从串口读取字符串
//输入参数:str 字符串首地址 ,len 允许接收的最大字节数
//返回值:  返回接收到的字符数
//其他: 	无
//==================================================================
char serialReadString(unsigned char *str,unsigned char len);

//==================================================================
//函数名:  serialWriteInt
//功能:    以字符串格式向uart发送一个整数
//输入参数:int dat 待发送的整数值
//返回值:  int 成功发送的字符个数
//其他: 	返回值若为-1 表示数据处理阶段发生错误、未发送
//==================================================================
char serialWriteInt(int dat);

#endif

 

/*
文件名:serial_traveler.c 
*/
#include <REGX52.H>
#include "serial_traveler.h"

//下表为11.0592MHz 晶振下 部分波特率对应定时器1自动重载计数初值、smod位设置 适用于串行口的方式1 和 方式3
const unsigned char bode_serial[][3]= 
{
	{192,0xfd,1},// 19.2 kb/s - 初值 0xfd  - SMOD = 1
	{96 ,0xfd,0},// 9.6  kb/s - 初值 0xfd  - SMOD = 0
	{48 ,0xfa,0},// 4.8  kb/s - 初值 0xfa  - SMOD = 0
	{24 ,0xf4,0},// 2.4  kb/s - 初值 0xf4  - SMOD = 0
	{12 ,0xe8,0} // 1.2  kb/s - 初值 0xe8  - SMOD = 0
};

//busy_serial指示是否已占用了串口和定时器1
static char busy_serial = _FALSE_TRAVELER_ ; 

//==================================================================
//函数名:  serialStartup()
//功能:    初始化串口
//输入参数:无
//返回值:  无
//其他: 	同时占用定时器1
//==================================================================
void serialStartup()
{
	busy_serial = 1;
	TMOD &= 0x0f;//清空对定时器1的设置
	TMOD |= 0x20;//定时器1方式2 作波特率发生器
	TCON &= 0x3f;//关定时器1
	SCON  = 0x70;//设置串口 方式1 8位异步收发 允许接收数据 需要接收有效的停止位
}

//==================================================================
//函数名:  serialClose()
//功能:    关闭串口
//输入参数:无
//返回值:  无
//其他: 	同时关闭定时器1
//==================================================================
void serialClose()
{
	TMOD &= 0x0f;//清空对定时器1的设置
	TR1   = 0;//关定时器1
	busy_serial  = 0;
}

//==================================================================
//函数名:  serialSelectBode
//功能:    设定串口波特率
//输入参数:波特率值/100
//返回值:  操作成功返回 _TRUE_TRAVELER_ ;操作失败返回 _FALSE_TRAVELER_
//其他: 	无
//==================================================================
char serialSelectBode(unsigned char bodeValue)
{
	char c;
	for(c = 0;c!=5;++c)
	{
		if(bode_serial[c][0] == bodeValue)
		{
			TH1 = bode_serial[c][1];
			TL1 = bode_serial[c][1];
			PCON &= 0x7f;//SMOD位清零
			PCON |= (bode_serial[c][2]<<7);//设置SMOD位
			return _TRUE_TRAVELER_;
		}
	}
	return _FALSE_TRAVELER_;
}


//==================================================================
//函数名:  serialRun()
//功能:    串口开始工作
//输入参数:无
//返回值:  无
//其他: 	占用定时器T1
//==================================================================
#ifndef serialRun
#define serialRun() TR1 = 1 
#endif

//==================================================================
//函数名:  serialClear()
//功能:   清除溢出标志位,为下一次传输做准备
//输入参数:无
//返回值:  无
//其他: 	无
//==================================================================
#ifndef serialClear
#define serialClear() TI = 0; RI = 0
#endif

//==================================================================
//函数名:  serialPauseResume
//功能:    挂起/恢复 串口
//输入参数:操作码 _TRUE_TRAVELER_~挂起串口;_FALSE_TRAVELER_~恢复串口
//返回值:  无
//其他: 	挂起后 可以解除定时器绑定 串口的sfr也可以修改作其他用处
//			恢复后串口可像挂起前一样正常工作
//==================================================================
void serialPauseResume(char opcode)
{	
	static char th1,tl1,tmod_4567,scon,pcon_7,tcon_67;
	if(opcode == _TRUE_TRAVELER_ )//挂起操作 保护现场
	{
		th1 = TH1;
		tl1 = TL1;
		tmod_4567 = TMOD & 0XF0;
		scon = SCON;
		pcon_7 = PCON & 0X80;
		tcon_67 = TCON & 0XC0;
		TR1 = 0;
		busy_serial = 0 ;
	}
	else//恢复 恢复现场
	{
		TH1 = th1;
		TL1 = tl1;
		TMOD &= 0X0F;
		TMOD |= tmod_4567;
		SCON = scon;
		PCON &= 0X7F;
		PCON |= pcon_7;
		TCON &= 0X3F;
		TCON |= tcon_67;
		busy_serial = 1;
	}
}

//==================================================================
//函数名:  serialWriteChar
//功能:    写字符到串口
//输入参数:待发送的字符
//返回值:  _FALSE_TRAVELER_~发送失败  /// _TRUE_TRAVELER_ ~ 发送成功
//其他: 	无
//==================================================================
char serialWriteChar(unsigned char chr)
{	
	if(_FALSE_TRAVELER_ == busy_serial)//串口未启用 退出
		return _FALSE_TRAVELER_;
	if(RI)//正在接收数据 退出
		return _FALSE_TRAVELER_;
		
	SBUF = chr;
	while(!TI);
	TI = 0;
	return _TRUE_TRAVELER_;
}

//==================================================================
//函数名:  serialReadChar
//功能:    从串口读取1个字符
//输入参数:接收字符的单元地址
//返回值:  _FALSE_TRAVELER_~接收失败  /// _TRUE_TRAVELER_ ~ 接收成功
//其他: 	无
//==================================================================
char serialReadChar(unsigned char *chr)
{
	if(_FALSE_TRAVELER_ == busy_serial)//串口未启用 退出
		return _FALSE_TRAVELER_;
	if(TI) //正在发送数据 退出
		return _FALSE_TRAVELER_;
	while(!RI);
	RI = 0;
	*chr = SBUF;
	return _TRUE_TRAVELER_;
}

//==================================================================
//函数名:  serialWriteString
//功能:    写字符串到串口
//输入参数:str 字符串首地址,应注意使字符串结束的字节为'\0'
//返回值:  返回发送成功的字符数
//其他: 	无
//==================================================================
char serialWriteString(const unsigned char *str)
{
	char c = 0;
	for(c = 0;str[c]!=0;c++)
	{//不到字符尾则继续发送
		if(_FALSE_TRAVELER_ == serialWriteChar(str[c]))	
			break; //发送失败则终止发送
	}
	return c;
}

//==================================================================
//函数名:  serialReadString
//功能:    从串口读取字符串
//输入参数:str 字符串首地址 ,len 允许接收的最大字节数
//返回值:  返回接收到的字符数
//其他: 	注意您的字符数组应预留'\0'字符的位置 即至少数组应含有len+1个元素
//==================================================================
char serialReadString(unsigned char *str,unsigned char len)
{ 
	unsigned char c = 0;
	while(c<len)
	{
		if((_FALSE_TRAVELER_ == serialReadChar(&str[c]))||str[c] =='\r' || str[c] == '\n')
		{ //如果接收字符失败或接收到的字符是回车键则终止接收字符	
			
			str[c] = 0;
			c++;
			break;
		}
		c++; //接收下一个字符
	}
	return c;
}

//==================================================================
//函数名:  serialWriteInt
//功能:    以字符串格式向uart发送一个整数
//输入参数:int dat 待发送的整数值
//返回值:  int 成功发送的字符个数
//其他: 	返回值若为-1 表示数据处理阶段发生错误、未发送
//==================================================================
char serialWriteInt(int dat)
{
	//从int型到字符数组之间的转换
	unsigned char str[11]= {0,0,0,0,0,0,0,0,0,0,0};
	char dat_tmp;
	char pos ;
	char neg = 0;
	str[10] = 0;
	pos = 10 ;
	
	if(dat<0)//处理负数 上
	{
		dat = - dat;
		neg = 1;
	}
	
	do//循环 转换数据格式
	{
		dat_tmp = dat % 10 ;
		str[--pos] = '0' + dat_tmp ;
		dat /= 10 ;
	}
	while(dat != 0) ;
	
	if(neg)//处理负数 下
	{
		str[--pos] = '-';
	}
	
	if(pos <0)//出错处理
		return -1 ;
		
	return	serialWriteString((unsigned char *)&str[pos]);
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanzhong104204

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值