主机(发送机) 代码
/******************************************************
@File : 串两单片机通信(发送学号后6位)--主机.c
@Author: zero
@Date : 2021/09/27
@Log : 2021/09/28 修改 发送的数据 由主机控制发送, 从机只管接收
*****************************************************/
#include <reg51.h>
sbit key = P3 ^ 7; //定义按钮端口
sbit led = P1 ^ 3; //定义led端口
unsigned char a = 0;
unsigned char code student_ID[] = {
1,
2,
0,
0,
7,
5, //TODO 修改为自己的学号
10 //10-为全灭
}; //定义学号数组
//延时函数
void delay_ms(unsigned int n)
{
unsigned int i = 0, j = 0;
for (i = 0; i < n; i++)
for (j = 0; j < 123; j++);
}
//发送函数
void Send_data(unsigned char date)
{
SBUF = date; //将date赋予SBUF发送出去
while (!TI)
; //等待发送数据完成
TI = 0; //清除发送完成标志位
}
//主函数
void main()
{
SCON = 0x40; //选择方式1
TMOD = 0x20; //使用定时器1,8位自动加载计时器
TH1 = 0xfd; //设定波特率为9600
TL1 = 0xfd; //设定波特率为9600
TR1 = 1; //启用定时器1
while (1)
{
if (key == 0) //判断按钮是否按下
{
delay_ms(50); //延时去抖
if (key == 0) //再次判断按钮是否按下
{
led = !led; //取反led电平
Send_data(student_ID[a]); //调用(发送数据)函数,将数据发送给从机
a = (a + 1) % 7; //取余,7次归0
while (key == 0) //判断按钮是否松开
{
delay_ms(200); //按钮不松开,一直延时
}
}
}
}
}
从机(接收机) 代码
/******************************************************
@File : 串两单片机通信(发送学号后6位)--从机.c
@Author: zero
@Date : 2021/09/27
@Log : 2021/09/28 修改 发送的数据 由主机控制发送, 从机只管接收
*****************************************************/
#include <reg51.h>
unsigned char a;
unsigned char code _0to9_[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff}; //定义 0-9数组 及 全灭
//主函数
void main()
{
SCON = 0x50; //选择方式1
TMOD = 0x20; //使用定时器1,8位自动加载计时器
TH1 = 0xfd; //设定波特率为9600
TL1 = 0xfd; //设定波特率为9600
TR1 = 1; //启用定时器1
EA = 1; //开总中断
ES = 1; //允许串口中断
while (1)
{
//do anything that you want
}
}
//外部中断中断函数
void serial() interrupt 4
{
if (RI) //RI=1时表示串口接收完成,当有数据来,RI置位
{
a = SBUF; //将数据赋予a
RI = 0; //先读数据,后清零
P0 = _0to9_[a]; //取数组中a的数据赋予P0
}
}
Proteus 仿真??
?
使用的元器件?
?
|