实验目的:
1.主机3个按键,分别是加1,发送数据和汇总数据。
按下加1,右边数码管显示数加1,左边的数码管显示7;
按下发送数据,将主机当前显示的数,发送给所有从机,同时左边数码管显示5;
按键汇总数据,将从机显示的数相加求和,并显示在右边数码管上,同时左边数码管显示6。
2.从机只有一个加1按键,按一下,数码管显示数加1;
如果收到主机发送的数据,则显示主机发送的数据。
proteus仿真原理图如下:
主机代码:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key_send = P3^3;
sbit key_total = P3^5;
sbit key_add = P3^7;
uchar key,num,a,b;
void delay10ms(uint n)
{
uchar i,j;
for(;n>0;n--)
{
for(i=0;i<18;i++)
{
for(j=0;j<184;j++){;}
}
}
}
void UART_init(void)
{
SCON = 0X50;
TMOD = 0X20;
PCON = 0X00;
TH1 = 0XFD; //波特率9600,@11.0592MHz
TL1 = 0XFD;
TR1 = 1;
ES = 1;
EA = 1;
}
void key_scan() //按键识别
{
if(!key_send)
{
delay10ms(1);
if(!key_send)
{
while(!key_send);
key=1;
}
}
if(!key_total)
{
delay10ms(1);
if(!key_total)
{
while(!key_total);
key=2;
}
}
if(!key_add)
{
delay10ms(1);
if(!key_add)
{
while(!key_add);
key=3;
}
}
}
void num_add(void)
{
key=0; //按键码复位
++num;
P1=7;
P2 = num/10 << 4 | num%10; //数码管显示
}
void num_total(void)
{
key = 0;
num = a+b;
P1 = 6;
P2 = num/10 << 4 | num%10;
}
void num_send(void)
{
key = 0;
SBUF = num; //发送数据
while(!TI);
TI = 0;
P1 = 5;
}
void uart(void) interrupt 4
{
if(RI)
{
RI=0;
if(SBUF == 0xf8) //接收地址,判断是从机1
{
while(!RI); //等待接收数据
RI=0;
a = SBUF; //暂存起来
}
if(SBUF == 0xf0) //接收地址,判断是从机2
{
while(!RI);
RI=0;
b = SBUF;
}
}
}
void main(void)
{
UART_init();
key = 0;
num = 0;
P1 = 0;
P2 = 0;
while(1)
{
key_scan();
switch(key)
{
case 1 : num_send(); break;
case 2 : num_total(); break;
case 3 : num_add(); break;
}
}
}
从机地址是硬件上接的,2个从机代码一样,代码如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P3^7;
uchar num;
void delay10ms(uint n)
{
uchar i,j;
for(;n>0;n--)
{
for(i=0;i<18;i++)
{
for(j=0;j<184;j++){;}
}
}
}
void UART_init(void)
{
SCON = 0X50;
TMOD = 0X20;
PCON = 0X00;
TH1 = 0XFD; //波特率9600,@11.0592MHz
TL1 = 0XFD;
TR1 = 1;
ES = 1;
EA = 1;
}
void uart_send(void)
{
SBUF = P1; //发送地址
while(!TI);
TI = 0;
SBUF = num; //发送数据
while(!TI);
TI = 0;
}
void uart(void) interrupt 4
{
if(RI)
{
RI=0;
num = SBUF;
delay10ms(1); //两个从机应设置不同的值,避免同时发送
uart_send(); //向主机发送当前数据
}
}
void main(void)
{
UART_init();
num = 0;
P2 = 0;
while(1)
{
P2 = num/10 << 4 | num%10; //数码管显示接收的数
if(!key) //检测按键按下
{
delay10ms(1); //软件防抖
if(!key)
{
while(!key); //检测按键松开
++num; //数字加1
uart_send(); //向主机发送当前数据
}
}
}
}