51单片机 串行口驱动

来源:互联网 发布:jquery 数据列表插件 编辑:程序博客网 时间:2024/04/28 23:13
#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 和 方式3const 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指示是否已占用了串口和定时器1static char busy_serial = _FALSE_TRAVELER_ ; //==================================================================//函数名:  serialStartup()//功能:    初始化串口//输入参数:无//返回值:  无//其他: 同时占用定时器1//==================================================================void serialStartup(){busy_serial = 1;TMOD &= 0x0f;//清空对定时器1的设置TMOD |= 0x20;//定时器1方式2 作波特率发生器TCON &= 0x3f;//关定时器1SCON  = 0x70;//设置串口 方式1 8位异步收发 允许接收数据 需要接收有效的停止位}//==================================================================//函数名:  serialClose()//功能:    关闭串口//输入参数:无//返回值:  无//其他: 同时关闭定时器1//==================================================================void serialClose(){TMOD &= 0x0f;//清空对定时器1的设置TR1   = 0;//关定时器1busy_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 ;returnserialWriteString((unsigned char *)&str[pos]);}



 

原创粉丝点击