89C51 单片机 IO 口模拟串行通信的实现方法

合集下载

单片机期末考试试题(含答案)

单片机期末考试试题(含答案)

单片机期末考试试题01、单片机是将微处理器、一定容量的RAM 和ROM以及I/O口、定时器等电路集成在一块芯片上而构成的微型计算机。

2、单片机89C51片内集成了 4 KB的FLASH ROM,共有 5 个中断源。

3、两位十六进制数最多可以表示256 个存储单元。

4、89C51是以下哪个公司的产品?( C )A、INTELB、AMDC、ATMELD、PHILIPS5、在89C51中,只有当EA引脚接高电平时,CPU才访问片内的Flash ROM。

6、是非题:当89C51的EA引脚接低电平时,CPU只能访问片外ROM,而不管片内是否有程序存储器。

T7、是非题:当89C51的EA引脚接高电平时,CPU只能访问片内的4KB空间。

F8、当CPU访问片外的存储器时,其低八位地址由P0 口提供,高八位地址由P2 口提供,8位数据由P0 口提供。

9、在I/O口中,P0 口在接LED时,必须提供上拉电阻,P3 口具有第二功能。

10、是非题:MCS-51系列单片机直接读端口和读端口锁存器的结果永远是相同的。

F11、是非题:是读端口还是读锁存器是用指令来区别的。

T12、是非题:在89C51的片内RAM区中,位地址和部分字节地址是冲突的。

F13、是非题:中断的矢量地址位于RAM区中。

F14、MCS-51系列单片机是属于( B )体系结构。

A、冯诺依曼B、普林斯顿C、哈佛D、图灵15、89C51具有64 KB的字节寻址能力。

16、是非题:在89C51中,当CPU访问片内、外ROM区时用MOVC指令,访问片外RAM 区时用MOVX指令,访问片内RAM区时用MOV指令。

T17、在89C51中,片内RAM分为地址为00H~7FH 的真正RAM区的地址为80H~FFH 的特殊功能寄存器(SFR) 区两个部分。

18、在89C51中,通用寄存器区共分为 4 组,每组8 个工作寄存器,当CPU 复位时,第0 组寄存器为当前的工作寄存器。

89c51试题

89c51试题

单片机期末考试试题库及答案01、单片机是将微处理器、一定容量的 RAM 和ROM以及 I/O 口、定时器等电路集成在一块芯片上而构成的微型计算机。

2、单片机89C51片内集成了 4 KB的FLASH ROM,共有 5 个中断源。

3、两位十六进制数最多可以表示 256 个存储单元。

4、89C51是以下哪个公司的产品?( C )A、INTELB、AMDC、ATMELD、PHILIPS5、在89C51中,只有当EA引脚接高电平时,CPU才访问片内的Flash ROM。

6、是非题:当89C51的EA引脚接低电平时,CPU只能访问片外ROM,而不管片内是否有程序存储器。

T7、是非题:当89C51的EA引脚接高电平时,CPU只能访问片内的4KB空间。

F8、当CPU访问片外的存储器时,其低八位地址由 P0 口提供,高八位地址由 P2 口提供,8位数据由 P0 口提供。

9、在I/O口中, P0 口在接LED时,必须提供上拉电阻, P3 口具有第二功能。

10、是非题:MCS-51系列单片机直接读端口和读端口锁存器的结果永远是相同的。

F11、是非题:是读端口还是读锁存器是用指令来区别的。

T12、是非题:在89C51的片内RAM区中,位地址和部分字节地址是冲突的。

F13、是非题:中断的矢量地址位于RAM区中。

F14、MCS-51系列单片机是属于( B )体系结构。

A、冯诺依曼 B、普林斯顿 C、哈佛 D、图灵15、89C51具有 64 KB的字节寻址能力。

16、是非题:在89C51中,当CPU访问片内、外ROM区时用MOVC指令,访问片外RAM区时用MOVX指令,访问片内RAM区时用MOV指令。

T17、在89C51中,片内RAM分为地址为 00H~7FH 的真正RAM区,和地址为80H~FFH的特殊功能寄存器(SFR) 区两个部分。

18、在89C51中,通用寄存器区共分为 4 组,每组 8 个工作寄存器,当CPU复位时,第 0 组寄存器为当前的工作寄存器。

单片机IO口模拟串口程序(发送+接收)

单片机IO口模拟串口程序(发送+接收)

单片机IO口模拟串口程序(发送+接收)前一阵一直在做单片机的程序,由于串口不够,需要用10 口来模拟出一个串口。

