📄 串口.c
字号:
#include<reg51.h>
#include<stdio.h>
#include<string.h>
#define uchar unsigned char
/*计算机链接的控制代码*/
#define STX 0X02 //文本发送开始
#define ETX 0X03 //文本结束
#define EOT 0x04 //发送结束
#define ENQ 0x05 //请求
#define ACK 0X06 //确认
#define LF 0X0A //换行
#define CL 0x0C //清除
#define CR 0X0D //回车
#define NAK 0x15 //不能确认
typedef struct
{
char InBuf[8]; //接收缓冲区
char OutBuf[8]; //发送缓冲区
unsigned InPoint :4; //接收指针
unsigned OutCount :4; //发送计数器
unsigned OutPoint :4; //发送指针
unsigned InSta :1; //接收缓冲区状态标志
unsigned OutSta :1; //发送状态标志,0=空闲,1=正在发送
}COMM;
extern uchar disp_buf[8];
COMM comm;
sbit LED=P1^0;
/*串口初始化*/
void init_serial(void)
{
SCON=0X50;
TMOD|=0X20;
TH1=0xE8; //波特率1200bit/s
TL1=0XE8;
TR1=1;
ES=1;
EA=1;
comm.OutPoint=0;
comm.OutCount=0;
comm.InSta=0;
comm.OutSta=0;
}
/*********发送函数**********/
bit send(char *p,char len)
{
char i;
unsigned char sum;
if(comm.OutSta)return 0; //正在发送,本次发送失败
for(i=0,sum=0;i<len;i++)
{
sum+=*p; //产生校验和
comm.OutBuf[i]=*p++;
}
// comm.OutBuf[i++]=sum|0X80; //校验和最高位为1,避免跟控制符混淆
comm.OutBuf[i]=EOT; //添加结束符
comm.OutCount=len+1;
comm.OutPoint=0;
comm.OutSta=1;
SBUF=STX; //发送起始符
return 1; //发送成功
}
/*处理接收到的数据*/
void receive_serve()
{
uchar arr[8];
if(!comm.InSta)return;
switch(comm.InBuf[0])
{
case 't':
arr[0]=disp_buf[5]+'0'; //发送温度
arr[1]=disp_buf[6]+'0';
arr[2]='.';
arr[3]=disp_buf[7]+'0';
send(arr,4);
break;
case '0':
LED=0;
break;
case '1':
LED=1;
}
comm.InPoint=0;
comm.InSta=0;
}
/*串口中断*/
void serial_int(void) interrupt 4 using 1
{
if(TI)
{//发送中断
TI=0;
if(comm.OutPoint<comm.OutCount)
{
SBUF=comm.OutBuf[comm.OutPoint++];
}
else
{
comm.OutSta=0; //发送完毕
}
}
else
{//接收中断
RI=0;
if(SBUF==EOT)
{//接收到结束符
comm.InSta=1;
}
else
{
if(comm.InPoint<8)
{
comm.InBuf[comm.InPoint++]=SBUF;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -