单片机多机通信课程设计

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

1设计任务
多机串行通信的设计基本任务
1.设计三个以上单片机实现主从式串行通信的系统,主机发送数据到指定站号的从机端,也可以群发到所有从机端,并在LED数码管上显示。

2.可通过接在主机上的键盘输入数据,通过主机发送到从机。

3.从机也可输入数据,并可在查询到主机空闲时将数据发送给主机。

4*.从机间可相互通信(从机—)主机 另一从机),通信协议遵从modbus规范。

4@. 其他功能(创新部分)
仿真模块例
2设计方案
2.1设计任务
本文在参考了现在普遍的多机通信系统的基础上,设计了一种基于51单片机STC89C51的多机通信系统。

在proteus上设计并仿真电路图。

进入proteus程序仿真,启动程序系统,首先主机通过按键选择准备通信的从机,接通后,主机通过矩阵键盘上的数字按键与从机通信,使从机上的数码管显示对应的数字,以此实现多机通信。

如,与2号机通信并传输“8”这个数字。

首先主机从选择从机按键上按“2号机”键,与2号机连通后按下主机矩阵键盘上的“8”键,对应的2号机数码管上会显示数字“8”,证明通信成功。

2.2串行通信简介
串行通信可以分为同步通信和异步通信两类。

同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。

这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。

它们均由同步字符、数据字符和校验字符(CRC)组成。

其中同步字符位于帧开头,用于确认数据字符的开始。

数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。

同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。

异步通信中,在异步通行中有两个比较重要的指标:字符帧格式和波特率。

数据通常以字符或者字节为单位组成字符帧传送。

字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。

发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。

接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。

串口通信最重要的参数是波特率、起始位、数据位、停止位和奇偶校验。

波特率:是一个衡量通信速度的参数,表示每秒钟传送的bit的个数。

起始位:当通信线上没有数据被传送时处于逻辑“1”状态,当发送设备要发送一个数据时,先发送一个逻辑“0”信号,这个低电平就是起始位,起始位通过通信线传向接收设备,接收端检测到这个低电平后,就确认开始接收数据了。

起始位的作用是使通信双方在传送数据前协调同步。

数据位:是衡量通信中实际数据位的参数,当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7或8位,如何设置取决于要传送的信息。

每个包是指一个字节,包括开始/停止位、数据位和奇偶校验位,由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

停止位:用于表示单个包的最后一位。

典型的值为1、1.5和2位,它是一个数据的结束标志,接收端接收到停止位后,通信线路上会回复逻辑“1”的状态,知道下一个起始位的到来。

奇偶校验位:在串行通信中一种简单的检错方式,有四种方式:偶、奇、高和低。

对于偶和检验的情况,串口会设置检验位,用一个值确保传输的数据有偶个或者奇个逻辑高位。

高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验,这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

3.系统硬件设计
3.1接口设计
MCS-51单片机具有多机通信功能,利用它可以构成分布式系统,电路结构如图3.1所示
图3.1电路结构
本设计单片机之间通过串口进行通信,主机通过按键来选择要进行通信的从机,进而通过按键控制从机的数码管显示数字。

数码管与单片机的连接方式采用并行连接方式。

系统设计框图如图3.2所示:
图3.2系统设计框图
3..2主机电路模块设计
3.2.1 单片机简介
AT89C51单片机内部主要由9个部件组成:1个8位中央处理器;4KBFlash存储器;128B的数据存储器;32条I/O口线;2个定时器/计数器;1个具有6个中断源、4个优先级的中断嵌套结构;用于多处理机通信、I/O扩展或全双工UART的串行口;特殊功能寄存器;1个片内振荡器和时钟电路。

A T89S51系列单片机完全继承了MCS-51的指令系统,共有111条指令,按其功能可分为五大类:数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令、布尔操作。

A T89C51单片机引脚如图3.3所示。

图3.3AT89C51单片机引脚图
管脚说明:
P0口:8位、漏极开路的双向I/O 口。

P0能够用于外部程序数据存储器。

它可以被定义为数据/地址的第八位。

P0口在应用时必须外接上拉电阻,作为输入时,首先应将引脚置1。

