- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)