课题七 单片机双机通信(课件)-《单片机技术与应用》同步教学(电子工业版)

2024-07-11
| 32页
| 25人阅读
| 1人下载
普通

内容正文:

1 课题七 单片机双机通信 课题目标 通过本任务学习什么是计算机的通信,什么是串口通信,什么是并口通信,学习用串行通信的方式实现单片机之间的信息交换,学会应用单片机的串行端口进行数据的输入/输出传送,能用串行通信实现数据传输。 2 课题分析 要实现两个单片机系统之间的通信,首先要考虑的是两个系统之间的信号的是如何传递问题,然后再考虑要传递的信号的用途问题。 为了便于对串口的工作及串口程序的编 写,本课题分为与PC通信和双机通信两个任务。 3 任务一 与PC通信 任务目标 实现单片机通过串口电缆与PC相实现通信,将PC输出的字符全改为小写,并发回PC。规定通信的硬件协议为:9600bps;信息格式为8个数据位,1个停止位,无奇偶校验位。 PC机方面的软件编程主要是对异步通信适配器8250进行编程,从而来控制串行数据的传送格式和传送速率. 单片机与PC的数据交换,但二者的电平标准不同,单片机采用TTL电平,PC采用RS232标准接口电平,因而需要电平转换电路。其中MAX232芯片就是这类电路中的一种,具体电路见图6-1所示。 4 图6-1 串口电平转换电路 5 程序设计分析 根据本任务的目标,要求单片机每接收到一个字符时,先作字符判断并转换,然后将字符通过串口发回PC机。 本任务的附加条件,要求单片机本身需要设置串行口波特率设置为9600,选择模式1(无附加的奇偶校验位),即SCON需要设置的值为0X50,对应的T1应设置为模式2且TH1的值设置为0XFD。 将字符中的大写字母转换为小写,首先应判断字符是否为大写字母,然后根据ASCII码的方式,加上小写字母与大写字母的差值就能完成转换,如下所示的语句: if ((ch>='A')&(ch<='Z')) ch=ch+'a'-'A'; 6 源程序 #include <reg52.h> #define uchar unsigned char void send_char(uchar ch)//通过串口发送一个字符 { SBUF=ch; //将输出的内容送到串口缓冲寄存器,就相当于输出 while(TI==0);//等待输出完毕 TI=0; //将输出中断标志清0(必须手动清0) } void main() { /* 串行口设置在9600波特率、方式1,允许接收 */ SCON=0X50; PCON=0X00; TMOD=0X20; TL1=0XFD; TH1=0XFD; ES=1; //允许串口中断,采用中断方式处理串口接收 7 EA=1; TR1=1; while(1) { ; } } void serial() interrupt 4//串口中断号为4 { uchar ch; ch=SBUF; //读入数据 //将大写转换为小写 if ((ch>='A')&(ch<='Z')) ch=ch+'a'-'A'; send_char(ch);//发送处理后的数据 TI=0;//清接收中断; } 8 任务二 双机通信 任务目标 如图6-2所示电路原理图中,要求在单片机系统中通过键盘输入数据,通过单片机的串口传输到另一个单机系统的串口,在串口接收另一个单片机发送的数据并在数码管上显示。 在图6-2中,键盘电路选择行列式矩阵键盘接在P2口;显示电路选择LED数码管动态显示电路,显示段码接P0口和位码接P1口;串行通信接口电路选择直接连接的插座, RXD、TXD与GND直接通过导线与另一单片机系统相连。 9 图6-2 单片机系统电路 10 程序设计分析 由任务可知,要求程序要完成的功能一是将本机的按键通过串口用异步通信的方式发送出去,二是对接收到另一单片机传送到串口的数据,先保存下来,再送LED数码管依次显示出来。 因此,程序将为分三个部分组成,其一是随时扫描键盘,如果有键按下,则调用串口发送程序;其二是串口接收程序,只要有数据到了,就执行数据接收程序,并把数据送到显示数组里;其三是动态显示程序。为了完成这三个并行任务,最简单的方法采用中断进行任务分配,将串口接收程序使用串口中断对输入的数据进行检测和接收,将动态显示程序使用定时中断完成,而键盘扫描则采用主程序实时检测,程序的流程框图如图6-3所示。 11 图6-3 单片机程序框图 (A)主程序 (B)串口中断服务程序 初始化 读入键盘状态 开始 接收到数据 数据处理 (存放到显示数组中) 清中断标志 发送数据 是否按下键 刚按下键 否 接收数据? 否 (A) (B) 串行中断入口 中断处理结束 12 一、串口接收程序 作为串口中断,当串口在发送或接收完一个数据时,会使对应的标志位TI(RI)出现置位,产生中断。因而在出现中断时,需要先判断是不是RI标志(接收),如果是接收到了数据,则数据自动被硬件保存在SBUF单元中,然后从SBUF单元中读出具体的数据进行处理,在本任务中是将数据送到显示数组中。对应的程序如下所示: if (RI==1)  //判断是否接收到数据,RI为1表示已接收到 { display_data[point++]=SBUF; //将数据送到显示数组中,变量point为存放的位置 if (point==8) point=0; //如果已经存放完毕,则从头开始 RI=0; //手动将串口接收中断标志清除 } 13 二、显示程序 用定时中断进行动态显示,其实质是利用定时中断产生每一个数码管显示延迟的时间。由于每次定时中断只能显示一位数字,所以需要设置全局变量来保存显示位置等信息。 14 三、键盘处理 void sendchar(unsigned char ch) //使用参数的方式传递准备发送的数据 { SBUF=ch; //将数据送到SBUF单元 while(TI==0); //等待发送完毕,如果没发送完毕,则TI 不为1。 TI=0; //手动清除TI标志 } 作为键盘扫描程序,在前面的课题中已经有较详细的说明,在此不作过多的说明。但是,使用串口的发送数据,需要将发送的数据送至SBUF单元,如果发送完毕,则TI自动置位,需要将其手动清除,发送一个字符的程序如下所示。 15 在本任务中,采用了4×4的矩阵式键盘。所谓矩阵式键盘,也称为行列式键盘,它将若干个按键分为行和列组成开关矩阵,如图6-2中P1口连接的按键结构,也可以参照本书课题一所介绍的实验电路中的按键。这种键盘结构特点是每一个按键连接在一根行线和一根列线之间。 1. 扫描键盘 行列式键盘的具体识别方法有扫描法和反转法。所谓扫描法,即用列线输出,行线输入(可交换行线和列线的输入、输出关系)。其中,列线逐列输出0,某行有键按下,行线有0输入,若无按键,行线输入全部为1。当有键按下时,根据行线和列线可最终确定哪个按键被按下,对应的框图如图6-4所示。另外,还可以采用反转法,也就是行线和列线交换输入、输出,分两步获取按键的键号,但是在多键同时按下时不能准确判断。 16 图6-4 键盘扫描程序框图 第N列输出0 读入行的状态 扫描完? 没键按下? 变量的初始化 合成按键的键号 没完毕 有键 没键按下 已扫描完毕 17 检测哪一个键被按下所用的程序如下所示。运行程序后,当按下键盘中某一个键时,会得到一个返回值,如11H、12H、41H、42H等。这时显示的编码与键盘定义的键盘逻辑编码是不一致,还需要将这部分输出的编码转换为对应的逻辑编码,即键译码。 源程序: uchar inkey() { uchar i,j=1,k; // 变量 j 取反后,提供键盘的扫描码,同时为行码 for (i=0;i<4;i++) // 四次循环,共扫描四次 { P1=~j; // P3的高四位为高电平,低四位为扫描码(其中只有一位为低) k=~P1; // k中的值为P3各位取反,如果没键按下,其高四位将为0 k=k&0xf0; // k中保留高四位,低四位置0 if (k!=0) break; // 如果k不等于0,意味着有键按下,就退出循环 j=j<<1; // j 指向下一位 } k=k+j; // 将行和列的代码合成到变量k中 return k; // 返回键号 } 18 2.键译码 通过上述步骤获得按键的行号和列号,但按键所在物理位置的变化将引起键号的不一致,或者由于按键功能的不同规定也将影响键号所对应的功能的执行。如图6-5所示的键盘,就是两种典型的键盘布局,键盘的编号与键盘的扫描码没有直接的运算关系,造成程序编写的困难。 0 1 2 3 4 5 6 7 8 9 A B C D E F 7 8 9 + 4 5 6 - 1 2 3 * 0 . = / 图6-5 键盘示意图 19 为了使键盘读入程序有一个规范的编码输出,即不管按键的物理位置和人为规定按键功能的变化,通过一段程序将键号转换为一个标准的数值。如将图7-5中的每个键盘的16个按键都编号为0至F,其中键盘中规定的0至9号键的编号为对应的数值,那么在后续程序的编写时将容易和简单许多。 将键盘的扫描码转换为有象征意义的键盘编码,这个过程就是键的编码转换。至于按下某个按键时要执行什么操作,和按键扫描及译码没有什么联系,是按键的功能设置决定的,在整个程序中根据键盘读入函数的返回值去执行相应的操作。 20 为此,我们可以将键盘函数inkey()进行修改,增加键译码功能,使其输出的数字为键盘的逻辑值。 本任务中采用查表法扫描码变为对应的键值,16个键依次编号为0至15,没键按下时返回16。编写键盘码表的方法是,在原键盘扫描程序的基础上,分别从0开始依次按下各键,记录下其扫描码,写入数组keytab中。不同的连接或不同的键盘定义都可能造成该数组的不同。 21 在前面的键盘扫描程序中加入译码功能: for (i=0;i<16;i++) { if (keytab[i]==k) break; //在keytab中搜索与k相同的编码,获得是第i号键 } return i; // 返回键的编号 22 3.键处理 对于键盘上的每一个键,具体是完成什么功能,由键盘要完成具体任务和程序设计来决定。对于键盘处理来说,首先要做的事情是要消除抖动。 为了同时兼顾动态显示,而动态显示函数调用一次需要几个ms,因此可以用动态显示函数代替消抖用的延时函数。手按动键盘的时间为零点几秒到几秒之间,远大于动态显示函数的所消耗的时间,所以可以每调用一次显示函数后,再判断一次是否有键按下的方法进行消抖和键盘信息处理。具体的消抖功能的键盘处理程序框图如图6-6所示。 23 初始化 有键按下? 是否处理? 有键按下? 延时消抖(调用动态显示函数) 调用键盘处理函数进行具体处理 并置处理标志 调用动态显示函数 清处理标志 没有 已处理 没有 图6-6 带动态显示的键盘消抖程序框图 24 一、有关通信的基本概念 数据通信的基本方法有并行通信和串行通信两种。 串行通信的基本方式分为同步串行通信和异步串行通信。 异步串行通信是指通信时发送设备与接收设备使用各自的时钟控制数据的发送和接收的过程。异步串行通信的特点是以字符为单位进行传输,传送字符与字符之间的时间间隔是任意的,但所传送每个字符中的各位是以固定的时间传送的,硬件设备简单。 异步串行通信用起始位和停止位标识每个字符的开始和结束,字符间隔不固定,只需字符传送时同步。异步串行通信的双方需要两项约定: 25 ⑴ 字符格式 一帧字符位数的规定:数据位,校验位,起始位和停止位。 ⑵ 波特率 波特率baudrate是数据码元传送的速率,在异步通信中,要求发送方和接收方都要以相同的数据传送速率工作。 比特率为每秒钟传送二进制数码的位数,以bps(bit per second 位/秒)作为单位。 比特率=波特率*一个码元对应的二进制位数 此处,波特率和比特率的大小是相等的。 26 二、与串口控制相关的寄存器 ⑴ SCON SCON是可编程控制的,修改SCON的值,就可改变串口工作方式和工作状态,各位定义如下: SM0 SM1 SM2 REN TB8 RB8 TI RI SM0、SM1:串口模式设定位。00:方式0;01:方式1;10:方式2;11:方式3。 方式0为同步移位寄存器工作方式。其波特率是固定的,为fosc/12,数据由RXD(P3.0)端发送或接收,同步脉冲由TXD(P3.1)端输出。发送或接收8位数据是低位在先。 27 SM2(SCON.5):8051连接多重处理器通信的控制位。即在工作方式2、3中允许多机通信的控制位。 REN(SCON.4):串行通信接收允许位。REN=1时允许接收,REN=0时禁止接收。该位可以由软件来设定。 TB8(SCON.3):在串行通信模式2和模式3操作时的第9个传送数据位。 RB8(SCON.2):在串行通信模式2和模式3操作时的第9个接收数据位。 TI(SCON.1) :串行通信传送的中断处理标志位。在方式0中,发送完第8位数据时,由硬件自动置位,其它方式中,在发送停止位之初,由硬件自动置位。T=1时,申请中断,CPU响应中断后,发送下一帧数据。注意在任何方式中,T1都必须由软件先清零。 RI(SCON.0) :串行通信接收的中断处理标志位。 28 ⑵ PCON PCON是电源控制寄存器,它只有其最高位与串口相关,即PCON的D7位SMOD作为串行口的波特率控制位,SMOD=1,波特率加倍, SMOD=0,则不加倍。 ⑶ 串口缓冲寄存器SBUF SBUF是由发送缓冲寄存器和接收缓冲寄存器两个单元组成,在单片机中占用同一个字节地址(99H),可同时发送和接收数据。单片机在处理时,由读/写指令来区别两个单元,因而不会出现读写冲突和错误。 29 三、MCS_51串行口的工作方式 一、方式0 方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。 1、方式0输出 30 二、方式1 方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图所示。其中1位起始位,8位数据位,1位停止位。 1、方式1输出 31 三、方式2和方式3 方式2或方式3时为11位数据的异步通信口。TXD为数据发送 引脚,RXD为数据接收引脚 。 方式2和方式3时起始位1位,数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。 32 计算机通信主要有串行通信和并行通信两种方式,远距离通信通常采用串行通信方式但需要增加电平、接口转换电路,如RS-232C、RS485接口等。 MCS-51单片机内部有一个全双工的异步串行通信接口,共有四种工作方式;其数据帧格式有10位、11位两种;方式0和方式2的通信波特率是固定的,方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。 单片机之间可实现双机通信、多机通信并可与PC机通信;利用PC机与单片机可组成上位机、下位机通信网络。 通信软件可采用查询与中断两种方式编制,实际应用中常采用中断工作方式进行通信。 本章小结 � D0� D1� D2� D3� D4� D5� D6� D7� ����SBUF� RXD��������� TXD������������� TI������������� � ����� � � ������� � ������8��� D7� � ������� LSB� MSB� D0� � � � � � ����� 1����10��� � ����� � ����� � � D0� D1� D2� D3� D4� D5� D6� D7� ����SBUF� ������� TXD� TI������������� � ����� ������������������������������� � � ������� � ������9��� � ������� LSB� MSB� � � � � � ����� � ����� D0� D7� 1����11��� � � RB8/TB8� $$

资源预览图

课题七  单片机双机通信(课件)-《单片机技术与应用》同步教学(电子工业版)
1
课题七  单片机双机通信(课件)-《单片机技术与应用》同步教学(电子工业版)
2
课题七  单片机双机通信(课件)-《单片机技术与应用》同步教学(电子工业版)
3
课题七  单片机双机通信(课件)-《单片机技术与应用》同步教学(电子工业版)
4
课题七  单片机双机通信(课件)-《单片机技术与应用》同步教学(电子工业版)
5
课题七  单片机双机通信(课件)-《单片机技术与应用》同步教学(电子工业版)
6
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。