#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]);
}