一设计题目:双机通信系统二实验描述:设计一个双机通信系统,实现按键数据的互发及显示功能。三实验要求:利用两片8051单片机完成双机通信(A机和B机),A、B机发至对方数据可用数码管显示,通信过程用按键控制,发送内容自定。四实验元件:ST89C51(两片)、电容(30PF*4、10UF*4)、数码管(共阳)、晶振(11.0592MHZ)、小按键等。五具体设计:1:设计介绍1.1串行通信介绍广义地讲,终端(如计算机等)与其他终端、终端与外部设备(如打印机、显示器等)之间的信息交换称为数据通信(DataCommunication)。数据通信方式有两种:串行通信和并行通信。并行通信:数据的各位同时进行传送(接收和发送),其优点是传递速度快、效率高,多用在实时、快速的场合。串行通信:数据逐位传送,优点是数据只需要一根数据线就能完成传送,联结介质简单,成本低。1.28051简介51内部结构:8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,·中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。·数据存储器(RAM):8051内部有128个8位用户数据存储单元8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。·程序存储器(ROM):8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。·定时/计数器(ROM):8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。·并行输入输出(I/O)口:8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。·全双工串行口:8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。·中断系统:8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:·时钟电路:8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。MCS-51系列单片机的内部结构示意图51引脚图:Vss(20脚):接地VCC(40脚):主电源+5VXTAL1(19脚):接外部晶体的一端。在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,对于HMOS单片机,该端引脚必须接地;对于CHMOS单片机,次XTAL2(18脚):接外部晶体的另一端。在片内它是一个振荡电路反相放大器的输出端,振荡电路的频率是晶体振荡频率。若需采用外部时钟电路,对于HMOS单片机,该引脚输入外部时钟脉冲;对于CHMOS单片机,此引脚应悬浮。引脚作为驱动端。RST(9脚):单片机刚接上电源时,其内部各寄存器处于随机状态,在该脚输入24个时钟周期宽度以上的高电平将使单片机复位(RESET)PSEN(29脚):在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作。ALE/PROG(30脚):在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作。EA/VPP(31脚):当EA端输入高电平时,CPU从片内程序存储器地址0000H单元开始执行程序。当地址超出4KB时,将自动执行片外程序存储器的程序。当EA输入低电平时,CPU仅访问片外程序存储器。在对87C51EPROM编程时,此引脚脚用于施加编程电压VPP。输入/输出引脚:(1)P0.0—P0.7(39脚—32脚)(2)P1.0—P1.7(1脚—8脚)(3)P2.0—P2.7(26脚—21脚)(4)P3.0—P3.7(10脚—17脚)1.3双击通信图2软件设计C语言程序:#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitge=P2^3;sbitshi=P2^2;sbitdeng_1=P2^0;sbitdeng_2=P2^1;voiddelay(uintz);ucharb=0;uchart=0;ucharflag;voidinit(){TMOD=0x20;计数器一工作方式2TH1=0xfd;计数器初值TL1=0xfd;SCON=0x50;串口工作方式0EX0=1;外部中1TR1=1;计数器开始计数ES=1;串口中断使能EA=1;cpu总中断}voiddisp(ucharm){switch(m){case0x00:P0=0xc0;break;case0x01:P0=0xf9;break;case0x02:P0=0xa4;break;case0x03:P0=0xb0;break;case0x04:P0=0x99;break;case0x05:P0=0x92;break;case0x06:P0=0x82;break;case0x07:P0=0xf8;break;case0x08:P0=0x80;break;case0x09:P0=0x90;break;case0x0a:P0=0x88;break;case0x0b:P0=0x83;break;case0x0c:P0=0xc6;break;case0x0d:P0=0xa1;break;case0x0e:P0=0x86;break;case0x0f:P0=0x8e;break;default:P0=0x00;}}voidextern_int0(void)interrupt0{t=P1;SBUF=t;while(!TI);TI=0;flag=1;deng_1=~deng_1;delay(100);deng_1=~deng_1;}voidserial_serve(void)interrupt4{uchara;flag++;a=SBUF;while(!RI);RI=0;b=a;deng_2=~deng_2;delay(100);deng_2=~deng_2;}voiddelay(uintz){uintx,y;for(x=0;xz;x++)for(y=0;y121;y++);}voidmain(){init();while(1){if(flag==1){shi=0;ge=1;disp(0x0f&t);delay(1);ge=0;shi=1;disp((0xf0&t)4);delay(1);}else{shi=0;ge=1;disp(0x0f&b);delay(1);ge=0;shi=1;disp((0xf0&b)4);delay(1);}}}汇编程序:程序框图:是否有中断ORG0000H开始初始化是外部中断0发送P1口的数据接收数据是串行口中断是否有中断显示数据2ms结束P2.7=0等待START:LJMPMAINORG0003HLJMPINT0_INTORG0023HLJMPUART_INTMAIN:MOVDPTR,#TABHMOVPCON,#00HMOVSCON,#50HMOVTMOD,#20HMOVTH1,#0FDHMOVTL1,#0FDHSETBTR1SETBIT0SETBEX0SETBESSETBEASETBP2.7QQ:JNBP2.7,DISSJMPQQINT0_INT:MOVA,P1MOVSBUF,AMOVR4,AJNBTI,$CLRTICLRP2.7MOVR5,#06HABC:LCALLDELAY2CPLP2.0DJNZR5,ABCRETIUART_INT:JNBRI,$CLRRIMOVA,SBUFMOVR4,ACLRP2.7MOVR5,#06HCBA:LCALLDELAY2CPLP2.1DJNZR5,CBARETIDELAY:MOVR7,#85DEL1:MOVR6,#85DEL3:NOPNOPNOPNOPNOPDJNZR6,DEL3DJNZR7,DEL1RETDIS:MOVA,R4ANLA,#0FHMOVCA,@A+DPTRMOVP0,ASETBP2.3CLRP2.2LCALLDELAYCPLP3.7MOVA,R4SWAPAANLA,#0FHMOVCA,@A+DPTRMOVP0,ASETBP2.2CLRP2.3LCALLDELAYSJMPDISTABH:DB0C0H,0F9H,0A4H,0B0HDB99H,92H,82H,0F8HDB80H,90H,88H,83HDB0C6H,0A1H,86H,8EHDELAY2:MOVR7,#255DEL2:MOVR6,#255NOPDEL4:DJNZR6,DEL4DJNZR7,DEL2RETEND4硬件连接图:六仿真:七实验心得:这次课程设计的题目比较简单,我们感觉自己完成的也比较出色。我们采用了两位动态显示的数码管,掌握了多位数码管的工作原理;我们在硬件连接完成好以后进行检测,当我们检测所有的焊点都没有问题后,让单片机发送数据,可是另外一个单片机没有显示,而且仿真也没有错误。当我们不知所措时,我们意识到可能是单片机的程序没有烧正确,于是又重新将程序烧进去,结果应证了我们的猜测是对的。我们既用了汇编程序控制通信,也用了C语言程序,两个都实现了实验的要求,只不过汇编程序的参数设定的不够理想,数码管在高频闪动,我们也研究过好长时间,但还是不能够达到我们的要求。通过两个星期的学习,我们在巩固和学习硬件知识的同时,用软件控制协调硬件实现现实功能,通过硬件完成软件的功能等方面的融会贯通,取得了一定的效果。软件编写时,对于某些指令的功能,功能模块的连接,芯片地址选择等都遇到了很大的障碍,不过我们查阅资料得到了解决,与此同时,了解了不少的问题。例如,51系列单片机具有多级中断功能,为了不至于在保护现场或恢复现场的的同时,由于CPU响应其他中断请求,而使现场破坏,一般规定,在保护和恢复现场时,CPU不响应外界的中断请求,即关中断。另外,设计中犯一些常识性的错误,对设计进程造成了一定的影响。例如,程序调试时,由于粗心录入程序时,将程序敲错,比如将0和字母O混淆,还有中文标点符号和英文标点符号混淆等。这样的错误很难发现,以至于花费了很多时间。本次设计是通过两块简单的8051单片机实现信息的串行通信。设计过程中,从双机通信背景的了解,到8051单片机具体功能的了解,从串行通信的原理的熟悉,到掌握具体串行通信在双机之间的实现;从硬件电路设计到程序编写;从硬件调试到软件模拟实现等过程,都是在自己的努力下,有条不紊地进行。这次课程设计总体来说比较简单,所以也没有太多的问题。在这次设计中,我收获不少东西,也遇到了不少的问题。首先,在完成单片机课程学习任务后,对内容的掌握不够,缺乏灵活运用的能力,对于知识的扩展也存在一定的问题,因此,初面对设计课题,无法系统地进行设计思路的拟定。通过本次课程设计,不仅使理论知识得到了实践,有效巩固了知识。同时