自己写的简单的程序,实在是很简单,不过我可是菜鸟,为了记下自己的点点进步,所以贴到博客上。
具体实现的功能就是主机发送命令,相应的从机给主机回送数据(数字),主机通过数码管显示。
通信协议比较简单,需要加上对地址应答部分和数据校验。
//主机加按键命令,发送命令,查询方式,从机受到命令后发送数据,主机显示
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0; //按键命令
sbit key2=P1^1;
sbit key3=P1^2;
uchar temp1=0x01,temp2=0x02,temp3=0x03; //从机各位验证地址
void delay(uchar N) //1ms延时
{
uint i,j;
for(i=0;i
for(j=0;j<110;j++);
}
void init_serial()
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 253; // 设置初值
TL1 = 253;
TR1 = 1; // 开始计时
PCON = 0; // SMOD = 0
SCON = 0x50; //工作方式1,波特率9600bps,允许接收
}
void main(void)
{ uchar tmp1,tmp2,tmp3;//
init_serial(); //初始化
P1=0; //P1口清零
while(1)
{
while(key1) // 1号从机函数
{
delay(10);
while(key1) //按键去抖动
while(1) //接收循环
{
P2=temp1;
SBUF = temp1;
while(!TI);
TI=0; //发送地址
// delay(100);
while(!RI);
RI = 0;
tmp1 = SBUF;
P0=tmp1;//接收从机1回送的数据;并把数据给P0
if(key2||key3)
{
delay(1);
if(key2||key3)
break;
} //如果其他按键按下则跳出本函数执行相应按键的发送地址函数
}
}
while(key2) // 2号从机函数
{
delay(10);
while(key2)
while(1)
{
P2=temp2;
SBUF = 0x02;
while(!TI);
TI=0;
//delay(100);
while(!RI);
RI = 0;
tmp2 = SBUF;
P0=tmp2;
RI=0;
if(key1||key3)
{
delay(1);
if(key1||key3)
break;
}
}
}
while(key3) // 3号从机函数
{
delay(10);
if(key3)
while(1)
{
P2=temp3;
SBUF = 0x03;
while(!TI);
TI=0;
//delay(100);
while(!RI);
RI = 0;
tmp3 = SBUF;
P0=tmp3;
RI=0;
if(key2||key1)
{
delay(1);
if(key2||key1)
break;
}
}
}
}
从机程序:
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar aa = 0x20; //起始数据
uchar temp;
sbit P10=P1^0;//接收数据成功指示
void delay(uchar N) //1ms延时
{
uint i,j;
for(i=0;i
for(j=0;j<110;j++);
}
void init_serial()
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 253; // 设置初值
TL1 = 253;
TR1 = 1; // 开始计时
PCON = 0; // SMOD = 0
SCON = 0x50; //工作方式1,波特率9600bps,允许接收
EA=1;
ES=1;
}
void intrr() interrupt 4 //串口中断函数
{
while(!RI); //接收地址
RI = 0;
if(SBUF==0x01) //1号机地址
{
temp = SBUF;
P10=~P10;
P2=temp;//把地址给P2口
RI=0;
delay(1000); //发送数据延时
SBUF=aa; //发送起始数据
while(!TI);
TI=0;
aa++; //数据循环
if(aa>0x29)
aa=0x20;
P0=aa; //同时把数据给P0口显示
delay(100);
}
}
void main(void) //主函数
{
init_serial(); //初始化
P1=0xff;
delay(1000);
while(1) //循环
{
;
}
}
关键字:51单片机 多机通信
引用地址:
51单片机232多机通信
推荐阅读最新更新时间:2024-03-16 14:37
51单片机无条件转移指令(4条)
控制转移 指令 用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移 指令 相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 . 无条件转移指令(4条) 这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 LJMP addr16 ;addr16→(PC),给程序 计数器 赋予新值(16位地址) AJMP addr
[单片机]
浮点数压栈--MCS-51单片机实用子程序
标号: FPUS 功能:浮点数压栈 入口条件:操作数在 中。 出口信息:操作数压入栈顶。 影响资源:A、R2、R3 堆栈需求: 5字节 FPUS: POP ACC ;将返回地址保存在R2R3中 MOV R2,A POP ACC MOV R3,A MOV A,@R0 ;将操作数压入堆栈 PUSH ACC INC R0 MOV A,@R0 PUSH ACC INC R0 MOV A,@R0 PUSH ACC DEC R0 DEC R0 MOV A,R3 ;将返回地址压入堆栈 PUSH ACC MOV A,R2 PUSH ACC RET ;返回主程序
[单片机]
AT89C51单片机高速串行输出口设计
摘要: 介绍使用AT89C51单片机扩展高速串行同步移位输出口的方法,给出基于分立TTL元器件和可编程逻辑器件PLD两种电路的实现方案,在LED点阵显示屏系统中已得到应用。
关键词: 串行口 单片机 可编程逻辑器件
AT89C51(与MCS-51兼容)单片机的串行口在方式0工作状态下,使用移位寄存器芯片可以扩展多个8位并行I/O口。在LED点阵显示屏应用系统中,一般都采用数据同步移位输出方式,并使用移位寄存器芯片(如74LS595)扩展并行I/O口驱动LED点阵显示。LED点阵显示采用扫描方式,为不产生闪烁感,每秒需要传送50屏点阵显示数据,因此有大量的数据要通过同步移位的方式送到显示驱动电路部
[工业控制]
51单片机对SAA7113初始化和控制的程序
用51单片机对7113初始化和控制 SAA7113的初始化就是对寄存器配置合适的参数,使其能够有符合要求的输出。寄存器配置通过I2C总线来进行,很多可以控制I2C总线的器件都可以作为主器件对7113进行初始化,这里介绍用51单片机初始化7113的例子。 51单片机和7113的硬件连接非常简单,只要把单片机的两个I/O口(如P1.0、P1.0)直接和7113的SCL、SDA管脚相连,再加上上拉电阻即可。 用单片机初始化7113的主要任务是程序的编写,首先要熟悉I2C总线协议,根据I2C总线的原理写出启动、停止、应答信号等的子程序,由子程序再写出发送、接收1个字节的程序,然后根据7113的寄存器操作格式写出读写寄
[单片机]
51单片机C语言教程(七) 表达式2
关系运算符 对于关系运算符,同样我们也并不陌生。C中有六种关系运算符,这些家伙同样是在小时候学算术时学习过的: > 大于 < 小于 >= 大于等于 <= 小于等于 == 等于 != 等于 或者你是个非C程序员,那么对前四个一定是再熟悉不过的了。而 == 在VB或PASCAL等中是用 = , != 则是用 not 。由于工作关系我自己要使用好几种的程序语言,所以有时也会头晕搞错。老了咯 :P 小学时的数学课就教授过运算符是有优先级别的,计算机的语言也不过是人类语言的一种扩展,这里的运算符同样有着优先级别。前四个具有相同的优先级,后两个也具有相同的优先级,但是前四个的优先级要高于后2个的。 当两个表达式
[单片机]
解决RS-232长距离串行通信的一种实用方法
1 引言 RS-232串行通信是早期为促进公共电话网络通信而制定的标准,是目前异步通信中应用最广的标准总线,适用于数据终端设备和数据通信设备之间的接口。图1所示为RS-232串行通信的简单示意图。然而,由于发送器(TXD)和接收器(RXD)之间具有公共信号地(GND),因此不能使用双端信号,这样可能会使共模噪声耦合到信号系统中。因此,设计者不得不使用较高传输电压进行传输,另外,这种传输方式的信号传输速度最高为20kB/s,最长距离仅为15m。显然这样的传输速度和距离已不能适应现代网络通信的要求,为了使许多自身带有RS-232通信接口的设备能够在尽量降低硬件成本和减轻软件工作量的情况下实现长距离串行通信,笔者开发了一种利用电流环同
[工业控制]
51单片机入门 - 自己动手搭建实验板
前面介绍了几种准备实验板的方案。这里先介绍方案一,我将同大家一起搭建一块简易的单片机实验板,一起感受动手实践的乐趣。 我们有两种自己搭建实验板的方案,一是用面包板,二是用万用焊板。本篇我们介绍面包板搭建电路。 面包板和面包板线 面包板是一种用于电路实验的器材,上面有很多孔,我们可以将元器件和导线插进去,组成我们需要的电路。如果发现电路有错,拔下元件和导线重新插接即可。电路做完后,所有元件还可以拔下来再次使用。 面包板搭建电路简单易行,节省时间和材料。但是缺点在于,面包板只能搭建一些比较简单的电路,而且是对电气连接要求不高的电路。如果电路太复杂,面包板上全是各种导线,出现某些导线或元件松动的情况,不容易找到;有些电
[单片机]
8051单片机中DPTR的扩展设计
摘要 首先对比分析在执行大规模数据转移时,传统8051单片机和进行DPTR扩展后的8051单片机在数据转移执行效率上的差别。通过详细分析DPTR操作所涉及的因素,具体实现对DPTR的扩展,并进行实际仿真测试。 关键词 8051单片机 DPTR 数据转移执行效率 单片机的出现是计算机技术发展史上的一个里程碑,它使计算机从海量数值计算进入到控制领域。在单片机中,以8051系列最为经典,至今仍是最普及、广泛使用的8位MCU架构。业界许多技术人员在其基础上不断进行性能扩展,使得8051系列芯片不断完善,从而形成一个庞大的体系。在传统的 8051 系列单片机中,设置了一组双字节寄存器(数据指针DPTR),用于访问外接的64 KB数据
[工业控制]