51C语言程序集合串口
无情未必真豪杰,怜子如何不丈夫。关关雎鸠,在河之洲。窈窕淑女,君子好逑。
人有悲欢离合,月有阴晴圆缺。不去庆父,鲁难未已。青青子衿,悠悠我心。#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*通信发送成功标志*/
#define __ERR_ 0xF0
#define __SUCC_ 0x0F
/*全局变量*/
uchar buf[2]; //接收和发送数据缓冲区 uchar time_over;
uchar over_times;
void init_serial(); //串口初始化
uchar make_datapac(uchar detect,uchar command); void host_to_slave(uchar slave_addr,uchar data_len); void send_data(uchar data_len);
uchar recv_data();
/* 初始化串口 */
void init_serial()
{
TMOD = 0x21; //定时器T1使用工作方式2,定时器T0使用工作方式1
TH0=0x3C;
TL0=0xB0;
TH1 = 0XE8; // 设置初值
TL1 = 0XE8;
TR1 = 1; // 开始计时
PCON = 0x80; // SMOD = 1
SCON = 0xd0; //工作方式3,9位数据位,波特率4800bps,允许接收
ET0=1;
EA=1;
}
/***********************************************************************
***************************/
/********************通信相关函
数****************************************************************/
/***********************************************************************
****************************/
/*生成数据包,参数1为检测种类,参数2为命令种类*/
uchar make_datapac(uchar detect,uchar command)
{
*buf=(((0x00|detect)<<2)|command); //数据的第一个字节,第四位和第三位为检测种类,最低两位为命令种类
if((command==ASK)||(command==CANCEL_ALARM))
//如果是询问指令,数据长度为1
{
return 1;
}
else if(command==INSTALL) //如果是设置指令,数据长度为2,第二个字节是点滴速度
{
buf[1]=host_bit_rate;
return 2;
}
}
/*主机与从机通信函数,参数有从机地址,数据长度,数据内容保存于全局变量buf中*/
void host_to_slave(uchar slave_addr,uchar data_len) {
uchar tmp;
uchar command=(*buf)&0x03;
CLEARSCREEN;
writerow(2,"呼叫中... ");
if(detect_type!=QUICK_SCAN)
{
play(52,3); //呼叫slave_addr号从站
playnum(slave_addr);
play(56,2);
play(59,3);
}
/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */
tmp = slave_addr-1;
over_times=0;
while(tmp != slave_addr)
{
/* 发送从机地址 */
TI = 0;
TB8 = 1; // 发送地址帧 SBUF = slave_addr;
while(!TI);
TI = 0;
接收从机应答 */ /*
RI = 0;
time_over=0;
TR0=1;
while((!RI)&&(!time_over));
TR0=0;
TH0=0x3C;
TL0=0xB0;
if(over_times>=50) {
return;
}
if(time_over==1) //如果超时,没有检测到从机信号,重新
发
{
continue;
}
tmp = SBUF;
RI = 0;
}
/* 发送数据并接收校验信息,如果接收的信号为0FH,表示从机接
收成功,否则将重新发送该组数据 */
tmp = __ERR_;
while(tmp != __SUCC_)
{
delay1ms(5);
send_data(data_len); // 发送数据
RI = 0; //等待从机发送校验信号
while(!RI);
tmp = SBUF;
RI = 0;
}
if(command==ASK)
{
/* 数据接收 */
tmp = 0xff;
while(tmp == 0xff) // 如果数据校验失败则重新接收数据
{
tmp = recv_data(); // 校验失败返回0xff,接收成功则
返回0
}
}
CLEARSCREEN;
writerow(1,"通信完毕 ");
delay1ms(100);
}
/* 发送数据 */
void send_data(uchar data_len) {
uchar ecc; // 保存校验字节 uint i;
ecc = data_len; // 开始进行校验字节计算
/* 发送数据长度 */
s(5); delay1m
TI = 0;
TB8 = 0; // 发送数据帧
SBUF = data_len; // 发送长度
while(!TI);
TI = 0;
/* 发送数据 */
for(i=0; i