经过若干曲折并参考了一些现有的资料,基本上完成了。

现在将完整的测试程序,以及其中一些需要总结的部分贴出来。

程序硬件平台:11.0592M 晶振,STC 单片机(兼容51) /*************************************************************** * 在单片机上模拟了一个串口,使用P2.1作为发送端* 把单片机中存放的数据通过P2.1作为串口TXD 发送出去***************************************************************/#in elude #i nclude #in clude typedef unsigned char uchar; int i;uchar code in fo[]= {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x 55,0x55,0x55,0x5 5 };// SCON: serail mode 1,8-bit UART // T0工作在方式1,十六位定时 // SMOD=1;0xFE; II 定时器0初始值,延时417us ,目的是令模拟串口的波特率为2400bps fosc=11.0592MHz TL0 = 0x7F; II 2400bps fosc=11.0592MHz II TH0= 0xFD; II 定时器0初始值,延时417us ,目的是令模拟串口的波特率为 2400bps fosc=18.432MHzII TL0 = 0x7F; II 定时器0初始值,延时417us ,目的是令模拟串口的波特率为 2400bps fosc=18.432MHz }void WaitTF0( void ) {sbit n ewTXD = P2A 1;〃模拟串口的发送端设为 P2.1 void Uartlnit() {SCON = 0x50; TMOD |= 0x21;PCON |= 0x80; TH0 定时器0初始值,延时417us ,目的是令模拟串口的波特率为TFO=O; THO=OxFE; // 定时器重装初值fosc=11.0592MHz TL0=0x7F; // 定时器重装初值 fosc=11.0592MHzvoid WByte(uchar in put) {//发送启始位 uchar j=8; TR0=1; newTXD=(bit)O; WaitTF0();//发送8位数据位 while (j--) {newTXD=(bit)(i nput&0x01); WaitTF0(); in put= in put>>1; } //发送校验位(无) //发送结束位n ewTXD=(bit)1; WaitTF0(); TR0=0; }void Sendata() {for (i=0;i<="">WByte(i nfo[i]); } }void main() {UartI nit(); while (1) {// TH0 =0xFD; //TL0=0x7F;// }// 定时器重装初值fosc=18.432MHz 定时器重装初值fosc=18.432MHz//先传低位//外层循环,遍历数组}}II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II IIa a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a/************************************************************** ** 模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口* 在单片机上模拟了一个串口,使用P3.2作为发送和接收端* 以P3.2模拟串口接收端,从模拟串口接收数据发至串口*************************************************************** /#in elude#i nclude#in cludetypedef unsigned char uchar ;//这里用来切换晶振频率,支持11.0592MHz 和18.432MHz//#defi ne F18_432#defi ne F11_0592uchar tmpbuf2[64]={0};//用来作为模拟串口接收数据的缓存struct{uchar recv :6 ;//tmpbuf2 数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中uchar send :6 ;//tmpbuf2 数组下标,用来将tmpbuf2中的数据发送到串口}tmpbuf2_poi nt={0,0};sbit newRXD=P3A2 ; //模拟串口的接收端设为P3.2void Uartl nit(){SCON=0x50 ; // SCON: serail mode 1, 8-bit UARTTMOD|=0x21 ; // TMOD: timer 1, mode 2, 8-bit reload, 自动装载预置数(自动将TH1 送到TL1);T0工作在方式1,十六位定时PCON|=0x80 ;// SMOD=1;#ifdef F11_0592TH1=0xE8 ; // Baud:2400 fosc=11.0592MHz 2400bps 为从串口接收数据的速率TL1=0xE8 ;//计数器初始值,fosc=11.0592MHz 因为TH1 一直往TL1送,所以这个初值的意义不大THO=OxFF ;//定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bpsfosc=11.0592MHzTL0=0xA0 ; //定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bps fosc=11.0592MHz#en dif#ifdef F18_432TH 仁0xD8 ; // Baud:2400 fosc=18.432MHz 2400bps 为从串口接收数据的速率TL1=0xD8 ; // 计数器初始值,fosc=18.432MHz 因为TH1 一直往TL1送,所以这个初值的意义不大TH0=0xFF ; //定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18.432MHzTL0=0x60 ;//定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps fosc=18.432MHz#en difIE|=0x81 ;//中断允许总控制位EA=1;使能外部中断0TF0=0 ;IT0=1 ;//设置外部中断0为边沿触发方式TR1=1 ;//启动TIMER1,用于产生波特率}void WaitTF0( void ){while (!TF0);TF0=0 ;#ifdef F11_0592TH0=0xFF ; // 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz TL0=0xA0 ; // 定时器重装初值模拟串口的波特率为9600bps fosc=11.0592MHz #en dif#ifdef F18_432TH0=0xFF ;//定时器重装初值fosc=18.432MHzTL0=0x60 ;//定时器重装初值fosc=18.432MHz#en dif}//接收一个字符uchar RByte(){uchar Output=0 ;#ifdef F11_0592THO=OxFF ; //定时器重装初值 TLO=OxAO ; // 定时器重装初值#en dif #ifdef F18_432TH0=0xFF ; // 定时器重装初值fosc=18.432MHzTL0=0x60 ;// 定时器重装初值 fosc=18.432MHz #en difTF0=0 ;WaitTF0(); //等过起始位 //接收8位数据位 while (i--) {Output>>=1 ;if (newRXD)0utput|=0x80 ; // 先收低位WaitTF0(); //位间延时}TR0=0 ; // 停止 Timer0 return Output ; }//向COM1发送一个字符void Sen dChar(uchar byteToSe nd) {SBUF=byteToSe nd ; while (!TI); TI=0 ; }void mai n() {UartI nit(); while (1) {if (tmpbuf2_point.recv!=tmpbuf2_point.send) //差值表示模拟串口接收数据缓存中还有多少个字节的数据未被处理(发送至串口){Sen dChar(tmpbuf2[tmpbuf2_poi nt.se nd++]);uchar i=8 ; TR0=1 ;// 启动 TimerO模拟串口的波特率为 9600bps fosc=11.0592MHz 模拟串口的波特率为 9600bps fosc=11.0592MHz}}}//夕卜部中断0,说明模拟串口的起始位到来了void Simulated_Serial_Start()interrupt 0{EX0=0 ; //屏蔽外部中断0tmpbuf2[tmpbuf2_point.recv++]=RByte(); // 从模拟串口读取数据,存放到tmpbuf2 数组中IE0=0 ; //防止外部中断响应2次,防止外部中断函数执行2次EX0=1 ; //打开外部中断0}以上是两个独立的测试程序,分别是模拟串口发送的测试程序和接收的测试程序上面两个程序在编写过程中参考了这篇文章《51单片机模拟串口的三种方法》(在后文中简称《51》),但在它的基础上做了一些补充,下面是若干总结的内容:1、《51》在接收数据的程序中,采用的是循环等待的方法来检测起始位(见《51》的附:51 10 口模拟串口通讯C源程序(定时器计数法)”部分),这种方法在较大程序中,可能会错过起始位(比如起始位到来的时候程序正好在干别的,而没有处于判断起始位到来的状态),或者一直在检测起始位,而没有办法完成其他工作。