P1口:8位双向I/O 口,内部含上拉电阻。

作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。

P2口:8位双向I/O 口,内部含上拉电阻。

作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。

P3口:8位双向I/O 口,内部含上拉电阻。

作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。

P3口除了通用I/O 口功能外,还有第二功能。

P3口的第二功能定义如表3.4所示。

引脚定义 功能 引脚定义 功能 P3.0-RXD 串行输入口 P3.1-TXD 串行输出口 P3.2-0INT 外部中断0 P3.3-1INT 外部中断1 P3.4-T0 计时器0外部输入 P3.5-T1 计时器1外部输入 P3.6-WR
外部数据存储器写选通
P3.7-RD
外部数据存储器读选通
表3.4 P3口第二功能定义
RST :复位输入,低电平有效。

ALE/PROG :地址锁存允许信号输出。

在正常操作状态下,该引脚端口输出恒定频率的脉冲。

其频率为晶振频率的1/6,可用作外部定时或其他触发信号。

如果需要,可通过SFR 的第0位置禁止ALE 操作,但ALE 的禁止位不影响对外部存储器的访问。

PSEN :片外程序存储器选通信号,低电平有效。

当A T89S51执行来自外部程序存储
器的指令代码时,PSEN/每个机器周期两次有效。

在访问外部数据存储器时,PSEN/无效。

VPP
EA/:EA片外程序存储器访问允许信号,低电平有效。

XTAL1:外接晶振。

在单片机内部是反相放大器的输入及端。

XTAL2:外接晶振。

在单片机内部是反相放大器的输出端,输入到内部时钟发生器。

3.2.2 主机控制电路
该部分电路设计如图3.5所示。

单片机的时钟的频率直接影响着单片机的速度和系统的稳定性。

AT89S51片内由一个反相放大器构成振荡器,可以通过XTAL1和XTAL2产生时钟。

常用的单片机产生时钟的方法有两种:内部时钟方式和外部时钟方式。

本设计选用外部时钟方式,单片机内部XTAL1引脚为高增益反向放大器的输入端,XTAL2为输出端,在这2个引脚之间接石英晶振和电容,就可以构成一个稳定的自激振荡器。

本设计选用的11.05926MHz的晶振。

复位是单片机的初始化操作,复位信号是高电平有效,复位操作有上电自动复位、按键电平复位、外部脉冲复位和自动复位四种方式。

在本设计中复位电路采用按键电平方式,使RST 引脚经过10u电解电容与VCC电源接通,同时经过电阻与地连接而实现,按下按键时,RST 引脚置高,实现复位功能。

单片机的P1口控制矩阵键盘电路,P0口控制数码管段码,P3.4 P3.5分别控制两个数码管的位选。

图3.5主机控制电路
3.3从机电路模块
本设计共设置2路从机,2路从机的电路设计和实现的功能是一样的,所以这里只介绍其中一路从机的电路设计。

从机电路如图3.6所示。

P0口控制数码管显示。

半导体数码管的每个线段都是一个发光二极管(Light Emitting Diode,简称LED),因而也把它叫做LED数码管或LED七段显示器。

半导体数码管不仅具有工作电压低、体积小、寿命长、可靠性高等优点,而且响应时间短(一般不超过0.1us),亮度也比较高。

LED数码管由八只发光二极管组成,编号是a、b、c、d、e、f、g、h,分别和同名管脚相连,当发光二极管导通时发光。

每个二极管就是一个笔划,若干个二极管发光时,就构成一个显示字符。

若将单片机的I/O口与数码管的a-g和h相连,高电平(对应共阴极数码管)或低电平(对应共阳极数码管)的位对应的发光二极管就会亮,这样,I/O口输出不同的代码就可以控制数码管显示不同的字符。

由于本设计只用了一个数码管显示数字0-9,所以直接将数码管的8个段码引脚连接至单片机的引脚上,利用单片机的引脚输出要显示的数字的代码,P2.0 P2.1控制数码段位选。

图3.6从机电路
3.4矩阵键盘电路
矩阵键盘电路如图3.7所示。

单片机的P1口控制矩阵键盘。

本设计采用4*4矩阵键盘。

