📄 serial.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 + -