单片机原理及应用A-题库

单片机原理及应用A-题库

单片机原理及应用A-题库1、单片机就是把(CPU)、( 输入输出)、和( 存储器 )等部件都集成在一个电路芯片上,并具备一套功能完善的( 指令系统 ),有的型号同时还具备( AD )和( DA )等功能部件,其简称为( 微处理器 )或(微控制器)。

2、当扩展外部存储器或I/O口时,P2口用作(地址线的高8位)。

3、MCS-51单片机内部RAM区有(4)个工作寄存器区。

4、MCS-51单片机内部RAM区有128个位地址5、若不使用89C51片内的程序存储器,引脚()需要接地。

6、当MCS-51引脚(ALE)信号有效时,表示从P0口稳定地送出了低8位地址.7、在单片机的RESET端出现(2)个机器周期以上的高电平时,便可以可靠复位8、MCS-51系列单片机有:(外部中断0), (外部中断1), (定时/计数器T0溢出中断),(定时/计数器T1溢出中断), (串行口)等5个中断请求源。

9、C51中“!”运算符的作用是(取反)10、所谓的单片机,就是将CPU、存储器、定时计数器、中断功能以及I/O设备等主要功能部件都集成在一块超大规模集成电路的微型计算机。

(正确)11、8051单片机,程序存储器数和数据存储器扩展的最大范围都是一样的。

(正确)12、8位二进制数构成一个字节,一个字节所能表达的无符号数的范围是0-255。

(正确)13、8051中的工作寄存器就是内部RAM中的一部份。

(正确)14、使用89C51且 =0时,可外扩64KB的程序存储器。

(错误)15、因为MCS-51 可上电复位,因此,MCS-51系统也可以不需要复位电路。