矩阵键盘的行线接P1.0-P1.3引脚,列线接P1.4-P1.7引脚。

将P1.0-P1.3引脚置为高电平,P1.4-P1.7引脚依次置为低电平,当按键没有按下时,P1.0-P1.3口各引脚状态不变,一旦有按键按下,则P1.0-P1.3就会有引脚变为低电平,这样,通过读入P1.0-P1.3的状态就可得知是哪一个按键按下了,然后单片机根据该按键代表的功能执行相应的程序。

图3.7矩阵键盘电路
4系统软件设计
4.1软件设计应用环境
本设计软件的设计是在Keil C51的环境下编译的。

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

Keil C51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效、快速的特点。

C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。

C51已被完全继承到μVsion2的集成开发环境中,这个集成开发环境包含:编译器、汇编器、实时操作系统、项目管理器、调试器。

μVsion2 IDE可为它们提供单一而灵活的开发环境。

C51 V7版本是目前最高效、灵活的8051开发平台。

它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。

因此,C51 V7版本无疑是8051开发用户的最佳选择。

Keil C51编译器
在遵循ANSI标准的同时,为8051微控制器系列特别设计,语言上的扩展能让用户使用应用中的所有资源。

(1)存储器和特殊功能寄存器的存取。

C51编译器可以实现对8051系列所有资源的操作。

SFR的存取由sfr和sbit两个关键字来提供。

变量可旋转到任一个地址空间。

用关键字-at-还能把变量放入固定的存储器。

存储模式决定了变量的存储类型。

连接定位器支持的代码区可达32个,这就允许用户在原有64K ROM的8051基础上扩展程序。

在V2的编译器和许多高性能仿真器中,可以支持应用程序的调试。

(2)中断功能。

C51允许用户使用C语言编写中断服务程序,快速进、出代码和寄存器区的转换功能使C语言中断功能更加高效。

可再入功能是用关键字来定义呃。

多任务、中断或非中断的代码要求必须具备可再入功能。

(3)灵活的指针。

C51提供了灵活高效的指针。

通用指针用3个字节来存储存储器类型及目标地址,可以在8051的任意存储区内存取任何变量。

特殊指针在声明的同时已制定了存储器类型,指向某一特定的存储区域。

由于地址的存储只需1-2字节,因此,指针存取非常迅速。

4.2软件设计流程
系统软件分为两个部分,主机软件设计和从机软件设计。

主机软件设计流程图如图4.1所示。

图4.1 主机软件设计流程图
从机软件设计流程图如图4-2所示。

图4.2 从机软件设计流程图
4.3按键程序设计
单片机读取按键值的方法有两种:查询方式和中断方式。

查询方式是利用键盘程序不断查询是否有按键按下,有按下则进入相应按键的子程序进行数据处理,没有则一直循环查询;中断方式是将按键动作与单片机的中断系统联系起来,有按键按下时,就引起单片机中断,使系统进入中断处理程序。

本设计采用查询方式来处理读取按键值程序。

程序如附录。

4.4串口通信
AT89S51的串行口是一个全双工的异步串行通信口,可以同时进行接收数据和发送数据,因为口内的接受缓冲器和发送缓冲器在物理上是隔离的,即是完全独立的。

可以通过访问特殊功能寄存器SBUF,来访问接收缓冲器和发送缓冲器。

接收缓冲器还具有双缓冲的功能,即它在接收第一个数据字节后,能接受第二个数据字节,但是,在它完成接收第二个数据字节之后,若第一个字节仍未取走,那么该字节数据将丢失。

对串行口的控制主要包括对状态控制寄存器SCON、控制寄存器PCON、和串行数据寄存器SBUF的设置。

1、状态控制寄存器SCON:SCON是一个逐位定义的8位寄存器,由它控制串行通信的方式选择、接收和发送,指示串行口的状态。

寄存器SCON既可字节寻址也可位寻址,字节
地址为98H,位地址为98H-9FH。

其格式如下表4-1所示:
表4.3 SCON地址格式
SM0,SM1:串行口工作方式选择位;
SM2:允许方式2、3中的多处理机通信位;
REN:允许串行接收位,置位时,允许串行接收,清除时,禁止串行接收,可用软件置位/清除;
TB8:方式2和方式3中要发送的第9位数据,可用软件置位/清除;
RB8:方式3和方式3中接收的第9位数据。

