《单片机多机通信课程设计.doc》由会员分享,可在线阅读,更多相关《单片机多机通信课程设计.doc(24页珍藏版)》请在三一办公上搜索。
1、课程设计量化评分标准指标分值评分要素得分方案设计20方案选择合理,分析、设计正确,原理清楚,电路、程序流程图清晰,结构合理,程序简洁、正确。设计报告20报告结构严谨,逻辑严密,论述层次清晰,语言流畅,表达准确,重点突出,报告完全符合规范化要求,用计算机打印成文。调试与结果20过程清晰,调试方案设计合理,测试点选择适当,程序编写正确,调试步骤清楚。电路及程序运行结果正确,达到预期效果。工作态度20工作量饱满程度,题目难度;工作态度,按时完成设计任务,是否独立完成等。答辩成绩20思路清晰;语言表达准确,概念清楚,论点正确;分析归纳合理,结论严谨;回答问题有理论根据,基本概念清楚。总 评 成 绩答辩
2、记录指导老师评语:1、例举设计过程中遇到的问题及其解决方法(至少两例)。答:(1)问题说明:程序编译没有问题,但是下载到单片机里边没有实现通信的功能。 解决方法:在proteus中找到VIRTUAL TERMINAL,直接接到主机的RXD,TXD端口,检测故障问题,确定是主机发送出了问题还是从机接收出了问题,最后发现是主机信息没有发送出去,主机源程序出了问题。(2)问题说明:仿真时数码管不亮。 解决方法:经检查发现,数码管接在了单片机P0口,没有接上拉电阻,最后加上上拉电阻后,数码管正常工作了。2、教师现场提的问题记录在此(不少于2个问题)。答:摘 要随着电子技术的发展和微处理器技术的应用,带
3、有单片机的智能型测控系统的应用越来越广泛,多个单片机系统之间数据传输已经应用于工业、科研、农业等领域,而单片机之间的数据通信最常用的就是串口通信方式,串口通信可以在使用一根线发送数据的同时利用另一根线接收数据,使用简单且能实现远距离通信。本文介绍了一种单片机多机通信的设计方法,主机与从机之间通过串口实现通信,主机通过按键来选择要进行通信的从机,然后通过数字矩阵键盘控制从机的数码管显示数字0-9,同时该从机返回自己的地址,实现全双工通信。本文介绍的方法简单易懂,通过仿真基本上实现了上述功能,操作简单,性能稳定,可广泛应用于各种多机通信系统中。关键词:单片机;串口通信;C语言;矩阵键盘目 录1设计
4、任务12设计方案1 2.1设计任务1 2.2串行通信简介23.系统硬件设计2 3.1接口设计2 3.2主机电路模块设计3 3.3从机电路模块5 3.4矩阵键盘电路64系统软件设计6 4.1软件设计应用环境6 4.2软件设计流程7 4.3按键程序设计8 4.4串口通信8 4.5从机数码管显示程序设计105仿真与性能分析10 5.1系统仿真过程10 5.2仿真结果106心得体会11参考文献12附录1系统原理图12附录2程序清单131设计任务多机串行通信的设计基本任务1. 设计三个单片机实现主从式串行通信的系统,主机发送数据到从机,并在LED数码管上显示。2. 可通过接在主机上的键盘输入数据,通过主
5、机发送到从机。 选做3. 通信协议遵从modbus。4其他功能(创新部分)仿真模块例 2设计方案2.1设计任务本文在研究传统的多机通信系统的基础上,设计了一种基于MCS51系列单片机AT89C51的多机通信系统。打开proteus仿真电路图,按下软件下方的“开始”图标,启动系统,按下“1号机”按键,主机与从机1接通,通过主机外接的4*4矩阵键盘控制从机1的数码管,按下标号为0-9的按键时,对应从机1的数码管显示0-9,按下“2号机”按键,主机与从机2接通,通过主机外接的4*4矩阵键盘控制从机2的数码管,按下标号为0-9的按键时,对应从机2的数码管显示0-9。系统分析2.2串行通信简介串行通信可
6、以分为同步通信和异步通信两类。同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。它们均由同步字符、数据字符和校验字符(CRC)组成。其中同步字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。异步通信中,在异步通行中有两个比较重要的指标:字符帧格式和波特率。数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备
7、逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。接收端检测到传输线上发送过来的低电平逻辑0(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。串口通信最重要的参数是波特率、起始位、数据位、停止位和奇偶校验。波特率:是一个衡量通信速度的参数,表示每秒钟传送的bit的个数。起始位:当通信线上没有数据被传送时处于逻辑“1”状态,当发送设备要发送一个数据时,先发送一个逻辑“0”信号,这个低电平就是起始位,起始位通过通信线传向接收设备,接收端检测到这个低电平后,就确认开始接收数据了。起始位的作用是使
8、通信双方在传送数据前协调同步。数据位:是衡量通信中实际数据位的参数,当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7或8位,如何设置取决于要传送的信息。每个包是指一个字节,包括开始/停止位、数据位和奇偶校验位,由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。停止位:用于表示单个包的最后一位。典型的值为1、1.5和2位,它是一个数据的结束标志,接收端接收到停止位后,通信线路上会回复逻辑“1”的状态,知道下一个起始位的到来。奇偶校验位:在串行通信中一种简单的检错方式,有四种方式:偶、奇、高和低。对于偶和检验的情况,串口会设置检验位,用一个值确保传输的数据有偶个或者奇
9、个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验,这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。3.系统硬件设计3.1接口设计MCS-51单片机具有多机通信功能,利用它可以构成分布式系统,电路结构如图3.1所示主机控制电路显示电路串口从机1从机2显示电路显示电路图3.1电路结构本设计单片机之间通过串口进行通信,主机通过按键来选择要进行通信的从机,进而通过按键控制从机的数码管显示数字。 数码管与单片机的连接方式采用并行连接方式。系统设计框图如图3.2所示:主机单片机矩阵键盘数码管串口从机1单片机从机2单片机数码管数码管图
10、3.2系统设计框图3.2主机电路模块设计3.2.1 单片机简介AT89C51单片机内部主要由9个部件组成:1个8位中央处理器;4KBFlash存储器;128B的数据存储器;32条I/O口线;2个定时器/计数器;1个具有6个中断源、4个优先级的中断嵌套结构;用于多处理机通信、I/O扩展或全双工UART的串行口;特殊功能寄存器;1个片内振荡器和时钟电路。AT89S51系列单片机完全继承了MCS-51的指令系统,共有111条指令,按其功能可分为五大类:数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令、布尔操作。AT89C51单片机引脚如图3.3所示。图3.3AT89C51单片机引脚图管
11、脚说明:P0口:8位、漏极开路的双向I/O口。P0能够用于外部程序数据存储器。它可以被定义为数据/地址的第八位。P0口在应用时必须外接上拉电阻,作为输入时,首先应将引脚置1。P1口:8位双向I/O口,内部含上拉电阻。作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。P2口:8位双向I/O口,内部含上拉电阻。作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。P3口:8位双向I/O口,内部含上拉电阻。作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。P3口除了通用I/O口功能外,还有第二功能。P3口的第二功能定义如表3.
12、4所示。引脚定义功能引脚定义功能P3.0-RXD串行输入口P3.1-TXD串行输出口P3.2-外部中断0P3.3-外部中断1P3.4-T0计时器0外部输入P3.5-T1计时器1外部输入P3.6-外部数据存储器写选通P3.7-外部数据存储器读选通表3.4 P3口第二功能定义RST:复位输入,低电平有效。ALE/PROG:地址锁存允许信号输出。在正常操作状态下,该引脚端口输出恒定频率的脉冲。其频率为晶振频率的1/6,可用作外部定时或其他触发信号。如果需要,可通过SFR的第0位置禁止ALE操作,但ALE的禁止位不影响对外部存储器的访问。:片外程序存储器选通信号,低电平有效。当AT89S51执行来自外
13、部程序存储器的指令代码时,PSEN/每个机器周期两次有效。在访问外部数据存储器时,PSEN/无效。:片外程序存储器访问允许信号,低电平有效。XTAL1:外接晶振。在单片机内部是反相放大器的输入及端。XTAL2:外接晶振。在单片机内部是反相放大器的输出端,输入到内部时钟发生器。3.2.2 主机控制电路该部分电路设计如图3.5所示。单片机的时钟的频率直接影响着单片机的速度和系统的稳定性。AT89S51片内由一个反相放大器构成振荡器,可以通过XTAL1和XTAL2产生时钟。常用的单片机产生时钟的方法有两种:内部时钟方式和外部时钟方式。本设计选用外部时钟方式,单片机内部XTAL1引脚为高增益反向放大器
14、的输入端,XTAL2为输出端,在这2个引脚之间接石英晶振和电容,就可以构成一个稳定的自激振荡器。本设计选用的11.05926MHz的晶振。复位是单片机的初始化操作,复位信号是高电平有效,复位操作有上电自动复位、按键电平复位、外部脉冲复位和自动复位四种方式。在本设计中复位电路采用按键电平方式,使RST引脚经过10u电解电容与VCC电源接通,同时经过电阻与地连接而实现,按下按键时,RST引脚置高,实现复位功能。单片机的P1口控制矩阵键盘电路,P0口控制数码管段码,P3.4 P3.5分别控制两个数码管的位选。图3.5主机控制电路3.3从机电路模块本设计共设置2路从机,2路从机的电路设计和实现的功能是
15、一样的,所以这里只介绍其中一路从机的电路设计。从机电路如图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相连,高电平(对应共阴极数
16、码管)或低电平(对应共阳极数码管)的位对应的发光二极管就会亮,这样,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口各引脚状态不
17、变,一旦有按键按下,则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编译器的功能不断增强,使你可以更加
18、贴近CPU本身,及其它的衍生产品。C51已被完全继承到Vsion2的集成开发环境中,这个集成开发环境包含:编译器、汇编器、实时操作系统、项目管理器、调试器。Vsion2 IDE可为它们提供单一而灵活的开发环境。C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。Keil C51编译器在遵循ANSI标准的同时,为8051微控制器系列特别设计,语言上的扩展能让用户使用应用中的所有资源。(1)存储器和特殊功能寄存器的存取。C51编译器可以实现对8051系
19、列所有资源的操作。SFR的存取由sfr和sbit两个关键字来提供。变量可旋转到任一个地址空间。用关键字-at-还能把变量放入固定的存储器。存储模式决定了变量的存储类型。连接定位器支持的代码区可达32个,这就允许用户在原有64K ROM的8051基础上扩展程序。在V2的编译器和许多高性能仿真器中,可以支持应用程序的调试。(2)中断功能。C51允许用户使用C语言编写中断服务程序,快速进、出代码和寄存器区的转换功能使C语言中断功能更加高效。可再入功能是用关键字来定义呃。多任务、中断或非中断的代码要求必须具备可再入功能。(3)灵活的指针。C51提供了灵活高效的指针。通用指针用3个字节来存储存储器类型及
20、目标地址,可以在8051的任意存储区内存取任何变量。特殊指针在声明的同时已制定了存储器类型,指向某一特定的存储区域。由于地址的存储只需1-2字节,因此,指针存取非常迅速。4.2软件设计流程系统软件分为两个部分,主机软件设计和从机软件设计。主机软件设计流程图如图4.1所示。结束开始初始化确认从机编号扫描数字键通过串口向从机发送数据扫描按键接收从机发来的数据控制相应数码管显示图4.1 主机软件设计流程图从机软件设计流程图如图4-2所示。开始初始化接收串口数据数码管送显示结束图4.2 从机软件设计流程图4.3按键程序设计单片机读取按键值的方法有两种:查询方式和中断方式。查询方式是利用键盘程序不断查询
21、是否有按键按下,有按下则进入相应按键的子程序进行数据处理,没有则一直循环查询;中断方式是将按键动作与单片机的中断系统联系起来,有按键按下时,就引起单片机中断,使系统进入中断处理程序。本设计采用查询方式来处理读取按键值程序。程序如附录。4.4串口通信AT89S51的串行口是一个全双工的异步串行通信口,可以同时进行接收数据和发送数据,因为口内的接受缓冲器和发送缓冲器在物理上是隔离的,即是完全独立的。可以通过访问特殊功能寄存器SBUF,来访问接收缓冲器和发送缓冲器。接收缓冲器还具有双缓冲的功能,即它在接收第一个数据字节后,能接受第二个数据字节,但是,在它完成接收第二个数据字节之后,若第一个字节仍未取
22、走,那么该字节数据将丢失。对串行口的控制主要包括对状态控制寄存器SCON、控制寄存器PCON、和串行数据寄存器SBUF的设置。1、状态控制寄存器SCON:SCON是一个逐位定义的8位寄存器,由它控制串行通信的方式选择、接收和发送,指示串行口的状态。寄存器SCON既可字节寻址也可位寻址,字节地址为98H,位地址为98H-9FH。其格式如下表4-1所示:位地址9FH9EH9DH9CH9BH9AH99H98H位功能SM0SM1SM2RENTB8RB8TIRI表4.3 SCON地址格式SM0,SM1:串行口工作方式选择位;SM2:允许方式2、3中的多处理机通信位;REN:允许串行接收位,置位时,允许串
23、行接收,清除时,禁止串行接收,可用软件置位/清除;TB8:方式2和方式3中要发送的第9位数据,可用软件置位/清除;RB8:方式3和方式3中接收的第9位数据。方式1中接收的是停止位,方式0中不使用这一位。TI:发送中断标志位,硬件置位,软件清除。方式0中,在发送第8位末尾置位,在其他方式时,在发送停止位开始时设置;RI:接收中断标志位。硬件置位,软件清除。方式0中,在接收第8位末尾置位,在其他方式时,在接收停止位中间设置。2、控制寄存器PCON:PCON是一个逐位定义的8位寄存器,目前仅有几位有定义,其中仅最高位SMOD与串行口控制有关,其他位与掉电方式有关,其格式如表4-2所示。D7D6D5D
24、4D3D2D1D0SMOD-GF1GF0PDIDL表4.4 PCON地址格式SMOD:串行通信波特率系数控制位,当SMOD=1时,使波特率加倍。寄存器PCON的地址为87H,只能字节寻址。3、串行数据寄存器SBUF:SBUF包含在物理上隔离的两个8位寄存器:发送数据寄存器和接受数据寄存器,但是它们共用一个地址99H,其格式如下表4-3所示。D7D6D5D4DD2D1D0SD7SD6SD5SD4SD3SD2SD1SD0表4.5 数据寄存器格式串行口控制寄存器SCON中的SM2为方式2或方式3的多机通信控制位,当串行口以方式2或方式3工作时,若SM2程控位为1,此时只有当串行口就收到的第9位数据R
25、B8=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响应中断,执行中
26、断服务程序。在中断服务程序中,判断主机送来的地址是否和本机地址相符合,若为本机的地址,则清“0”SM2位,准备接收主机的数据或命令;若地址不相符,则保持SM2=1状态。接着主机发送数据,此时各个从机串行口接收到的RB8=0;只有与前面地址相符合的从机系统(即已清“0”SM2位的从机)才能激活中断标志位RI,从而进入中断服务程序,在中断服务程序中接收主机的数据或执行主机的命令,实现和主机的信息传送;其他的从机因SM2保持为1,又RB8=0不激活中断标志RI,所接收的数据丢失不作处理,从而保证了主机和从机间通信的正确性。本次设计多机系统为主从式,由主机控制多机之间的通信,从机和从机之间的通信只能经
27、主机才能实现。串口发送数据程序如程序如附录。4.5从机数码管显示程序设计根据数码管的驱动方式不同,数码管送显方式有两种:静态送显和动态送显。静态显示驱动:静态驱动也称直流驱动,在静态显示驱动方式下,数码管的共阴极或共阳极共同接地或接电源,每个数码管的段选线与8位的单片机并口连接。静态显示驱动方式占用的单片机I/O端口比较多,一般在实用中不采用。动态显示驱动:数码管动态显示方式是将所有的段选线并联在一起,由一个8位I/O口来控制,再利用单片机的其他I/O口来作为数码管的位选线。当单片机输出显示数字的译码时,哪个数码管显示由单片机对位选通电路的控制来选择,所以将欲显示的数码管的位选通端选通,该数码
28、管就会显示,其它数码管均不会亮。通过轮流控制各个数码管的选通端使数码管轮流显示。在显示过程中,每个数码管的显示时间为1-2ms,由于人们的视觉暂留现象及发光二极管的余晖效应,只要扫描的速度够快,给人的印象就是同时点亮的,而且不会有闪烁感。本设计中需要2位数码管显示,采用动态显示方式。程序如附录。5仿真与性能分析5.1系统仿真过程首先根据电路原理图利用Protues软件画出仿真图。打开proteus软件,将所需要用到的元器件添加到左侧的元器件列表DEVICE中。单击按钮“P”,即可弹出元器件库对话框,可以从中选择元器件。输入元器件名称,可以选择所用元器件,选中后,单击“OK”即可。选完元器件后,
29、在元器件列表里回显示出来。按照电路原理图将仿真图画好,如图5.1所示。图5.1仿真图5.2仿真结果运行后,按下主机1号键,开始主机与1号从机通信。再按下数字2,从机数码管显示12。效果如图5.2,5.3所示。图5.2主机数码显示图5.3从机数码显示6心得体会在本次毕业设计,我通过基于典型单片机AT89C51的设计和应用,对于单片机工作原理、功能有了宏观的了解,并对单片机汇编程序的应用有了新的、进一步的认识。在本次设计的过程中,我发现很多的问题,给我的感觉就是下手很难,很不顺手,看似很简单的电路,要动手把它给设计出来,是很难的一件事,主要原因是我们没有经常动手设计过电路。另外单片机系统的知识似懂
30、非懂,而且很多知识当时弄明白了,现在要用的时候又不记得,造成我用了大量的时间去查阅各种资料和程序命令,因此整个过程时间安排不合理。由于设计的计划没有安排好,设计的时间极为仓促,尤其是在硬件调试的过程中出现了很大的问题。另外资料的查找也是一大难题,这就要求我们在以后的学习中,应该注意到这一点,更重要的是我们要学会把从书本中学到的知识和实际的电路联系起来,这不论是对我们以后的就业还是学习,都会起到很大的促进和帮助。本文介绍了一种基于单片机的多机通信的设计方法,论文首先介绍了多机通信的应用及研究现状、串口通信的概念,主要是串口通信的方式和重要的数据位说明,接着提出了利用串口通信实现多机通信的可行的设
31、计方案,并从硬件电路设计和软件程序设计两个方面详细介绍了整个设计的原理及设计过程,最后完成了系统的仿真调试,可成功运行,从而验证了方案的可行性。当然,本设计还有很多不足之处,功能上还不够完善,在此基础上还可以进行系统扩展,以使整个设计的功能更加完善参考文献1 谢沅清,解月珍.电子技术基础.人民邮电出版社,1999.2 何立民. 单片机应用技术选编. 北京航空航天大学出版社,2006.3 谭浩强.C程序设计(第二版).清华大学出版社,2001.1.4 张毅刚,彭喜源.MCS-51单片机应用设计.哈尔滨工业大学出版社,1997.5 胡汉才.单片机原理及接口技术.清华大学出版社,1996.6 孙江宏
32、等. Protel 99 电路设计与应用.机械工业出版社,2001.2.7 黄亮.基于AT89C51单片机的串口通信程序的设计.电子制作,2006年07期.8 刘锡东,黄丽民.用C语言实现串口通信技术.山东商业职业技术学院学报,2007年02期.9 栗小宽,韩东起,李霞.51系列单片机中模拟串行口的C语言实现.科技咨询导报,2007年17期. 10 禹言春,张丽丽,王贺涛.单片机的多机通信.安徽农学通报,2007年09期.11 郭天祥新概念51单片机C语言教程:入门、提高、开发、拓展全攻略北京:电子工业出版社,200912彭伟单片机C语言程序设计实训100例电子工业出版社,201113杜洋爱上
33、单片机人民邮电出版社,201214于永51单片机C语言常用模块与综合系统设计电子工业出版社,201215高卫东51单片机原理与实践.北京航空航天大学出版社,201116潘永雄新编单片机原理及应用西安电子科技大学出版社,20附录1系统原理图附录2程序清单主机程序:#include#define uchar unsigned char#define uint unsigned intsbit LED1=P34;sbit LED2=P35;sbit MCU1=P22;sbit MCU2=P23;uchar tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7
34、f,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)ca
35、se 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;b
36、reak;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(
37、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;it;i+)for(j=0;j110;j+);void init_serial(void)TMOD=0X20;TH1=0X
38、FA;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=tabaddr;LED1=0;LED2=1; delayms(1);P0=0x00;P0=tabdat;LED1=1;LED2=0;delayms(1);P0=0X00;void
39、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 4if(RI=1)RI=0; else TI=0; 从机1程序: #include #define uchar unsigned charsbit LED1=P20;sbit LED2=
40、P21;uchar DispCode10=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f;/-void SerialInit()SCON=0xf0; /方式3 允许接收,SM2=1PCON=0x00; /串口波特率不加倍TMOD=0x20; /定时器1,方式2TH1=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 S
41、erialServer() interrupt 4uchar 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;i0;i-)P0=DispCodeCh;else SM2=1;if(RB8=0) P0=0x00;LED1=1;LED2=0;for(i=500;i0;i-)P0=DispCodeCh;SM2=1;从机2程序: #include #define uchar unsigned charsbit LED1=P20;sbit LED2=P21;uchar DispCode10=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f;/-void SerialInit()SCON=0xf0; /方式3 允许接收,SM2=1PCON=0x00; /串口波特率不加倍TMOD=0x20; /定时器1,方式2TH1=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