资源描述
*****************
实践教学
*****************
兰州理工大学
计算机与通信学院
2013年秋季学期
通信系统综合训练课程设计
题 目:51单片机双机串行通信设计
专业班级: 10级通信四班
姓 名:
学 号:
指导教师:
成 绩:
摘要
在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。
本次课程设计就是要利用单片机来完成一个系统,实现双片单片机串行通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双机通信。在通信过程中,使用通信协议进行通信。并用C语言编写程序实现PC机与51单片机通过串口实现异步通信。
关键字:51单片机;串行通信;RS-232接口标准
目录
前言 1
一、基本原理 2
1.1串行通信与并行通信 2
1.1.1 同步通信 2
1.1.2 异步通信 3
1.2 串行接口的特点 4
1.3 波特率选择 5
1.4 通信协议的使用 6
1.5 51单片机的结构和作用 6
1.6 双机通信 7
二、系统设计 8
2.1 系统设计方案 8
2.2 硬件设计 8
2.3 软件设计 9
三、系统分析 12
3.1 汇编语言和C语言的特点及选择 12
3.2 并行通信与串行通信的比较 12
3.4 AT89C51芯片的介绍 12
3.5 MAX232芯片的介绍 13
总结 15
致谢 16
附录 17
参考文献 21
前言
近年来,在自动化控制和智能仪表中,单片机的应用越来越广泛。虽然MOS单片机内部含有丰富地位硬件资源,但对于一些复杂的单片系统来说,光靠单个单片机资源远远不能满足系统要求,通常需要对单片机进行外部扩展。例如I/O接口,扩展存储器,扩展定时/计数器更有甚者需要可扩展单片机。那么一个系统就需要两个或两个以上单片机,而这些单片机就需要互联来实现通信。本次课程设计就是通过RS232来完成两个51单片机串行通信,通信的结果使用数码管进行显示,数码管采用查表方式显示。在通信过程中,使用通信协议进行通信。
一、基本原理
1.1串行通信与并行通信
计算机与外界的信息交换称为通信。在通信领域内,有两种数据通信方式:并行通信和串行通信。随着计算机网络化和微机分级分布式应用系统的发展,通信的功能越来越重要。通信是指计算机与外界的信息传输,既包括计算机与计算机之间的传输,也包括计算机与外部设备,如终端、打印机和磁盘等设备之间的传输。
串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。
终点
源
0
1
0
0
1
0
0
1
8位数据线
(a)并行通信
0100 1 00 1
源
(b)串行通信
终点
图1 串行通信与并行通信的区别
串行通信可以分为同步通信和异步通信两类。
1.1.1 同步通信
同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。异步通信实质是指甲乙通信双方采用独立的时钟,每个数据均以起始位开始,停止位结束,起始位触发甲乙双方同步时钟。每个异步串行帧中的1位彼此严格同步,位周期相同。同步通信的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流,但这时还有两种不同的同步方式,一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步,另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。
1.1.2 异步通信
所谓异步是指发送、接收双方的数据帧与帧之间不要求同步,也不必同步。
异步通信是一种很常用的通信方式,异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收),发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来,异步通信的好处是通信设备简单、便宜,但传输效率较低。
异步通信也可以是以帧作为发送的单位,接收端必须随时做好接收帧的准备,这时,帧的首部必须设有一些特殊的比特组合,使得接收端能够找出一帧的开始,这也称为帧定界,帧定界还包含确定帧的结束位置,这有两种方法,一种是在帧的尾部设有某种特殊的比特组合来标志帧的结束,或者在帧首部中设有帧长度的字段,需要注意的是,在异步发送帧时,并不是说发送端对帧中的每一个字符都必须加上开始位和停止位后再发送出去,而是说,发送端可以在任意时间发送一个帧,而帧与帧之间的时间间隔也可以是任意的。在一帧中的所有比特是连续发送的,发送端不需要在发送一帧之前和接收端进行协调。
异步通信比较灵活,适用于数据的随机发送/接收;而同步通信则是成批数据传送。异步传输一批数据因每个字节均有起始位和停止位控制而使发送/接收速度有所降低,一般适用于每秒50~9600位,而同步传输速度较快,可达每秒80万位,所以本次设计选用串行异步通信。
异步通信所传输的数据格式(串行帧)由1个起始位、7个或8个数据位、1~2个停止位(含1.5个停止位)和1个校验位组成。起始位约定为0;空闲位约定为1。
在异步通信方式中,数据或字符是一帧一帧传送的,在帧格式中包含了4个组成部分:起始位,数据位,奇偶位和停止位。起始位占一位,用逻辑“0”表示字符的开始。起始位后面紧接着是数据位,数据位的个数可以是5位,6位,7位或是8位。在数据位传送过程中,规定地位在前,高位在后,数据位发送完后,接下来的是1位奇偶校验位,奇偶校验用于有限差错检测,通信双方约定一致的奇偶校验方式,停止位在最后,用逻辑值“1”表示一个字符传送的结束,结束位可以是1位,1.5位或是2位,接收端收到停止位后,知道上一字符已传送完毕,通信线路上便又恢复逻辑“1”状态,直至下一个字符数据的起始位到来。
在异步模式下,AT89C51支持两种多机模式:线路空闲多机模式和地址位多机模式。线路空闲模式下,数据块被一段空闲的时间分割,在字符的第一个停止位之后收到10个以上的1,表示检测到线路空闲;如果采用两个停止位,则第二个停止位被认为是空闲周期的第一个信号。在使用地址位多机模式时,字符包含一个附加的位作为地址标识,数据快的第一个字符带有一个置位的地址位,用以表明该字符是一个地址
1.2 串行接口的特点
MCS-51单片机的串行端口有4种基本工作方式,通过编程设置,可以使其工作在任一方式,以满足不同场合的需要。其中,方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;工作方式1多用于双机之间或与外设电路的通信;方式2、3除有方式1的功能外,还可以作多机通信,以构成分布式多微机系统。
串行端口有两个控制寄存器SCON、PCON,用于设置工作方式、发送或接收的状态、特征位、数据传送波特率[每秒传送的位数]以及作为中断标志等。
串行端口有一个数据寄存器SBUF在特殊功能寄存器中的字节地址为99H,该寄存器为发送和接收所共用。
串行端口的波特率可以用程序来控制。在不同工作方式中,由时钟振荡频率的分频值或由定时器T1的定时溢出时间确定,使用十分方便灵活。
串口控制寄存器
输入:在(REN)=1时,串行口采样RXD引脚,当采样到1至O的跳变时,确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据。只有当8位数据接收完,并检测到高电平停止位后,只有满足①(R1)=0;②(SM2)=0或接收到的第9位数据为1时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。
1. 方式2
方式2为固定波特率的11位UART方式。它比方式1增加了一位可程控为1或0的第9位数据。
输出:发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。它可作为多机通讯中地址/数据信息的标志位,也可以作为数据的奇偶校验位。当CPU执行一条数据写入SUBF的指令且TI=0时,就启动发送器发送。发送一帧信息后,置位中断标志TI。
输入:在(REN)=1时,串行口采样RXD引脚,当采样到1至O的跳变时,确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据。在接收到附加的第9位数据后,当满足①(RI):0;②(SM2)=0或接收到的第9位数据为1时,第9位数据才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志Ri;否则信息丢失。且不置位RI。
2. 工作方式3
方式3为波特率可变的11位UART方式。除波特率外,其余与方式2相同。
波特率的选择
如前所述,在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在MCS-51串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。
1> 方式1
方式1的波特率固定为主振频率 的1/12。
2> 方式2
方式2的波特率由PCON中的选择位SMOD来决定,可表示为:波特率=2sMoD×fosc/64也就是当SMOD=1时,波特率为1/32×fosc,当SMOD=0时,波特率为1/64×fosc。
3> 方式1和方式3
定时器T1作为波特率发生器,其公式如下:
波特率=2SMOD/32×定时器T1溢出率
T1溢出率=T1计数率/产生溢出所需的周期数
式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为Fosc/2:当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于Fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
定时器T1工作于方式O:溢出所需周期数=8192-X
定时器T1工作于方式1:溢出所需周期数=65536-X
定时器T1工作于方式2:溢出所需周期数=256-X
因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。这种方式下,T1的溢出率[次/秒]计算式可以表示为:
T1溢出率=Fsoc/12[256-X]
1.3 波特率选择
波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MCS-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。
在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:
波特率=(1+SMOD)*晶振频率/(384*(256-TH1))
其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;
TH1——定时器的重载值。
在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。
下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则TH1=256-62500/波特率
根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表:
图2 通信误差表
因此,在通信中,最好选用波特率为1200,2400,4800中的一个。
1.4 通信协议的使用
通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:
0xA1:单片机读取P0端口数据,并将读取数据返回PC机;
0xA2:单片机从PC机接收一段控制数据;
0xA3:单片机操作成功信息。
在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC接收到0xA3时,就表明单片机操作已经成功。
1.5 51单片机的结构和作用
51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下:
数据缓冲器(SBUF)
接受或发送的数据都要先送到SBUF缓存。有两个,一个缓存,另一个接受,用同一个直接地址99H,发送时用指令将数据送到SBUF即可启动发送:接收时用指令将SBUF中接收到的数据取出。
串行控制寄存器(PCON)
SCON用于串行通信法师的选择,首发控制及状态指示。
利用AT89C51芯片、复位电路、时钟电路、LED数码管等,使A机控制B机的两个LED闪烁,B机控制A机的数码管加一显示。使用DS18B20温度传感器,由B机测量温度后由A机显示. 把P1口的高7位与数码管相连,绿灯表示通行方向。P2口与LED显示器相连,用来输出显示的数字。
1.6 双机通信
两台机器的通信方式可分为单工通信、半双工通信、双工通信,他们的通信原理及通信方式为:
单工通信:是指消息只能单方向传输的工作方式。单工通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的。通信双方采用“按——讲”(Push To Talk,PTT)单工通信属于点到点的通信。根据收发频率的异同,单工通信可分为同频通信和异频通信。
半双工通信:这种通信方式可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。也就是说,通信信道的每一段都可以是发送端,也可以是接端。但同一时刻里,信息只能有一个传输方向。如日常生活中的例子有步话机通信等。
双工通信:双工通信是指在同一时刻信息可以进行双向传输,和打电话一样,说的同时也能听,边说边听。这种发射机和接收机分别在两个不同的频率上能同时进行工作的双工机也称为异频双工机。双工机的特点是使用方便,但线路设计较复杂,价格也较高。
二、系统设计
2.1 系统设计方案
本次设计,对于两片89C51,采用RS-232进行双机通信。发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS-232点评输出,经过传输线将信号传送到接收端。接收方也是用MAX232芯片惊醒电平转换后,信号到达接收方串行口的接收端。接收方接收后,在数码管上显示接收的信息。
软件部分,通过通信协议进行发送接收,主机先送AAH给从机,当从机接收到AAH后,向主机回答BBH,主机收到BBH后就把数码表中的10个数据送给从机,并发送检验和。从机收到16个数据并计算接收到数据的检验和,与主机发送来的检验和进行比较,若检验和相同则发送00H给主机;否则发送FFH给主机,重新接受。从机收到16个正确数据后送到一个数码管显示。
图3 系统和原理框图
2.2 硬件设计
AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
A、B两台51单片机机通过串行接口相连,B机的七段数码管显示其接收到(A机发出)的数字;而A机的七段数码管则显示其接收到(B机发出)的数字。电路原理图如下所示。
图4 电路原理图
2.3 软件设计
A、B两机进行异步串行通信,当B机接收到A机发出的数据后,一方面通过其码管显示,另外加上偏移量后发出。当A机收到B机发出的数据后,一方面通过其数码管显示,另外经延时后再发出下一个数据。A、B两机的流程图如下所示。
(1)发送端程序流程图
主程序开始
从机应答
程序初始化
主机发送信号K1按下
主机发送数据
输出完成?
清除标志位
未应答
未完成
图 6发送端程序流程图
(2)接收端程序流程图
主程序开始
接收完成?
程序初始化
K2按下,接收数据
未完成
发送信号
接收完成?
未完成
清除标志位
重新接收
显示
图7 接收端程序流程图
三、系统分析
3.1 汇编语言和C语言的特点及选择
本设计是硬件电路和软件编程相结合的设计方案,选择合适的编程语言是一个重要的环节。在单片机的应用系统程序设计时,常用的是汇编语言和C语言。主机硬件,程序可读性和可一直性比较差。而C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算方便,表达花类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。本着学习和创新的精神,我们采用两种语言分别编写了程序。
3.2 并行通信与串行通信的比较
计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信得特点是传输信号的速度快,但所用的信号线不较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线即可完成通信,成本低,传输的距离较远。
3.3 AT89C51芯片的介绍
图8 AT89C51管脚图
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。
3.4MAX232芯片的介绍
图9 MAX232芯片引脚图
MAX232 芯片其内部有一个电源电压变换器,可以将输入+5V的电压变换成RS-232C输出电平所需的±12V电压。所以采用这种芯片来实现接口电路特别方便,只需单一的+5V电源即可。 MAX232芯片的引脚结构如下图所示。其中管脚1~6(C1+、V+、C1-、C2+、C2-、V-)用于电源电压转换,只要在外部接入相应的电解电容即可;管脚7~10和管脚11~14构成两组TTL信号电平与RS-232信号电平的转换电路,对应管脚可直接与单片机串行口的TTL电平引脚相连。
总结
本次设计采用两片AT89C51单片机实现信息的串行通信,设计过程中,从双机通信背景的了解,到89C51单片机具体功能的了解,到串行通信的原理的熟悉,到掌握具体串行通信在双机之间的实现;从硬件电路设计到程序编写;从硬件调试到软件模拟实现等。发送方的数据由串行口TXD断输出,经过传输线将信号传送到接收端。接收方接收电平信号,对于接口电路,短距离传送,减少抗干扰作用,如果离远双机串口中可以连接电平转换器常用芯片RS232,在此不再叙述。设计中,收获不少东西,也遇到了不少的问题。
第一,在完成单片机课程学习任务后,对内容的掌握不够,缺乏灵活运用的能力,对于知识的扩展也存在一定的问题,因此,面对设计课题,无法系统地进行设计思路的拟定。
第二,理论不能更好的联系实践,在巩固和学习硬件知识的同时,用软件控制协调硬件实现现实功能,通过硬件完成软件的功能等方面的融会贯通,取得了一定的效果。
经过本次的课程设计,我了解了单片机串行通信的基本知识,也学习到了基于单片机的C语言和汇编语言程序设计,对于以后的学习和工作有很大帮助。
在这次的课程设计过程中,我遇到了一些困难,也遇到过一些疑惑,比如开始时,由于发送端和接收端的通信协议没-有做好,导致数据不能正常传输。在解决问题的过程中,我对于通信协议有了更深刻的认识,也锻炼了自己独立思考和团队协作的能力。
致谢
通过本次课程设计,不仅使理论知识得到了实践,有效巩固了知识。同时对于单片机发展历史、强大功能、应用领域以及系列知识得到了大概的系统认识,同时也初步了解了一个完整的系统开发的过程,对于创造思维的培养和开发能力的锻炼,本次设计,为此提供了一个很好的平台。同学之间的相互讨论学习,互相提高,老师知识的帮助,经验的传授,也是本次设计的一道美丽的风景线,真正起到了抛砖引玉的目的。在此,感谢老师给我们这样好的学习机会。
附录
A、B两台51单片机的异步串行接收采用查询方式,它们详细的C51程序如下所示。
//A机程序
#include<reg51.h> //包含单片机寄存器的头文件
unsigned char code ddata[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e
}; //0,1,2,3,4....E,F的段码
************************
函数功能:发送一个字节数据
*************************/
void Send(unsigned char dat)
{
SBUF=dat;
While(TI==0) ; //等待
TI=0;
}
/***********************
函数功能:接收一个字节数据
************************/
unsigned char Receive(void)
{
unsigned char dat;
while(RI==0) ; //等待,直至接收完毕(RI=1)
RI=0; //为了接收下一帧数据,需将RI清0
dat=SBUF; //将接收缓冲器中的数据存于dat
return dat;
}
/**********************
函数功能:延时约150ms
***********************/
void delay(void) {
unsigned char m,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
; }
/*****************
函数功能:主函数
******************/
void main(void)
{
unsigned char i;
TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2
SCON=0x50; //SCON=0101 0000B,串口工作方式1,允许接收
PCON=0x00;
TH1=0xfd; //定时器TH1赋初值,波特率9600
TL1=0xfd; //定时器TL1赋初值
TR1=1; //启动定时器T1
while(1)
{
for(i=0;i<8;i++)
{
Send(i); //发送数据i
P0=ddata[Receive()]; //将接收到的数据送P0口显示
delay(); //600ms后发送下一个数据
delay();
delay();
delay();
}
}
}
//B机程序
#include<reg51.h> //包含单片机寄存器的头文件
unsigned char code ddata[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e
}; //0,1,2,3,4....E,F的段码
/***************************
函数功能:发送一个字节数据
****************************/
void Send(unsigned char dat)
{
SBUF=dat;
while(TI==0) ; //等待
TI=0;
}
/***************************
函数功能:接收一个字节数据
****************************/
unsigned char Receive(void)
{
unsigned char dat;
while(RI==0) ; //等待,直至接收完毕(RI=1)
RI=0; //为了接收下一帧数据,需将RI清0
dat=SBUF; //将接收缓冲器中的数据存于dat
return dat;
}
/*****************
函数功能:主函数
******************/
void main(void)
{
unsigned char dat;
TMOD=0x20; //定时器T1工作于方式2
SCON=0x50; //SCON=0101 0000B,串口工作方式1,允许接收(REN=1)
PCON=0x00;
TH1=0xfd; //定时器TH1赋初值,波特率9600
TL1=0xfd; //定时器TL1赋初值
TR1=1; //启动定时器T1
while(1)
{
dat=Receive();
P0=ddata[dat]; //将接收到的数据送P0口显示
Send(dat+8); //偏移量为+8
}
}
参考文献
1.《C语言程序设计》清华大学出版社;谭浩强主编 1999.12
2.《C语言程序设计技巧及应用》 上海科学普及出版社;陈进编著 1992.6
4.《单片机原理及应用教程》北京大学出版社;范立南,谢子殿编著 2007.8
5.《51单片机C语言应用程序设计实例精讲》(第二版)电子工业出版社;戴佳 戴卫恒编著 2008.12
6.《单片机语言C51典型应用设计》 人民邮电出版社;刘文涛编著 2005.10
7.《μVision2单片机应用程序开发指南》科学出版社;尹勇 李宇编著 2005.2
26
展开阅读全文