51串口通信
//网上看了下资料,借鉴了别人的一些好的东西,同时自己封装了下
#ifndef __mycom__h__
#define __mycon__h__
#include < string .h >
// 数据格式
// W 8
#define SUCCESS 1
#define ERROR 0
#define uchar unsigned char
#define uint unsinged int
#define BUF_LEN 30 // 传冲区大小
#define RECIEVED_MAX_DATA_LEN 16
#define SEND_MAX_DATA_LEN 25
#define END_NUM 4 // 结束符长度
typedef void ( * PTRFUN)(uchar * ,uchar);
PTRFUN ptrFun;
uchar END_CODE[ 4 ] = " #end " ;
uchar end_num = 0 ;
uchar data_num = 0 ; // 接受数据个数
uchar data_buf[BUF_LEN]; // 缓冲区大小
uchar data_addr = 0 ; // 数据在data_buf位置
bit isComplete = 0 ; // 处理
typedef struct
{
char name[ 10 ]; // 姓名
int age; // 年龄
char sex[ 5 ]; // 性别
}st;
st b;
// 初始化
void init_serialcomm( void )
{
SCON = 0x50 ; // SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; // TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; // SMOD=1;
TH1 = 0xF4 ; // Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; // Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
// TI=1;
}
// *******数据转换*********************
uchar decoderData(){
uchar state,i;
state = 0 ;
i = 2 ;
// -----------------------计算地址-------------------------------
while ( 1 ){
if ( (data_buf[i] > 47 ) && (data_buf[i] < 58 ) ) // 是‘0’-‘9’?
state = (state * 10 ) + (data_buf[i] - 48 ); // 计算
else if ( data_buf[i] == ' ' ) break ; // 是空格,跳出
else // 非'0'-'9'和' '
{
return ERROR; // 返回错误
}
if ( i > 4 ) // 输入数字过大
{
return ERROR;
}
i ++ ;
}
data_buf[ 1 ] = state; // 数据个数
data_addr =++ i;
return SUCCESS;
}
// ***************************接收处理**************************************
void afterRecived( void )
{
if ( decoderData() == ERROR ) return ; // 错误,返回
if ( data_buf[ 1 ] > RECIEVED_MAX_DATA_LEN ) // 写入个数判断
{
return ; // 数据个数太多,返回
}
ptrFun( & data_buf[data_addr],data_buf[ 1 ]);
}
// 向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF = ch;
while (TI == 0 );
TI = 0 ;
}
// 向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char * str,uchar len)
{
unsigned int k = 0 ;
do
{
send_char_com( * (str + k));
k ++ ;
} while (k < len);
}
void sendBefore( void * p){
char * m = ( char * )p;
uchar len = sizeof (st);
send_string_com(m,len);
}
// 串口接收中断函数
void serial () interrupt 4 using 3
{
unsigned char state;
if ( RI == 1 )
{
state = SBUF; // 缓存接收到的数据
RI = 0 ; // 接收标志清零
// ---------------------检测结束命令#end---------------------------
if ( state == END_CODE[end_num] )
{
end_num ++ ;
if ( end_num == END_NUM )
{
end_num = 0 ;
isComplete = 1 ;
ES = 0 ;
}
}
else end_num = 0 ;
// ---------------------串口数据处理-------------------------------
if ( data_num > SEND_MAX_DATA_LEN )
{
data_num = 0 ;
// ERROR 接受数据过长
}
data_buf[data_num ++ ] = state;
}
}
#endif
#define __mycon__h__
#include < string .h >
// 数据格式
// W 8
#define SUCCESS 1
#define ERROR 0
#define uchar unsigned char
#define uint unsinged int
#define BUF_LEN 30 // 传冲区大小
#define RECIEVED_MAX_DATA_LEN 16
#define SEND_MAX_DATA_LEN 25
#define END_NUM 4 // 结束符长度
typedef void ( * PTRFUN)(uchar * ,uchar);
PTRFUN ptrFun;
uchar END_CODE[ 4 ] = " #end " ;
uchar end_num = 0 ;
uchar data_num = 0 ; // 接受数据个数
uchar data_buf[BUF_LEN]; // 缓冲区大小
uchar data_addr = 0 ; // 数据在data_buf位置
bit isComplete = 0 ; // 处理
typedef struct
{
char name[ 10 ]; // 姓名
int age; // 年龄
char sex[ 5 ]; // 性别
}st;
st b;
// 初始化
void init_serialcomm( void )
{
SCON = 0x50 ; // SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; // TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; // SMOD=1;
TH1 = 0xF4 ; // Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; // Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
// TI=1;
}
// *******数据转换*********************
uchar decoderData(){
uchar state,i;
state = 0 ;
i = 2 ;
// -----------------------计算地址-------------------------------
while ( 1 ){
if ( (data_buf[i] > 47 ) && (data_buf[i] < 58 ) ) // 是‘0’-‘9’?
state = (state * 10 ) + (data_buf[i] - 48 ); // 计算
else if ( data_buf[i] == ' ' ) break ; // 是空格,跳出
else // 非'0'-'9'和' '
{
return ERROR; // 返回错误
}
if ( i > 4 ) // 输入数字过大
{
return ERROR;
}
i ++ ;
}
data_buf[ 1 ] = state; // 数据个数
data_addr =++ i;
return SUCCESS;
}
// ***************************接收处理**************************************
void afterRecived( void )
{
if ( decoderData() == ERROR ) return ; // 错误,返回
if ( data_buf[ 1 ] > RECIEVED_MAX_DATA_LEN ) // 写入个数判断
{
return ; // 数据个数太多,返回
}
ptrFun( & data_buf[data_addr],data_buf[ 1 ]);
}
// 向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF = ch;
while (TI == 0 );
TI = 0 ;
}
// 向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char * str,uchar len)
{
unsigned int k = 0 ;
do
{
send_char_com( * (str + k));
k ++ ;
} while (k < len);
}
void sendBefore( void * p){
char * m = ( char * )p;
uchar len = sizeof (st);
send_string_com(m,len);
}
// 串口接收中断函数
void serial () interrupt 4 using 3
{
unsigned char state;
if ( RI == 1 )
{
state = SBUF; // 缓存接收到的数据
RI = 0 ; // 接收标志清零
// ---------------------检测结束命令#end---------------------------
if ( state == END_CODE[end_num] )
{
end_num ++ ;
if ( end_num == END_NUM )
{
end_num = 0 ;
isComplete = 1 ;
ES = 0 ;
}
}
else end_num = 0 ;
// ---------------------串口数据处理-------------------------------
if ( data_num > SEND_MAX_DATA_LEN )
{
data_num = 0 ;
// ERROR 接受数据过长
}
data_buf[data_num ++ ] = state;
}
}
#endif
#include
<
REGX52.H
>
#include " 51com.h "
#include " util.h "
unsigned char key_map[] = { 0 , 7 , 8 , 9 , ' / ' , 4 , 5 , 6 , ' * ' , 1 , 2 , 3 , ' - ' , ' c ' , 0 , ' = ' , ' + ' };
unsigned char tab[] = { 0xFE , 0x30 , 0x6d , 0x79 , 0x33 , 0x5b , 0x5f , 0x70 , 0x7f , 0x7b };
void process(uchar * p,len){
P1 = tab[string_to_int(p,len)];
}
void main( void )
{
init_serialcomm(); // 初始化串口
ptrFun = process;
b.age = 10 ;
sendBefore( & b);
// send_string_com("b",1);
while ( 1 )
{
if ( isComplete == 1 ) // 串口接收到一串数据
{
isComplete = 0 ; // 标志清零
if ( data_buf[ 0 ] == ' R ' )afterRecived();
else if ( data_buf[ 0 ] == ' S ' )send_string_com( " b " , 1 );
data_num = 0 ; // 重新开始接收数据
ES = 1 ; // 允许串口中断
}
}
}
#include " 51com.h "
#include " util.h "
unsigned char key_map[] = { 0 , 7 , 8 , 9 , ' / ' , 4 , 5 , 6 , ' * ' , 1 , 2 , 3 , ' - ' , ' c ' , 0 , ' = ' , ' + ' };
unsigned char tab[] = { 0xFE , 0x30 , 0x6d , 0x79 , 0x33 , 0x5b , 0x5f , 0x70 , 0x7f , 0x7b };
void process(uchar * p,len){
P1 = tab[string_to_int(p,len)];
}
void main( void )
{
init_serialcomm(); // 初始化串口
ptrFun = process;
b.age = 10 ;
sendBefore( & b);
// send_string_com("b",1);
while ( 1 )
{
if ( isComplete == 1 ) // 串口接收到一串数据
{
isComplete = 0 ; // 标志清零
if ( data_buf[ 0 ] == ' R ' )afterRecived();
else if ( data_buf[ 0 ] == ' S ' )send_string_com( " b " , 1 );
data_num = 0 ; // 重新开始接收数据
ES = 1 ; // 允许串口中断
}
}
}