/*****************************************/
/* Copyright (c) 2005, 通信工程学院 */
/* All rights reserved. */
/* 作 者:戴 佳 */
/*****************************************/
#include "PMPDataT.h"
/* 延时t毫秒 */
void delay(uint t)
{
uint i;
while(t--)
{
/* 对于11.0592M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
uchar keyscan(void)
{
uchar scancode,tmpcode;
P1 = 0xf0; // 发全0行扫描码
if ((P1&0xf0)!=0xf0) // 若有键按下
{
delay(10); // 延时去抖动
if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行扫描
{
P1 = scancode; // 输出行扫描码
if ((P1&0xf0)!=0xf0) // 本行有键按下
{
tmpcode = (P1&0xf0)|0x0f;
/* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}
/* 发送数据函数 */
void senddata(uchar buf)
{
/* 发送数据 */
TI = 0;
TB8 = 0; // 发送数据帧
SBUF =buf;
while(!TI);
TI = 0;
}
/* 串口初始化函数 */
void init_serial()
{
TMOD = 0x20; // 定时器T1使用工作方式2
TH1 = 250;
TL1 = 250;
TR1 = 1; // 开始计时
PCON = 0x80; // SMOD = 1
SCON = 0xd0; // 工作方式,9位数据位,波特率9600kbit/s,允许接收
}
void Getkey()
{
switch(get_key)
{
case 0x11: // 1行1列,数字0
key=0xc0;
break;
case 0x21: // 1行2列,数字1
key=0xf9;
break;
case 0x41: // 1行3列,数字2
key=0xa4;
break;
case 0x81: // 1行4列,数字3
key=0xb0;
break;
case 0x12: // 2行1列,数字4
key=0x99;
break;
case 0x22: // 2行2列,数字5
key=0x92;
break;
case 0x42: // 2行3列,数字6
key=0x82;
break;
case 0x82: // 2行4列,数字7
key=0xf8;
break;
case 0x14: // 3行1列,数字8
key=0x80;
break;
case 0x24: // 3行2列,数字9
key=0x90;
break;
case 0x44: // 3行3列,10
key=0x88;
break;
case 0x84: // 3行4列,11
key=0x83;
break;
case 0x18: // 4行1列,12
key=0xc6;
break;
case 0x28: // 4行2列,13
key=0xa1;
break;
case 0x48: // 4行3列,14
key=0x86;
break;
case 0x88: // 3行4列,15
key=0x8e;
break;
default:break;
}
}
/* 主程序 */
void main()
{
uchar i = 0;
key=0xc0;
while(1)
{
get_key = keyscan(); // 调用键盘扫描函数
Getkey();
buf=key;
/* 通过P0口读要访问的从机地址 */
P0 = 0xff;
addr = P0&0x0f;
init_serial(); // 串口初始化
EA = 1; // 关闭所有中断
TI = 0;
TB8 = 1; // 发送地址帧
SBUF = addr;
while(!TI);
TI = 0;
senddata(buf); // 发送数据
}
}
51单片机的多机通信是嵌入式系统中的一种常见应用场景,特别是在物联网和自动化设备中,多个设备之间的信息交换至关重要。这里的"一主三从"模式指的是一个主控设备(Master)与三个从属设备(Slave)进行通信的架构。在这样的系统中,主控设备通常负责协调和控制整个网络,而从属设备则根据主控的指令执行相应的操作。 USART(通用同步/异步收发传输器)是51单片机实现串行通信的核心硬件模块。它支持全双工通信,即同时进行发送和接收数据,而且可以工作在同步或异步模式下。在多机通信中,通常采用异步通信方式,因为它结构简单,适应性强。 在51单片机的多机通信中,主要涉及以下几个关键知识点: 1. **初始化设置**:每个设备都需要配置其USART参数,包括波特率、数据位、停止位和奇偶校验位。这些参数必须在所有参与通信的设备间保持一致,以确保数据的正确传输。 2. **地址识别**:在多机通信中,为了区分不同的从设备,主机会在发送的数据帧中包含从设备的地址。从设备只有在接收到自己的地址时才会响应,这通常通过在数据帧的起始部分添加特定的地址位来实现。 3. **命令与数据传输**:主设备通过USART向从设备发送命令,如读取数据、写入数据或执行特定操作。从设备接收到命令后,执行相应的动作并可能回传数据。 4. **协议设计**:有效的多机通信需要一套清晰的通信协议。这包括数据帧的格式、握手机制(用于确认数据的接收)、错误检测与纠正方法等。比如,可以使用CRC(循环冗余校验)来检测数据传输中的错误。 5. **中断处理**:51单片机的USART通常采用中断方式处理通信,当有数据接收或发送完成时,会产生中断请求,程序通过中断服务函数来处理这些事件,提高了实时性。 6. **Proteus仿真**:Proteus是一款强大的电子电路仿真软件,能模拟51单片机的硬件电路和程序运行。通过Proteus,开发者可以直观地观察到多机通信的过程,调试通信协议和代码,大大缩短了开发周期。 7. **编程实践**:使用C语言或汇编语言编程,编写主从设备的控制程序,实现数据的发送和接收。这包括对USART寄存器的操作,以及根据协议设计的函数实现。 8. **硬件连接**:51单片机之间的连接通常使用串口线,如TTL电平的RXD和TXD引脚相连,通过电平转换器(如MAX232)可以与RS232标准接口设备通信。 9. **实际应用**:多机通信广泛应用于工业自动化、智能家居、传感器网络等领域,如远程监控系统、多设备数据采集和传输等。 以上就是51单片机多机通信的主要知识点,通过理解这些原理和实践技巧,可以有效地设计和实现多机通信系统。在压缩包文件中,"多机通信"可能是包含源代码和仿真文件的项目,供学习者参考和实践。














































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 4
- 资源: 7
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于射频采样宽带数字阵列雷达波束形成_刘明鑫.caj
- 一种新的级联FFT算法_张大炜.caj
- 基于动态子阵划分的宽带数字波束形成_程进.caj
- 宽带数字阵列波束形成系统_陈赞.caj
- LEO卫星Ka宽带数字相控阵抗干扰技术研究_王海旺.caj
- 分数时延滤波器设计.pdf
- CNN-master.zip
- Garbage classification.zip
- DL-wastesort-master.zip
- ug1037-vivado-axi-reference-guide.pdf
- ug1292-ultrafast-timing-closure-quick-reference.pdf
- ug949-vivado-design-methodology-zh-cn-2022.2.pdf
- 时序约束.pdf
- (转载)五子棋python
- SAP SD-Class 1 Enterprise structure Organization structure.mp4
- SAP SD-Class 2 Customer master & Partner determination (ECC).mp4


