?? 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 + -