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

串行通信的波特率可从4个开关选择,波特率分别为1200,2400,4800,9600。
这有个仿真图可以参考,图太大我分2张了。

也可以自己做一个图写程序。答完后追加100赏金~

#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;
}
}

追问

你好,这个就是我要的那个程序吗?

追答

这只是可以串口9600收发数据的,你要的,可以改一下就可以了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-19
#include<reg51.h>

#define uchar unsigned char
uchar key,dat,bort;
void uart() interrupt 4
{
if(RI)
{
RI=0;
dat=SBUF;
}
}
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
TMOD=0x20;
bord=0xfd;
TH1=TL1=bord;
TR1=1;
num=0;
dat=0;
while(1)
{
TH1=TL1=bord;
P1=0xff;
key=P1&0x0f;
switch(key)
{
case 0x0e:bord=0xe8;break;
case 0x0d:bord=0xf4;break;
case 0x0b:bord=0xfa;break;
case 0x07:bord=0xfd;break;
default:SBUF=dat;while(TI==0);TI=0;delay(100);dat++;break;
}
}
}追问

你好,能稍微解释下关键的语句吗?

追答

void uart() interrupt 4
{
if(RI)
{
RI=0;
dat=SBUF;//串口接收数据
P2=dat; //新增,将接收数据送P2口
}
}
void delay(uchar a) //延时a毫秒
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
TMOD=0x20;
bord=0xfd; //缺省波特率为9600
TH1=TL1=bord;
TR1=1;
num=0;
dat=0;
while(1)
{
TH1=TL1=bord;
P1=0xff;
key=P1&0x0f;
switch(key)
{
case 0x0e:bord=0xe8;break; //1200波特率
case 0x0d:bord=0xf4;break; //2400
case 0x0b:bord=0xfa;break; //4800
case 0x07:bord=0xfd;break; //9600
default:SBUF=dat;while(TI==0);TI=0;delay(100);dat++;break;//100毫秒发送一个数据
}
}
}

本回答被提问者和网友采纳
相似回答