方式1中接收的是停止位,方式0中不使用这一位。

TI:发送中断标志位,硬件置位,软件清除。

方式0中,在发送第8位末尾置位,在其他方式时,在发送停止位开始时设置;
RI:接收中断标志位。

硬件置位,软件清除。

方式0中,在接收第8位末尾置位,在其他方式时,在接收停止位中间设置。

2、控制寄存器PCON:PCON是一个逐位定义的8位寄存器,目前仅有几位有定义,其中
表4.4 PCON地址格式
SMOD:串行通信波特率系数控制位,当SMOD=1时,使波特率加倍。

寄存器PCON 的地址为87H,只能字节寻址。

3、串行数据寄存器SBUF:SBUF包含在物理上隔离的两个8位寄存器:发送数据寄存器和
表4.5 数据寄存器格式
串行口控制寄存器SCON中的SM2为方式2或方式3的多机通信控制位,当串行口以方式2或方式3工作时,若SM2程控位为1,此时只有当串行口就收到的第9位数据RB8=1时,才置1中断标志RI,若接收到的RB8=0,则不产生中断标志,应用MCS-51串行口的这个标志,便可实现多机通信。

在一个多机系统中有一个主机和二个从机组成的多机系统,从机的地址分别为00H,01H,从机系统由初始化程序将串行口编程为方式2或方式3接收,即9位异步通信方式,且置“1”SM2和REN,允许串行口中断。

在主机和某一个从机通信之前,先将从机地址发送给各个从机系统。

接着才传送数据或命令,主机发出的地址信息的第9位为1,数据(包括命令)信息的第9位为0,当主机向各从机发送地址时,各从机的串行口接收到的第9位的信息RB8为1,置“1”RI中断标志位,各从机80C51响应中断,执行中断服务程序。

在中断服务程序中,判断主机送来的地址是否和本机地址相符合,若为本机的地址,则清“0”SM2位,准备接收主机的数据或命令;若地址不相符,则保持SM2=1状态。

接着主机发送数据,此时各个从机串行口接收到的RB8=0;只有与前面地址相符合的从机系统(即已清“0”SM2位的从机)才能激活中断标志位RI,从而进入中断服务程序,在中断服务程序中接收主机的数据或执行主机的命令,实现和主机的信息传送;其他的从机因SM2保持为1,又RB8=0不激活中断标志RI,所接收的数据丢失不作处理,从而保证了主机和从机间通信的正确性。

本次设计多机系统为主从式,由主机控制多机之间的通信,从机和从机之间的通信只能经主机才能实现。

串口发送数据程序如程序如附录。

4.5从机数码管显示程序设计
根据数码管的驱动方式不同,数码管送显方式有两种:静态送显和动态送显。

静态显示驱动:静态驱动也称直流驱动,在静态显示驱动方式下,数码管的共阴极或共阳极共同接地或接电源,每个数码管的段选线与8位的单片机并口连接。

静态显示驱动方式占用的单片机I/O端口比较多,一般在实用中不采用。

动态显示驱动:数码管动态显示方式是将所有的段选线并联在一起,由一个8位I/O口来控制,再利用单片机的其他I/O口来作为数码管的位选线。

当单片机输出显示数字的译码时,哪个数码管显示由单片机对位选通电路的控制来选择,所以将欲显示的数码管的位选通端选通,该数码管就会显示,其它数码管均不会亮。

通过轮流控制各个数码管的选通端使数码管轮流显示。

在显示过程中,每个数码管的显示时间为1-2ms,由于人们的视觉暂留现象及发光二极管的余晖效应,只要扫描的速度够快,给人的印象就是同时点亮的,而且不会有闪烁感。

本设计中需要2位数码管显示,采用动态显示方式。

程序如附录。

5仿真与性能分析
5.1系统仿真过程
首先根据电路原理图利用Protues软件画出仿真图。

打开proteus软件,将所需要用到的元器件添加到左侧的元器件列表DEVICE中。

