单片机通信文档.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机通信文档

微机与外部的信息交换称为通信,基本方式有并行与串行两种。本设计主要采用串行方式,主要掌握微机串行通信的连接方法,运用keil3编程实现其工作过程,利用proteus仿真。 前言 Mcs-51系列单片机内部有一个功能很强的全双工串行异步通信接口,它可以为URAT使用,能方便的构成双机或多机通信系统,也可以在外接移位寄存器后扩展为并行I/O口。 图1 双机通信直接连接 由图1可知:通信双方都是8031单片机,将一方的TXD与另一方的RXD相连, RXD与另一方的TXD相连。地与地相连,由于串行口的输出是TTL电平。因此这种连接方式只适用于短距离通信。发送数据时,只要将数据写入SUBF即可将待发送的数据按事先设置的方式和波特率从TXD端串行输出,接收数据时要先使REN=1, 当一帧数据从RXD端输出至SBUF后,串行口发送中断请求,通知CPU读入数据,数据传送的速率取决与串行口的工作方式和波特率的设置。 一、工作方式 1)方式 0 当设定SM1、SM0 为00 时,串行口工作于方式0,在方式0 下,RXD 为数据输入/输出端,TXD 为同步脉冲输出端,发送或接收的数据为8 位,低位在前,高位在后,方式0的波特率固定为?OSC /12,也就是每一机器周期传送一位数据。方式0可以外接移位寄存器,将串行口扩展为并行口,也可以外接同步输入/输出设备。 2)方式 1 当设定SM1、SM0为01时,串行口工作方式1。方式1为波特率可变的8位异步通信方式,由TXD发送RXD接收,一帧数据为10位,1位起始位(低电平),8位数据位(低位在前)和1位停止位(高电平),波特率取决于定时器的 T11溢出率(1/溢出周期)和波特率的选择位SMOD。 3)方式2 和方式3 当设定SM0、SM1为10或11时,串行口工作于方式2或方式3,这两种方式都是9位异步通信,仅波特率不同,适用于多机通信。在方式2或方式3下,数据由TXD发送RXD接收,1帧数据为11位,1位起始位(低电平),8位数据位(低位在前),1位可编程位(第9位数据,用作奇偶校验或地址/数据选择),1位停止位(高电平)。与方式1相比,多了一位可编程位,发送时,第9位数据为TB8,接收时,第9位数据送入RB8。 二、双向通信流程图 本设计可以进行双机间的通信,既可以从主机发送数据,有可???子机发送数据。从单一方向的流程如下图2所示: 甲机发送主程序 发送中断服务子程序 图2 主机先进行串行口初始化,关闭串行口中断,再初始化T1关闭T1中断,启动T1,然后进行数据的发送,置初值,允许串行中断、等待中断。 同样的,子机也要进行与主机 图3 乙机接受主程序 相似的过程,进行串行口的初始化 开串行口中断,初始化T1关闭T1 中断,启动T1。设置接收地址的字 节计数初值,然后等待主机的串行 中断信号如图3。中断服务子程序与主机 相似,如图4所示。 图4 接受中断服务子程序 三、程序 由于本设计是基于AT89C51的双向的对称设计,主机与子机的程序可以相互替代,其C语言程序设计如下: #includereg51.h #define uchar unsigned char #define uint unsigned int uchar con=0; //设计数标志 sbit key=P1^7; //设键盘 uchar buffer=0; void delay(int k) //延时函数 { int i; for(i=0;ik;i++); } void display(uchar m) { switch(m) { case 0: P2=0x0;break; case 1: P2=0x1;break; case 2: P2=0x2;break; case 3: P2=0x4;break; case 4: P2=0x8;break; case 5: P2=0x10;break; case 6: P2=0x20;break; case 7: P2=0x40;break; } } void int_s() interrupt 4 { ES=0; if(RI==1) { buffer=SBUF; RI=0; display(buffer); } if(TI==1) { TI=0; } ES=1; return; } void main() { display(buf

文档评论(0)

honey888 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档