max232通信 单片机之间

来源:百度知道 编辑:UC知道 时间:2024/06/30 10:31:36
我用两片max232来连接两个52单片机实现串口通信,这是学校的实验,各位别说什么单片机之间不用max232,可以直接相连,应为那样距离会受到限制。何况这是学校的实验,下面是我写的发送程序,给看下,其中keyscan是键盘扫描程序,没贴出来。连接图也贴出来了。

另外说明下,这个程序我把两个单片机直接相连可以通信,是不是连接max232后这个程序也可以实现通信。先谢谢啦
#include<reg52.h>
#include <intrins.H>
#define uchar unsigned char
#define uint signed int
uchar code shuzi[]={0XFC,0X60,0XDA,0XF2,0X66,0XB6,0XBE,0Xe0,0XFE,0XF6};
void init()
{
TMOD=0X20;//启动定时器1为工作方式2
TR1=1;
TH1=0xf4;
TL1=0xf4;//波特率设置
SCON=0X50;//串口初始化,工作方式1
}

void send(uchar k)
{
uchar num;
num=k;
SBUF=num;
while(!TI)
{
_nop_();
}
TI=0;
}

void delay(uint z)//延迟时间
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
main()
{
uchar m;
init();
while(1)
{
m=keyscan();
// P0=shuzi[5];
send(m);
}
}
下面是接受程序,我用两片max232来连接两个52

你这程序是单向通信,并且处于一直发送状态,发送没问题,这个可以用 串口调试助手 这个软件来测试,但是要说的是接收才是比较重要的,发送我只要发出去就OK了,这接收要首先要保证接收的实时性(如果主循环中在处理一些其他程序比如键盘扫描等就必须用串口中断并且设置优先级为最高)、其次是为了确保数据确实是要接收的正确数据,接收机要对数据进行判断分析(本人常用起始标志+数据包+结尾标志)。
以下是本人经常用来在线测试硬件电路的一个小程序

uchar dealon=0;
uchar get[8]={0};
uchar count=0;

void delay(uint t)
{while(t--);
}

void sendnews(uchar temp) //串行发送
{SBUF=temp;delay(500);}

void cominit() //初始化
{ TMOD=0x20;//设置定时器1为方式2
TH1=0xfd; //11.0592MHz------9600波特率
TL1=0xfd; //自动重装
TR1=1; //定时器启动
REN=1; // 串行允许接收
SM1=1; //工作方式1
EA=1; //开中断
RI=0;
ES=1; //开串口
}

void ser() interrupt 4 //串行中断服务程序
{ if(RI) {RI=0; get[count]=SBUF;count++;
if(count>3) //主机一次发4个字节
{count=0;
if(get[0]==0x5a&&get[3]==0xa5) dealon=1;
}