单击按钮“P”,即可弹出元器件库对话框,可以从中选择元器件。

输入元器件名称,可以选择所用元器件,选中后,单击“OK”即可。

选完元器件后,在元器件列表里回显示出来。

按照电路原理图将仿真图画好,如图5.1所示。

图5.1仿真图
5.2仿真结果
运行后,按下主机1号键,开始主机与1号从机通信。

再按下数字2,从机数码管显示12。

效果如图5.2,5.3所示。

图5.2主机数码显示
图5.3从机数码显示
6心得体会
在本次毕业设计,我通过基于典型单片机AT89C51的设计和应用,对于单片机工作原理、功能有了宏观的了解,并对单片机汇编程序的应用有了新的、进一步的认识。

在本次设计的过程中,我发现很多的问题,给我的感觉就是下手很难,很不顺手,看似很简单的电路,要动手把它给设计出来,是很难的一件事,主要原因是我们没有经常动手设计过电路。

另外单片机系统的知识似懂非懂,而且很多知识当时弄明白了,现在要用的时候又不记得,造成我用了大量的时间去查阅各种资料和程序命令,因此整个过程时间安排不合理。

由于设计的计划没有安排好,设计的时间极为仓促,尤其是在硬件调试的过程中出现了很大的问题。

另外资料的查找也是一大难题,这就要求我们在以后的学习中,应该注意到这一点,更重要的是我们要学会把从书本中学到的知识和实际的电路联系起来,这不论是对我们以后
的就业还是学习,都会起到很大的促进和帮助。

本文介绍了一种基于单片机的多机通信的设计方法,论文首先介绍了多机通信的应用及研究现状、串口通信的概念,主要是串口通信的方式和重要的数据位说明,接着提出了利用串口通信实现多机通信的可行的设计方案,并从硬件电路设计和软件程序设计两个方面详细介绍了整个设计的原理及设计过程,最后完成了系统的仿真调试,可成功运行,从而验证了方案的可行性。