(错误)16、一个函数利用return可同时返回多个值。

(错误)17、89C51每个中断源相应地在芯片上都有其中断请求输入引脚。

(错误)18、中断初始化时,对中断控制器的状态设置,只可使用位操作指令,而不能使用字节操作指令。

(错误)19、89C51单片机五个中断源中优先级是高的是外部中断0,优先级是低的是串行口中断。

89C51串行通信

89C51串行通信

12
51单片机的串行口的工作方式 单片机的串行口的工作方式
数据接收的有效性:
如果RI=0、SM2=0,则接收的数据送入SBUF,停止 位送入RB8,置RI=1;向CPU申请中断。 如果RI=0、SM2=1,那么只有停止位为1才发生上述 操作。 如果RI=0、SM2=1,且停止位为0,则接收的数据丢 弃。 如果RI=1,则接收的数据在任何情况下都不装入 SBUF,即数据丢失。
单片机实训
执行校长
单片机实训(第一讲下) 单片机实训(第一讲下)
教学内容
串行通信的基本概念 51单片机的串行口的功能与结构 单片机的串行口的功能与结构 51单片机的串行口的工作方式 单片机的串行口的工作方式 51单片机的串行口的波特率设置 单片机的串行口的波特率设置 多机通信
2
重点、 重点、难点
9
51单片机的串行口的功能与结构 单片机的串行口的功能与结构
RI——接收中断标志位 RI——接收中断标志位 —— 当一帧数据接收完成后,由内部硬件使RI置位, RI置位 当一帧数据接收完成后,由内部硬件使RI置位,向 CPU请求中断 中断响应后必须用软件清0 RI也可 请求中断。 CPU请求中断。中断响应后必须用软件清0。RI也可 供查询使用。 供查询使用。
发送时:第9位数据由 位数据由SCON中的 中的TB8位提供; 位提供; 发送时: 位数据由 中的 位提供 接收时:当第9位数据进入移位寄存器后 将前8位 位数据进入移位寄存器后, 接收时:当第 位数据进入移位寄存器后,将前 位 数据送入SBUF中,第9位装入 位装入SCON中的 中的RB8。 数据送入 中 位装入 中的 。
主要由发送数据缓冲器、发送控制器、输出控制门、 接收控制器、输入移位寄存器等组成。

单片机实用教程_8 89C51单片机并行输入输出

单片机实用教程_8 89C51单片机并行输入输出

