题目:两个单片机利用串行口方式1进行串行单工通信

2025-06-21 02:36:34
推荐回答(1个)
回答1:

#include "stc12c5a.h"

#define uchar unsigned char 
#define uint  unsigned int 

sbit Alm_led  =P4^4; //报警指示灯

uchar rec_cnt;

uchar rec_stat;

uchar rec_buf[32];

void delay_1s(uint x)  //延时
{
  uint y;
uint z;    //如果延时不够长可以把z的值加大
while(x--)
{
for(y=0;y<50000;y++)
{
  z=200;;
while(z--);
}
}
}
void Init_uart0(void )
{
P4SW |=0x70;  //p4.5做IO口输出
EA=0;
TMOD&=0X0F;
TMOD|=0X20;
SCON= 0X50;
TH1 = TL1 =0xfd;   //9600
//---------------------
ES=1;
TR1=1;
REN=1;
//----------------------------------------------------------------------

EA=1;
}

/******************************************************************/
/*                   发送数据到串口                              */
/******************************************************************/
void Send_one_byte(uchar dat)
{

ES =0;
TI=0;
SBUF = dat;         //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
    while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0;
ES=1;
}

void main(void)
{
delay_1s(1);
   Init_uart0();
Send_one_byte(0);
while(1)
{
  ;
}

}

void int_uart(void) interrupt 4 
{

uchar sbuf_temp;


  if(RI==1)
{
  RI=0;
sbuf_temp=SBUF;

if((sbuf_temp==0x7e) && (rec_cnt==0)) //帧起始
{
  rec_stat=1;

rec_buf[0]=sbuf_temp;

rec_cnt=1;
}

else if(rec_stat==1)
{
  rec_buf[rec_cnt++]=sbuf_temp;

if(rec_cnt == (rec_buf[1]+4))
{

  SBUF = 0X0E;

rec_cnt=0;
}

}

}
else if(TI==1)
{
  TI=0;
}
}