《项目八单片机双机通信设计.ppt》由会员分享,可在线阅读,更多相关《项目八单片机双机通信设计.ppt(40页珍藏版)》请在三一办公上搜索。
1、,单片机C语言应用技术与实践讲课稿,项目8 单片机双机通信系统设计,知识目标:1单片机串行通信基础知识;2单片机与上位机通信基础知识3VB基础知识。能力目标:1.能根据设计任务要求编制程序流程图;2.会绘制单片机双机通信电路原理图;3.会用keil C51软件对源程序进行编译调试及与protues软件联调,实现电路仿真。,并行通信与串行通信,并行通信:所传送数据的各个位同时发送或接收。相同时钟速率下,并行通信速度较快,适合高速本地通信。串行通信:所传送的数据的各个位按顺序一位一位的发送或接收。串行通信连线少、连接可靠,适合远距离通信。,同步串口与异步串口,同步串口具有至少1根时钟线、12根数据
2、线的串行通讯方式,利用时钟沿对齐数据,所以此种通讯较为可靠,可以实现很高的通讯速率(1Mbps以上,可达Gbps级别)。SPI、IIC、IIS都属于同步串口。异步串口无专门的时钟线,只有12根数据线,收发双发依据事先约定好的位速率确定各个数据位的时间位置,所以此种通讯方式可靠性相对差一些,速率在1Mbps以下。双线的异步串口最常见的是UART,以及衍生出的RS232、RS485等。美信公司的1-WIRE总线属于1根线的异步串口,温度传感器DS18B20就使用了此种总线接口。,同步通信与异步通信(1)同步通讯异步通信的概念同步和异步都属于串行数据传送方式,但二者的传送格式有所不同。同步方式的一帧
3、内含有很多数据位,而异步方式一帧内只含有几个数据位。如果要传送一大堆数据,同步方式只给这串数据进行一次外包装(即添加“头帧”、“尾帧”、“校验”帧),而异步方式在传送这串数据时则要对数据的每一个字节分别加以包装(即添加“头”位、“尾”位和校验)。显然在相同的数据传输波特率下,同步方式比异步方式的传送速度快,但同步方式要求收发双方在整个事件传送过程中始终保持严格同步,这将增加硬件上的难度,而异步通信只要求每帧(字节)的传送中短时间保持同步即可,实现起来要容易得多。,同步、异步数据通信格式,同步传送的数据格式,异步通信数据帧格式,通信方向,单工传送如果某种通信接口只能发送或者接收,这种单向传送的方
4、法称为单工传送。,通信方向,半双工传送数据在两机之间双向传送,此种方式称为双工传送。收发不能同时进行,只能分时接收或发送,称为半双工传送。,通信方向,全双工传送两机之间的发送和接收可以同时进行,称为全双工传送。,MCS51的UART,数据格式每字节10位,1位起始位、8位数据、1位停止位。按照约定好的速率,一位一位的发送与接收。举例:串口发送二进制数0b11101010波特率每秒传送的位数,单位bps。9600bps:每个码元时间宽度为(1/9600)S,MCS51的UART,管脚定义与硬件连接TXD:发送脚,与P3.1复用RXD:接收脚,与P3.0复用当UART正常工作时,P3.0和P3.1
5、不能作为普通IO口使用2个UART互联通信时,需要交叉连接,任务1 单片机双机通信设计,串行接口的结构(1)数据缓冲寄存器SBUF两个SBUF,一个用于发送(只写);一个用于接收(只读)。映象地址均为99H(2)数据发送与接收控制发送控制器在波特率作用下,将发送SBUF中的数据由并到串,一位位地传输到发送端口;接收控制器在波特率作用下,将接收接收端口的数据由串到并,存入接收SBUF中。,串行接口的结构,MCS51的UART,电平转换电路PC机的串口是RS232电平标准(+15V0,-15V1),而显然MCS51的UART是5V-TTL电平标准,因此需要加上电平转换电路,方可实现与PC机串口的通
6、讯。,知识链接,二、MAX232基础知识1.MAX232简介该产品是由德州仪器公司(TI)推出的一款兼容RS232标准的芯片。由于电脑串口rs232电平是-10v+10v,而一般的单片机应用系统的信号电压是ttl电平0+5v,max232就是用来进行电平转换的,该器件包含两个驱动器、两个接收器和一个电压发生器电路提供TIA/EIA-232-F电平。该器件符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5-V TTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。2.主要特点(1)单+5V电源工作(2)两个驱动器及两个
7、接收器(3)30V输入电平(4)低电源电流:典型值是8mA,任务2 单片机与PC通信,2.1 提出任务功能为利用键盘在PC机中输入一个6字节(12位的09,AF)的二进制数,然后用鼠标点击通信命令按钮,PC机就将此二进制数发给单片机,单片机收到此数后再原样发回,PC机收到后显示在窗体上。试验者可通过肉眼比较发送和接收的两个数据,检验通信是否成功。2.2 分析任务1.硬件电路设计PC机的某个串行口通过电缆线与RS232收发器MAX232的232电平端口三线交叉连接,如图8-8所示。MAX232的逻辑电平端口与单片机的串行口相连。PC机RS232的9针连接器的4脚和6脚、7脚和8脚不用连接。图8-
8、8 PC机与单片机的通信接口电路框图,PC机与单片机的通信接口电路框图,任务1 单片机双机通信设计,(3)接收数据部分在程序中,接收一个字节的过程如下:检测RI位,如果接收到数据,则RI位被硬件置1,如果TI为0,则继续等待;RI=1,表示已接收到一个字节,此时,可以将SBUF中的内容读入缓冲区;将RI软件清0,准备接收下一字节;程序中,使用 get_string()发送数据,当检测到“0”字符时,表示已接收到完整的字符串,函数返回。,MCS51的UART,USB转串口电路对于新款的台式机以及笔记本电脑等没有串口的电脑,也可以用USB转串口的芯片,给电脑扩展出一个串口用于与单片机通信。,UAR
9、T相关的寄存器,UART的控制寄存器SCONSM0,SM1:串行口操作方式选择位。SM2:允许方式2和3的多机通信使能位。REN:允许串行接收位。TB8:方式2和3中要发送的第9位数据。RB8:方式2和3中已接收到的第9位数据。TI,RI:发送/接收中断标志。,UART相关的寄存器,UART的四种工作模式SCON的SM0,SM1:串行口操作方式选择位,两个选择位对应于四种状态,所以串行口能以四种方式工作。,UART相关的寄存器,UART的中断标志位TI与RISCON的TI:发送中断标志。在方式0中当串行发送完第8位数据时由硬件置位;在其他方式中,在发送停止位的开始时由硬件置位。当TI=1时,申
10、请中断,CPU响应中断后,可以发送下一帧数据。在任何方式中,该位都必须由软件清0。SCON的RI:接收中断标志。在方式0中串行接收到第8位结束时由硬件置位。在其他方式中,在接收到停止位的中间时刻由硬件置位。RI=1时申请中断,要求CPU取走数据。在任何工作方式中,该位必须由软件清0。在系统复位时,SCON中的所有位都被清0。,UART相关的寄存器,PCON与波特率控制PCON:PCON是一个特殊功能寄存器(如下图所示),没有位寻址功能,字节地址为87H。SMOD:其中D7位(SMOD)为波特率选择位。其他均无意义。复位时的SMOD值为0。可用MOV PCON,#80H或MOV 87H,#80H
11、指令使该位置1。当SMOD=1时,在串行口方式1,2或3情况下,波特率提高一倍。,UART的波特率设置,定时器1、定时器2与波特率控制方式1和3的波特率由定时器1或定时器2的溢出率所决定,通常设定相应定时器工作于自动重装模式。当定时器1作波特率发生器时,波特率由下式确定:波特率=(定时器1溢出率)/n定时器1初值=256-Fosc/(n*12*波特率)式中:n为32或16,取决于特殊功能寄存器PCON中的SMOD位的状态。若SMOD=0,则n=32。若SMOD=1,则n=16。Fosc为单片机晶振频率。当定时器2作波特率发生器时,波特率由下式确定:波特率=(定时器2溢出率)*12/32定时器2
12、初值=65536-Fosc/(32*波特率),UART方式1,UART的工作模式1串行口工作于方式1时,被控制为波特率可变的8位异步通信接口。传送一帧信息为10位,即1位起始位(0),8位数据位(低位在先)和1位停止位(1)。数据位由TXD发送,由RXD接收。波特率是可变的,取决于定时器1或2的溢出速率。,UART使用步骤,设置串口工作模式。SCON的SM0=0,SM1=1使其工作于模式1,REN=1使能接收。根据波特率计算公式设置波特率。注意,需要使定时器工作于自动重装模式。使用定时器2可以达到较高的波特率。波特率是否需要倍速。如果使用定时器1做波特率发生器且倍速后方能满足波特率要求,则需要
13、PCON=0 x80。PCON不影响定时器2产生的波特率。串口中断。一般来讲串口发送均会采用查询模式,串口接收较多采用中断模式。ES=1可以打开串口中断,随后要EA=1打开全局中断。注意,要写好中断服务函数,而且MCS51的串口收发中断共用,因此中断服务函数中需要判断TI与RI的值。中断向量标号是4。向SBUF写入数据启动串口发送,读SBUF可以取出接收到的数据,概念讲解,波特率:每秒钟传输二进制代码的位数,1波特=1位/秒单位:bps,如每秒钟传送240个字符,每个字符格式含10位,则波特率为 10位*240个/秒=2400bps。波特率(方式1、方式3)=(2SMOD/32)(T1溢出率)
14、说明:单片机与单片机、单片机与计算机、计算机与计算机之间串口通讯都是用串口方式1,定时器工作方式为方式2T1溢出率就是T1定时器溢出的频率,只要计算出T1定时器每溢出一次所需的时间T,那么T的倒数就是它的溢出率。T1溢出率=fosc/12 256-(TH1)=串口通讯在串口方式1下,波特率为9600 bps,系统频率11.0592M,求TL1,TH1装入的数值是多少?(0 xfd),任务1 串口方式1编程与实现,题目:在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机“I GET X”,串口波特率设为9600ps。初始化:1.确定T1的工作方式(编程TMOD 寄存器);2.计
15、算T1的初值,装载TH1、TL1;3.启动T1(编程TCON中得TR1位);4.确定串口工作方式(SCON寄存器);5.串口在中断方式时,要进行中断(IE、IP的设置);,任务1 单片机双机通信设计,题目:甲机通过串口控制乙机LED闪烁,甲机的K1键可通过串口分别控制乙机的LED1、LED2的闪烁,同时闪烁,同时关闭。程序编写:,知识链接,任务1 单片机双机通信设计,单片机之间双向通讯:甲机的K1按键可通过串口分别控制乙机的LED1、LED2的点亮、全亮、全灭。乙机按键可向甲机发送数字,甲机接收地数字会显示在其P0端口的数码管上,知识链接,任务1 单片机双机通信设计,1.1 提出任务单片机甲向
16、单片机乙发送“READY”字符串,然后等待接收。如果接收到乙机发送的“OK”字符串,则蜂鸣器响,否则就不响。1.2 分析任务1.硬件电路设计电路组成如图8-1所示。这里选择具有内部ROM的AT89S51单片机,如果PROTEUS软件中没有AT89S51单片机,就选用AT89c51单片机。两块单片机串口相接,即甲机的P3.0接乙机的P3.1,甲机的P3.1接乙机的P3.0,也就是说甲机的发送端接乙机的接收端,甲机的接收端接乙机的发送端;甲机的P1.0接蜂鸣器。当甲机的P1.0管脚输出高电平时,蜂鸣器就响,输出低电平时,蜂鸣器不响。,任务1 单片机双机通信设计,图8-1 双机通信原理图(右边是甲机
17、,左边是乙机),任务1 单片机双机通信设计,使用查询方式,实现双机串口异步通信。所谓的查询方式,是指通过查看中断标志位RI和TI来接受和发送数据。在这种方式下,当串口发送完数据或接收到数据时,仅仅置位相应的标志位而不会以任何其它的形式通知主程序。主程序只能通过定时查询发现标志位的状态改变,从而作出响应的处理。注意,在查询方式中,标志位的位置由硬件完成,而标志位的清除需要软件进行处理。首先由甲机发送“READY”字符串,然后等待接收。如果接收到乙机发送的“OK”字符串,则蜂鸣器响,否则就不响。总程序流程图如图,甲机流程图,任务1 单片机双机通信设计,数据的接收和发送均使用查询方式。程序大致分为3
18、个部分:初始化部分、发送数据部分、接受数据部分。(1)系统初始化部分系统初始化部分应完成 如下方面的工作:关闭所有中断;设置串口工作模式;设置串口为接收允许状态;设置串行口通信波特率;其它数据初始化;,任务1 单片机双机通信设计,串口使用工作方式1,其波特率可以是软件设置的。波特率的设置是通过改变定时器T1的溢出率来控制。设定单片机为如下环境:单片机外接晶振频率为11.0592Hz;定时器T1工作在工作模式2,既自动装入初值8位定时器;波特率选择位SWOD置为1;设置通信波特率为9600bit/s;按照上述条件,定时器T1的初值N应设为:N=256-(2smod晶振频率)/(波特率3212)=
19、256(2111.0592106)/(96003212)=250=FAH,任务1 单片机双机通信设计,(2)发送数据部分在程序中,发送一个字节的过程如下:将数据传送至SBUF;检测TI位,如果数据传送完毕,则TI位被硬件置1,如果TI为0,则继续等待;TI=1,表示发送完成,此时需要将TI软件清0,然后继续发送下一个字符;程序中,使用 put_string()发送数据,当检测到“0”字符时,表示到达发送字符串结尾,停止数据发送。,任务1 单片机双机通信设计,#include#include#define _SEND_STRING_“READY”/发送的字符串#define _RECV_STRI
20、NG_“OK”/接收的字符串#define _MAX_LEN_ 16/数据最大长度void put_string(unsigned char*str);/串口发送字符串void get_string(unsigned char*str);/串口接收字符串void Beep();/蜂鸣表示成功接收到返回信号,void main()char buf_MAX_LEN_;/*系统初始化*/TMOD=0 x20;/定时器T1使用工作方式2TH1=250;/设置初值TL1=250;TR1=1;/开始计时PCON=0 x80;/SMOD=1SCON=0 x50;/工作方式1,波特率9600bit/s,允许接
21、收EA=0;/关闭全部中断strcpy(buf,_SEND_STRING_);/设置发送字符串,程序代码如下(甲机):,任务1 单片机双机通信设计,/*-发送数据-*/put_string(buf);buf0=0;/清空缓冲区/*-接收数据-*/while(strcmp(buf,_RECV_STRING_)!=0)get_string(buf);beep();while(1);/反复循环,/*-子函数-*/*发送字符,参数str为待发送子符串*/void put_string(unsigned char*str)do SBUF=*str;while(!TI);/等待数据发送完毕TI=0;/清发
22、送标志位str+;/发送下一数据while(*(str-1)=0);/发送至字符串结尾则停止,任务1 单片机双机通信设计,/*接收字符串,参数str指向保存接收子符串缓冲区*/void get_string(unsigned char*str)unsigned char count=0;*str=0;/清缓冲区 do while(!RI);/等待数据接收*str=SBUF;/保存接收到的数据RI=0;/清接收标志位str+;/准备接收下一数据,count+;if(count _MAX_LEN_)/如果接收数据超过缓冲区范围,则只接收部分字符*(str-1)=0;break;while(*(st
23、r-1)=0);/接收至字符串结尾则停止,任务1 单片机双机通信设计,#include#define uchar unsigned char main()uchar temp,datmsg6;TMOD=0 x20;/设置波特率为19.2kb/sPCON=0 x80;TH1=0 xfd;TL1=0 xfd;TR1=1;/启动定时器1 SCON=0 x50;/设置串行口为10位异步收发,且允许/接收 while(1)for(temp=0;temp6;temp+)/连续接收6个/字节,while(RI=0);RI=0;datmsgtemp=SBUF;for(temp=0;temp6;temp+)/连续发送6个/字节 SBUF=datmsgtemp;while(TI=0);TI=0;,单片机C51程序,