P3 口的第二功能
口线 P3.0 P3.1 信号 RXD TXD 功 能 串行口数据输入(接收数据) 串行口数据输出(发3.5
P3.6 P3.7
INT0 INT1 T0 T1
WR RD
外部中断0输入 外部中断1输入 定时器0的外部输入(计数输入) 定时器1的外部输入(计数输入)
外部数据存储器写选通控制输出 外部数据存储器读选通输出控制
8.2 并行输入/输出端口P0、P1、P1和P3 8.2.1 P0端口 ⑴ P0口的结构: P0口有8位, 每一位由一个输出锁存器、两个三态 输入缓冲器和输出驱动电路及控制电路组成。
⑵ P0口作通用的I/O口使用

P0口是漏极开路的8位准双向I/O口. P0口为特殊功能寄存器, 既可以用直接寻址方式对P0口进行字节操作, 也可以按按位寻址方式,进行位操作。
P2端口及其各位的地址
位地址/位定义 A5H P2.5 A4H P2.4 A3H P2.3 A2H P2.2 A1H P2.1 LSB A0H P2.0 字节地址 A0H
P2口作输出时,直接用传送指令进行操作。 例如: MOV P2 ,A P2口作输入时, 要先写“1”, 然后读入(准双向口)。 例如: MOV P2 ,#0FFH MOV A ,P2
表8.1 P0端口及其各位的地址
SFR MSB 位地址/位定义 LSB 字节地址
P0
87H
P0.7
86H
P0.6
85H
P0.5
84H
P0.4
83H
P0.3
82H
P0.2
81H
P0.1
80H
P0.0
80H
P0口作输出时,直接用传送指令进行操作。 例如: MOV P0 ,A P0口作输入时,要先写“1”,然后读入(准双向口)。 例如: MOV P0 ,#0FFH MOV A ,P0

单片机第7章89C51串行口和串行通信PPT课件

单片机第7章89C51串行口和串行通信PPT课件

4
7.1 串行通信的概念
• 在实际工作中,计算机的CPU与外部设备之间常常要进 行信息交换,一台计算机与其他计算机之间也往往要交 换信息,所有这些信息交换均可称为通信。
• 通信方式有两种,即并行通信和串行通信。
• 通常根据信息传送的距离决定采用哪种通信方式。
• 例如,在IBM-PC机与外部设备(如打印机等)通信时, 如果距离小于30m,可采用并行通信方式;当距离大于 30m时,则要采用串行通信方式。89C51单片机具有并 行和串行二种基本通信方式。
字 同 符 步 1 字 同 符 步 2 数 据 块 ( 若 干 字 节 )校 符 验 1 校 符 验 2
起 始
结 束
➢ 在这种通信方式中,数据块内的各位数据之间没有间 隔,传输效率高;
➢ 发送、接收双方必须保持同步(使用同一时钟信号), 且数据块长度越大,对同步要求就越高。
➢ 同步通信设备复杂,成本高,一般只用在高速数字通 信系统中。
• 在同步传送时,要求用时钟来实现发送端与接收端之间的同步。为了保 证接收正确无误,发送方除了传送数据外,还要同时传送时钟信号。
• 同步传送可以提高传输速率(达56kb/s或更高),但硬件比较复杂。
返回
28.09.2020
14
2、异步通信
• 起始位(0)信号只占用一位,用来通知接收设备一个待接收的字符开始到达。线路上在不 传送字符时应保持为1。接收端不断检测线路的状态,若连续为1以后又测到一个0,就知道 发来一个新字符, 应马上准备接收。字符的起始位还被用作同步接收端的时钟,以保证以 后的接收能正确进行。
28.09.2020
1
第七章 89C51串行口及串行通信技术
• 串行通信只用一位数据线传送数据的位信号,即使加上几 条通信联络控制线,也用不了很多电缆线。因此,串行通 信适合远距离数据传送,如大型主机与其远程终端之间、 处于两地的计算机之间采用串行通信就非常经济。当然, 串行通信要求有转换数据格式、时间控制等逻辑电路,这 些电路目前已被集成在大规模集成电路中(称为可编程串 行通信控制器),使用很方便。

51单片机串口通信

51单片机串口通信
主目录 上一页 下一页 结 束
单片机原理及应用
在逻辑上,SBUF只有一个,它既表示发送寄 存器,又表示接收寄存器,具有同一个单元地址 99H。但在物理结构上,则有两个完全独立的 SBUF,一个是发送缓冲寄存器SBUF,另一个是 接收缓冲寄存器SBUF。如果CPU写SBUF,数据 就会被送入发送寄存器准备发送;如果CPU读 SBUF,则读入的数据一定来自接收缓冲器。即 CPU对SBUF的读写,实际上是分别访问上述两 个不同的寄存器。
主目录 上一页 下一页 结 束
单片机原理及应用
2. 串行控制寄存器SCON 串行控制寄存器SCON用于设置串行口的工作
方式、监视串行口的工作状态、控制发送与接收 的状态等。它是一个既可以字节寻址又可以位寻 址的8位特殊功能寄存器。其格式如图9.9所示。
主目录 上一页 下一页 结 束
单片机原理及应用
主目录 上一页 下一页 结 束
单片机原理及应用
(1)SM0 SM1:串行口工作方式选择位。其状态 组合所对应的工作方式如表9-1所示。
SM0 SM1 00
01
10
11
表9-1 串行口工作方式
工作方式
功 能说 明
0 1 2 3 主目录
同步移位寄存器输入/输出,波特率固定 为fosc/12
10位异步收发,波特率可变(T1溢出率/n, n=32或16)
主目录 上一页 下一页 结 束
单片机原理及应用
(2) 数据位: 在起始位之后,发送端发出(或接收端接收)的是
数据位,数据的位数没有严格的限制,5~8位均 可。由低位到高位逐位传送。
(3) 奇偶校验位: 数据位发送完(接收完)之后,可发送一位用来检
验数据在传送过程中是否出错的奇偶校验位。奇 偶校验是收发双方预先约定好的有限差错检验方 式之一。有时也可不用奇偶校验。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

89C51 单片机 I/O 口模拟串行通信的实现方法
目前普遍采用的 MCS51 和 PIC 系列单片机通常只有一个(或没有)UART异步串行通信接口,在应用系统中若需要多个串行接口(例如在多机通信系统中,主机既要和从机通信又要和终端通信)的情况下,通常的方法是扩展一片8251或 8250通用同步/异步接收发送芯片(USART),需额外占用单片机I/O 资源。

本文介绍一种用单片机普通I/O 口实现串行通信的方法,可在单片机的最小应用系统中实现与两个以上串行接口设备的多机通信。

1.串行接口的基本通信方式
串行接口的有异步和同步两种基本通信方式。

异步通信采用用异步传送格式,如
图 1 所示。

数据发送和接收均将起始位和停止位作为开始和结束的标志。

在异步通信中,起始位占用一位(低电平),用来表示字符开始。

其后为7或8位的数据编码,第8 位通常做为奇偶校验位。

最后为停止位(高电平)用来表示字符传送结束。

上述字符格式通常作为一个串行帧,如无奇偶校验位,即为常见的 N.8.1 帧格式。

串行通信中,每秒传送的数据位称为波特率。

如数据传送的波特率为1200 波特,采用 N.8.1 帧格式(10 位),则每秒传送字节为 120 个,而字节中每一位传送时间即为波特率的数:T=I/1200=0.833ms。

同样,如数据传送的波特率为9600 波特,则字节中每一位传送时间为 T=1/9600=0.104 ms。

根据数据传送的波特率即字节中每一位的传送时间,我们便可用普通I/O 口来模拟实现串行通
信的时序。

2.硬件电路
89C51 单片机通过普通 I/O 口与 PC 机 RS232 串口实现通信的硬件接口电路如图 2 所示。

由于 PC 系列微机串行口为 RS232C 标准接口,与输入、输出均采用 TTL 电平的 89C51 单片机在接口规范上不一致,因此 TTL 电平到 RS232 接口电平的转换采用 MAXIM 公司的 MAX232 标准RS232 接口芯片,该芯片可以用单电压(+5V)实现 RS232 接口逻辑“1”(-3V~15V)和逻辑“0”(+3V~15V)的电平转换。

图中 89C51 的 P1.0 模拟发送端,P1.1 模拟接收端。

3.接口程序设计
软件设计中,89C51 单片机的 P1.0 和 P1.1 口分别模拟串行通信的发送和接收,其接口程序主要由 INPUT 发送子程序和OUTPUT 接收子程序组成。

通信速率 1200 bit /s,帧格式为 N.8.1。

发送时,先发送一个起始位(低电平),接着按低位在先的顺序发送8位数据,最后发送停止位。

接收时,先判断P1.1接收端口是否有起始低电平出现,如有则按低位在先的顺序接收 8 位数,最后判
断 P1.1 口是否有停止高电平出现,如有则完成一个数据接收,否则继续等待。

其中软件编写要严格按照异步通
信的时序进行,每 bit 位传送时间间隔按通信速率 1200 bit /s 计算为
833μs。

其模拟串行通信程序清单见下,系统要求单片机晶振为 6M。

程序清单如下:
TXD EQU P1.0
RXD EQU P1.1 ;定义 89C51 P1.0 为发送端,P1.1 为接收端
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV A, #30H
MOV R5,#N
SETB RXD ;P1.0 置高
TX: LCALL INPUT ;调用发送子程序,将寄存器 A 中内容发给 PC 机

SETB TXD ;P1.1 置高
MOV R0,#40H
RX: LCALL OUTPUT ;调用接收子程序,将接收的 N 个数据存放在以 40H 开始的地址中
MOV @R0,A
INC R0
DJNZ R5, RX ;N 个数据接收结束,则等待,否则转 RX 继续接收
AJMP $
;**************延时 833μs 子程序***** DEL833: MOV R7 ,#205
MS11: DJNZ R7,MS11
RET
; **********************************
;******** 89C51 发送数据给 PC 机子程序**** INPUT: CLR C
MOV TXD,C ;发送起始位
LCALL DEL833 ;延时
MOV R3,#8
REP: RRC A
MOV TXD ,C
LCALL DEL833
DJNZ R3,REP ;发送 8 位数据
SETB C ;发送停止位
MOV TXD,C
LCALL DEL833
RET
;********从 PC 机接收数据子程序******** OUTPUT: JB RXD, $ ;判断是否有起始位出现LCALL DEL833
MOV R3,#8
OUT: MOV C ,RXD
RRC A
LCALL DEL833
DJNZ R3,OUT ;接收 8 位数据
JNB RXD ,$ ;判断是否有停止位出现
RET
本文介绍的用 89C51 单片机I/O口模拟实现串行通信的方法,已成功地应用在某电压数据采集系统中,实践证明能可靠地传送和接收数据.。

相关文档
最新文档