当然,本设计还有很多不足之处,功能上还不够完善,在此基础上还可以进行系统扩展,以使整个设计的功能更加完善
参考文献
[1] 谢沅清,解月珍.电子技术基础.人民邮电出版社,1999.
[2] 何立民. 单片机应用技术选编. 北京航空航天大学出版社,2006.
[3] 谭浩强.C程序设计(第二版).清华大学出版社,2001.1.
[4] 张毅刚,彭喜源.MCS-51单片机应用设计.哈尔滨工业大学出版社,1997.
[5] 胡汉才.单片机原理及接口技术.清华大学出版社,1996.
[6] 孙江宏等. Protel 99 电路设计与应用.机械工业出版社,2001.2.
[7] 黄亮.基于AT89C51单片机的串口通信程序的设计.电子制作,2006年07期.
[8] 刘锡东,黄丽民.用C语言实现串口通信技术.山东商业职业技术学院学报,2007年02期.
[9] 栗小宽,韩东起,李霞.51系列单片机中模拟串行口的C语言实现.科技咨询导报,2007年17期.
[10] 禹言春,张丽丽,王贺涛.单片机的多机通信.安徽农学通报,2007年09期.
[11] 郭天祥.新概念51单片机C语言教程:入门、提高、开发、拓展全攻略.北京:电子工业出版社,2009
[12]彭伟.单片机C语言程序设计实训100例.电子工业出版社,2011
[13]杜洋.爱上单片机.人民邮电出版社,2012
[14]于永.51单片机C语言常用模块与综合系统设计.电子工业出版社,2012
[15]高卫东.51单片机原理与实践.北京航空航天大学出版社,2011
[16]潘永雄.新编单片机原理及应用.西安电子科技大学出版社,20
系统原理图
C程序
主机程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P3^4;
sbit LED2=P3^5;
sbit MCU1=P2^2;
sbit MCU2=P2^3;
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c}; uchar keyscan(void);
void delayms(uchar t);
void init_serial(void);
void SBUFSend(uchar key);
void senddat(uchar addr,uchar dat);
void display(uchar addr,uchar dat);
uchar keyscan()
{
uchar temp,key;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break;
case 0x7e:key=3;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:key=4;break;
case 0xdd:key=5;break;
case 0xbd:key=6;break;
case 0x7d:key=7;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:key=8;break;
case 0xdb:key=9;break;
case 0xbb:key=10;break;
case 0x7b:key=11;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:key=12;break;
case 0xd7:key=13;break;
case 0xb7:key=14;break;
case 0x77:key=15;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
return key;
}
void delayms(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
for(j=0;j<110;j++);
}
void init_serial(void)
{
TMOD=0X20;
TH1=0XFA;
TL1=0XFA;
PCON=0X80;
SCON=0X50;
TR1=1;
ES=1;
EA=1;
}
void SBUFSend(uchar key)
{
SBUF=key;
while(TI==0);
TI=0;
}
void senddat(uchar addr,uchar dat) {
TB8=1;
SBUFSend(addr);
TB8=0;
SBUFSend(dat);
}
void display(uchar addr,uchar dat) {
P0=tab[addr];
LED1=0;
LED2=1;
delayms(1);
P0=0x00;
P0=tab[dat];
LED1=1;
LED2=0;
delayms(1);
P0=0X00;
}
void main()
{
char addr,dat;
init_serial();
dat=keyscan();
while(1){
if(MCU1==0)
{
addr=1;
dat=keyscan();
senddat(1,dat);
display(1,dat);
}
if(MCU2==0)
{
addr=2;
dat=keyscan();
senddat(2,dat);
display(2,dat);
}
}
}
void serial_int() interrupt 4
{
if(RI==1)
{
RI=0;
}
else TI=0;
}
从机1程序:
#include <reg52.h>
#define uchar unsigned char
sbit LED1=P2^0;
sbit LED2=P2^1;
uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //---------------------------------
void SerialInit()
{
SCON=0xf0; //方式3 允许接收,SM2=1
PCON=0x00; //串口波特率不加倍
TMOD=0x20; //定时器1,方式2
TH1=0xfd; //波特率为9600
TL1=0xfd;
TR1=1; //启动定时器
ES=1;
EA=1;
}
//-------------------------------
void SBUFSend(uchar Ch)
{
SBUF=Ch;
while(TI==0)
{
}
TI=0;
}
//--------------------------------
void main()
{
SerialInit();
while(1)
{
}
}
//--------------------------------
void SerialServer() interrupt 4
{
uchar Ch;
if(RI==1)
{ uchar i;
RI=0;
Ch=SBUF;
if(RB8==1)
{
if(Ch==1)
{
SM2=0;
SBUFSend(1);
LED1=0;
LED2=1;
for(i=500;i>0;i--)
P0=DispCode[Ch];
}
else
{
SM2=1;
}
}
if(RB8==0)
{ P0=0x00;
LED1=1;
LED2=0;
for(i=500;i>0;i--)
P0=DispCode[Ch];
SM2=1;
}
}
}
从机2程序:
#include <reg52.h>
#define uchar unsigned char
sbit LED1=P2^0;
sbit LED2=P2^1;
uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //---------------------------------
void SerialInit()
{
SCON=0xf0; //方式3 允许接收,SM2=1
PCON=0x00; //串口波特率不加倍
TMOD=0x20; //定时器1,方式2
TH1=0xfd; //波特率为9600
TL1=0xfd;
TR1=1; //启动定时器
ES=1;
EA=1;
}
//-------------------------------
void SBUFSend(uchar Ch)
{
SBUF=Ch;
while(TI==0)
{
}
TI=0;
}
//--------------------------------
void main()
{
SerialInit();
while(1)
{
}
}
//--------------------------------
void SerialServer() interrupt 4 {
uchar Ch;
if(RI==1)
{ uchar i;
RI=0;
Ch=SBUF;
if(RB8==1)
{
if(Ch==2)
{
SM2=0;
SBUFSend(2);
LED1=0;
LED2=1;
for(i=500;i>0;i--)
P0=DispCode[Ch];
}
else
{
SM2=1;
}
}
if(RB8==0)
{ P0=0x00;
LED1=1;
LED2=0;
for(i=500;i>0;i--)
P0=DispCode[Ch];
SM2=1;
}
}
}。

相关文档
最新文档