×
单片机 > 单片机程序设计 > 详情

单片机与单片机串口通讯程序

发布时间:2020-05-30 发布时间:
|

单片机 与单片机串口通讯程序

#include 
#define uchar unsigned char 
#define SLAVE 0x00 
#define BN 16 

uchar idata tdata[16];

uchar idata rdata[16]; 
bit trdy; 
bit rrdy; 
void main(void) 

  TMOD=0x20;                        //定时器T1为模式2 
  TL1=0xfd;                        //定时器初值 
  TH1=0xfd; 
  PCON=0x00; 
  TR1=1; 
  SCON=0xf0;                        //串行口方式3 
  ES=1;EA=1;                        //开串行口中断 
  while(1){trdy=1;rrdy=1;}                //准备好发送和接收 


void slave(void) interrupt 4 using 1 

  void str(void); 
  void sre(void); 
  uchar a; 
  RI=0;                            //关串行口中断 
  ES=0; 
  if(SBUF!=SLAVE){ES=1;goto reti;}        //非本机地址,继续监听 
  SM2=0;                            //取笑监听状态 
SBUF=SLAVE;                    //发回从机地址 
while(TI!=1);TI=0; 
while(RI!=1);RI=0; 
if(RB8==1){SM2=1;ES=1;goto reti;}        //确认地址不符,从机复位 
a=SBUF;                        //接收命令 
if(a==1){                        //从机接收主机的数据 
if(rrdy==1) SBUF=0x01;            //接收准备好,发回0x01 
else 
SBUF=0x00; 
while(TI!=1);TI=0; 
while(RI!=1);RI=0; 
if(RB8==1){SM2=1;ES=1;goto reti;} 
sre();                        //接收数据 

else 

if(a==0x02)                    //从机向主机发送数据 

if(trdy==1) SBUF=0x02;        //发送准备好 
else 
SBUF=0x00; 
while(TI!=1);TI=0; 
while(RI!=1);RI=0; 
if(RB8==1){SM2=1;ES=1;goto reti;} 
str( );                    //发送数据 

else 

SBUF=0x80;                //命令非法 
while(TI!=1);TI=0; 
SM2=1;ES=1;                //恢复监听 


reti:; 


void str(void)                        //发送数据函数 
{uchar p,i; 
 trdy=0; 
 do{p=0;                            //初始校验和为0 
    for(i=0;i     {SBUF=tdata[i];                    //发送数据 
      p+=tdata[i]; 
      while(TI!=1);TI=0; 
     } 
  SBUF=p;                        //发送校验和 
while(TI!=1);TI=0; 
while(RI!=1);RI=0; 
}while(SBUF!=0);                    //主机接收不正确,重新发送 
SM2=1;ES=1; 


void sre(void)                        //接收数据函数 
{uchar p,i; 
 rrdy=0; 
 while(1) 
{p=0;                                //初始化校验和为0 
   for(i=0;i{while(RI!=1);RI=0; 
   tdata[i]=SBUF;                    //接收数据 
   p+=rdata[i]; 
  } 
  while(RI!=1);RI=0; 
if(SBUF==p){SBUF=0x00;break;}        //校验和相同,发00H 
else{ 
SBUF=0xFF;while(TI!=1);TI=0;        //校验和不同,发FFH,重新接收 
 } 

SM2=1;ES=1; 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 USB HID 键盘