两片单片机之间的串行通信(proteus仿真图+程序)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

两片单片机之间的串行通信(proteus仿真图+程序)
两片单片机之间的串行通信(仿真图+程序)
AT89C51+MAX232
功能:
(1)甲机P1口的开关控制乙机P1口的发光二级管,开关闭合发光二级管亮,开关断开发光二级管灭。

(2)乙机P2口的开关控制甲机P2口的数码管,按下4*4矩阵键盘,显示对应的键值0~F (3)乙机P0^0口的开关控制甲机P2口的数码管,按下按键,数码管从0~9循环显示;
乙机P0^2口的开关控制甲机P2口的数码管,按下按键,数码管清零。

/****************************甲机控制与接收*********************************/ #include
#include
#define uchar unsigned char
#define uint unsigned int
sbit K0=P1^0;
sbit K1=P1^1;
sbit K2=P1^2;
sbit K3=P1^3;
sbit K4=P1^4;
sbit K5=P1^5;
sbit K6=P1^6;
sbit K7=P1^7;
uchar i;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y<0;y--);
}
void send(uchar c) //向串口发送字符
{ SBUF=c;
while(TI==0);
TI=0;
}
void main()
{ uchar i;
P2=0x00;
SCON=0x50; //串口模式1
TMOD=0x20; //T1工作模式2
PCON=0x00; //波特率不倍增
TH1=0xfd; //波特率设定6900
TL1=0xfd;
TI=RI=0;
TR1=1; //启动定时器T1
IE=0x90; //允许串口中断
while(1)
{ if(K0==0) send('0'); else send('A');
if(K1==0) send('1'); else send('B');
if(K2==0) send('2'); else send('C');
if(K3==0) send('3'); else send('D');
if(K4==0) send('4'); else send('E');
if(K5==0) send('5'); else send('F');
if(K6==0) send('6'); else send('G');
if(K7==0) send('7'); else send('H');
}
}
void serial_int() interrupt 4 //甲机串口接收中断函数{ if(RI)
{ RI=0;
if(SBUF>=0 &&SBUF<=15)
P2=tab[SBUF];
else
P2=0x00;
if(SBUF=='x')
if(i>=0&&i<9)
{
i=i+1;
P2=tab[i];
}
if(i==9) i=0;
if(SBUF=='y')
{
P2=0x00;
i=0;
}
}
}
/*****************************乙机控制与接收程序*****************************/ #include
#include
#define uchar unsigned char
#define uint unsigned int
sbit L0=P1^0;sbit L1=P1^1;
sbit L2=P1^2;sbit L3=P1^3;
sbit L4=P1^4;sbit L5=P1^5;
sbit L6=P1^6;sbit L7=P1^7;
sbit KEY1=P0^0;sbit KEY2=P0^2;
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y<0;y--);
}
void send(uchar c) //向串口发送字符{ SBUF=c;
while(TI==0);
TI=0;
}
uchar key() //按键扫描{ uchar keyon,temp;
P2=0x0f;
delay(1);
temp=P2^0x0f;
switch(temp)
{ case 1:keyon=3;break;
case 2:keyon=2;break;
case 4:keyon=1;break;
case 8:keyon=0;break;
default:keyon=16;
}
P2=0xf0;
delay(1);
temp=P2>>4^0x0f;
switch(temp)
{ case 1:keyon+=0;break;
case 2:keyon+=4;break;
case 4:keyon+=8;break;
case 8:keyon+=12;break;
}
return keyon;
}
void main()
{ SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1 工作模式2
PCON=0x00; //波特率不倍增
TH1=0xfd; //波特率设定: 9600
TL1=0xfd;
TI=RI=0;
TR1=1; //启动定时器T1
IE=0x90; //允许串口中断
delay(100);
while(1)
{ P2=0xf0; //矩阵键盘
if(P2!=0xf0)
send(key());
if(KEY1==1) //独立按键
{ delay(20);
if(KEY1==0)
send('x');
}
if(KEY2==0) //清零
send('y');
}
}
void serial_int() interrupt 4 //乙机串口接收中断函数{ if(RI) { RI=0;
switch(SBUF)
{ case '0':L0=0;break;
case '1':L1=0;break;
case '2':L2=0;break;
case '3':L3=0;break;
case '4':L4=0;break;
case '5':L5=0;break;
case '6':L6=0;break;
case '7':L7=0;break;
case 'A':L0=1;break;
case 'B':L1=1;break;
case 'C':L2=1;break;
case 'D':L3=1;break;
case 'E':L4=1;break;
case 'F':L5=1;break;
case 'G':L6=1;break;
case 'H':L7=1;break;
}
}
}。

相关文档
最新文档