📄 send.c
字号:
/**************先发0xaa,再发0-F笔段码(要发奇偶检验位TB8),然后发和检验字节********************/
#include"reg52.h"
#define uchar unsigned char
uchar seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
0x83,0xc6,0xa1,0x86,0x8e}; //0-F笔段码
uchar sum;
bit tsucc=1; //开始时假设发送成功
sbit P10=P1^0;
uchar timemath=0;
uchar rdata;
/************初始化T1,波特率4800,不倍增,8位自动重装******************/
void init()
{
SCON=0xd0;
TL1=0xfa;
TH1=0xfa;
TMOD=0x2f;
ET1=0;//T1禁止中断,只用于计数(IE)
TR1=1;
//ES=1;
//EA=1;
}
/****************0-F和放seg[17],有返回值*******************/
unsigned int add()
{
uchar i;
int sum=0;
for(i=0;i<16;i++)
sum+=seg[i];
return(sum);
}
/*************把0-F字节分别发过去******************/
send()
{
ACC=seg[timemath];
TB8=P;
SBUF=ACC;
timemath++;
if (timemath==16)
{timemath=0;
//P1=0xf0;
ACC=sum;
TB8=P;
SBUF=ACC; //和部分
while(TI==0);//最后一帧要清TI,防止重发,等待回发是否正确
TI=0;
}
}
/**************接收部分*****************/
void receive()
{
ACC=SBUF;
rdata=ACC;
//P1=ACC;
if(P^RB8==0&&rdata==0xa5)
//if(P^RB8!=0||rdata==0xa6)
{tsucc=0;//发送成功
}
else
{
tsucc=1;//重发
ACC=0xa6;
TB8=P;
SBUF=ACC;
while(TI==0);//最后一帧要清TI,防止重发,等待回发是否正确
TI=0;
//P1=ACC;
}
}
/***************主函数******************/
void main()
{
P10=1;
//uchar k;
init();
while(1)
if(tsucc)
{
P10=~P10;
tsucc=0;
sum=add();
ACC=0xaa;//发帧首标志
TB8=P;
SBUF=ACC;
while(tsucc==0)//等待发送或接收有效 (重发时有用)
{if(RI==1||TI==1)
{
if(TI)
{TI=0;
send();
}
if(RI)
{RI=0;
receive();
}}
}}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -