⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receive.c

📁 口若悬河口若悬河口若悬河口若悬河口若悬河口若悬河口若悬河口若悬河口若悬河
💻 C
字号:
#include"reg52.h"
#define uchar unsigned char
uchar a[12];//记录0-F与和校验字节
bit t1s=0; //1秒到标志
bit rsucc=0; //接收成功标志
bit rstart=0;  //开始接收0-F与和校验字节标志
sbit SCON7=SCON^7; //帧错误
uchar rmath=0;	 //求和
uchar t=0;

/***********初始化T0T1************/
init()
{
SCON=0xd0;//方式3
TL1=0xfa; 
TH1=0xfa;
TH0=0x3c;
TL0=0xb0;	//50ms
TMOD=0x21; //T0工作于16位定时,T1于8位自动重装
PCON|=0x40;	//错误侦测功能
ET1=0;
ET0=1;
TR1=1;
RI=0;
//TR0=1;
EA=1;
}

/*********错误要求重发*************/
void error()
{
rstart=0; //一有错误就清帧开始位
rmath=0;
ACC=0xa6;
TB8=P;
SBUF=ACC;
//P1=ACC;
}

/*********接收部分***********/
void receive()
{
uchar j,sum;
unsigned int rsum=0;
//while(TI)
//TI=0;
while(rsucc==0)
{
while(RI==0);//等待接收一个完整的数据帧
{
RI=0;
if(SCON7)
error();  //没有收到停止位,要求重发
ACC=SBUF;
//P1=SBUF;
if(P^RB8!=0)   //奇偶校验
error();
if(ACC==0xaa)//首帧正确
rstart=1;
if(rstart)
{
a[rmath]=SBUF;
rmath++;
//P1=SBUF;
if(rmath==16)
{
rmath=0;
for(j=0;j<16;j++)
rsum+=a[j];
sum=rsum;
//j++;
if(sum==a[17])
{
rstart=0; //全接收后复位
rsucc=1; //成功接收标志置1
TR0=1; // 允许中断
}
else
error(); //错误重发
}//P1=0x40;
}
}}}

/**************T0中断入口**************/
void timer0() interrupt 1
{
TL0=0xb0;
TH0=0x3c;
t++;
if(t==20)
{t1s=1;
t=0;
}}

/*************主函数 ****************/
void main()
{
uchar i=0;
init();
while(1)
{
if(rsucc)
{
if(t1s)
t1s=0;
P1=a[i]; //依次把帧首字节与0-F分别送到P1口
i++;
if(i==16)
{i=0;
rsucc=0; //等待下一次
}
}
receive();
}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -