51单片机教程:单片机串行口通信程序设计

合集下载

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。

本文将介绍使用C语言编写51单片机的串口通信程序。

1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。

首先,我们需要一块51单片机开发板,内置了串口通信功能。

另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。

2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。

在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。

同时,我们还需要引入头文件来定义串口通信的相关寄存器。

3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。

这些参数的配置需要根据实际需要进行调整。

在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。

4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。

初始化串口的过程包括打开串口、设置中断等。

5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。

阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。

6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。

在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。

7. 中断处理在串口通信中,中断是一种常见的处理方式。

通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。

8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。

```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。

51单片机的串口通信程序

51单片机的串口通信程序

单片机串口通信程序#include <reg52.h>#include<intrins.h>#include <stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned intsbit Key1 = P2^3;sbit Key2 = P2^2;sbit Key3 = P2^1;sbit Key4 = P2^0;sbit BELL = P3^6;sbit CONNECT = P3^7;unsigned int Key1_flag = 0;unsigned int Key2_flag = 0;unsigned int Key3_flag = 0;unsigned int Key4_flag = 0;unsigned char b;unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x 02,0x78,0x00,0x10,0x89};unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF};unsigned char Disbuf[4];void delayms(uint t){uint i;while(t--){/* 对于11.0592M时钟,约延时1ms */for (i=0;i<125;i++){}}}//-----------------------------------------------------void SendData(uchar Dat){uchar i=0;SBUF = Dat;while (1){if(TI){TI=0;break;}}}void ScanKey(){if(Key1 == 0){delayms(100);if(Key1 == 0){Key1_flag = 1;Key2_flag = 0;Key3_flag = 0;Key4_flag = 0;Key1 = 1;}else;}if(Key2 == 0){delayms(100);if(Key2 == 0){Key2_flag = 1;Key1_flag = 0;Key3_flag = 0;Key4_flag = 0;Key2 = 1;}else;}if(Key3 == 0){delayms(50);if(Key3 == 0){Key3_flag = 1;Key1_flag = 0;Key2_flag = 0;Key4_flag = 0;Key3 = 1;}else;}if(Key4 == 0){delayms(50);if(Key4 == 0){Key4_flag = 1;Key1_flag = 0;Key2_flag = 0;Key3_flag = 0;Key4 = 1;}else;}else;}void KeyProc(){if(Key1_flag){TR1 = 1;SendData(0x55);Key1_flag = 0;}else if(Key2_flag){TR1 = 1;SendData(0x11);Key2_flag = 0;}else if(Key3_flag){P1=0xff;BELL = 0; CONNECT = 1;Key3_flag = 0;}else if(Key4_flag){CONNECT = 0;BELL = 1;Key4_flag = 0;}else;}void Initdisplay(void){Disbuf[0] = 1;Disbuf[1] = 2;Disbuf[2] = 3;Disbuf[3] = 4;}void Display() //显示{unsigned int i = 0;unsigned int temp,count;temp = Disdigit[count];P2 =temp;temp = Disbuf[count];temp = Num[temp];P0 =temp;count++;if (count==4)count=0;}void time0() interrupt 1 using 2 {Display();TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;}void main(){Initdisplay();TMOD = 0x21;TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;TR0 = 1;ET0 = 1;TH1 = 0xFD; //11.0592MTL1 = 0xFD;PCON&=0x80;TR1 = 1;ET1 = 1;SCON = 0x40; //串口方式REN = 1;PT1 = 0;PT0 = 1;EA = 1;while(1){ScanKey();KeyProc();if(RI){Disbuf[0] = 0;Disbuf[1] = 20;Disbuf[2] = SBUF>>4;Disbuf[3] = SBUF&0x0f;RI = 0;}else;}}。

51单片机双机串行通信设计

51单片机双机串行通信设计

51单片机双机串行通信设计51单片机是一款广泛应用于嵌入式系统中的微控制器,具有高性能和低功耗的特点。

在一些场景中,需要使用51单片机之间进行双机串行通信,以实现数据传输和协同工作。

本文将介绍51单片机双机串行通信的设计,包括硬件连接和软件编程。

一、硬件连接1.串行通信口选择:51单片机具有多个串行通信口,如UART、SPI 和I2C等。

在双机串行通信中,可以选择其中一个串行通信口作为数据传输的接口。

一般来说,UART是最常用的串行通信口之一,因为它的硬件接口简单且易于使用。

2.引脚连接:选定UART口作为串行通信口后,需要将两个单片机之间的TX(发送)和RX(接收)引脚相连。

具体的引脚连接方式取决于所使用的单片机和外设,但一般原则上是将两个单片机的TX和RX引脚交叉连接。

二、软件编程1.串行通信初始化:首先需要通过软件编程来初始化串行通信口。

在51单片机中,可以通过设置相应的寄存器来配置波特率和其他参数。

具体的初始化代码可以使用C语言编写,并根据所使用的开发工具进行相应的配置。

2.发送数据:发送数据时,可以通过写入相应的寄存器来传输数据。

在51单片机中,通过将数据写入UART的发送寄存器,即可将数据发送出去。

发送数据的代码通常包括以下几个步骤:(1)设置发送寄存器;(2)等待数据发送完成;(3)清除数据发送完成标志位。

3.接收数据:接收数据时,需要通过读取相应的寄存器来获取接收到的数据。

在51单片机中,可以通过读取UART的接收寄存器,即可获取到接收到的数据。

接收数据的代码通常包括以下几个步骤:(1)等待数据接收完成;(2)读取接收寄存器中的数据;(3)清除数据接收完成标志位。

4.数据处理:接收到数据后,可以进行相应的数据处理。

根据具体的应用场景,可以对接收到的数据进行解析、计算或其他操作。

数据处理的代码可以根据具体的需求进行编写。

5.中断服务程序:在双机串行通信中,使用中断可以提高通信的效率。

C51编写 串口通信程序

C51编写 串口通信程序

异步通信的数据格式 :
一个字符帧 空 闲 起 始 位 数据位 校 验 位 停 止 位 空 闲
下一字符 起始位
LSB
MSB
异步通信的特点:不要求收发双方时钟的 严格一致,实现容易,设备开销较小,但 每个字符要附加2~3位用于起止位,各帧 之间还有间隔,因此传输效率不高。
2、同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制, 使双方达到完全同步。此时,传输数据的位之间的距离均 为“位间隔”的整数倍,同时传送的字符间不留间隙,即 保持位同步关系,也保持字符同步关系。发送方对接收方 的同步可以通过两种方法实现。
串行通信是将数据字节分成一位一位的形 式在一条传输线上逐个地传送。
接 收 设 备
D0 D7
8位顺次传送
发 送 设 备
串行通信的特点:传输线少,长距离传送时 成本低,且可以利用电话网等现成的设备, 但数据的传送控制比并行通信复杂。
7.1.1 串行通信的基本概念
一、异步通信与同步通信
1、异步通信 异步通信是指通信的发送与接收设备使用各自的时钟 控制数据的发送和接收过程。为使双方的收发协调,要求 发送和接收设备的时钟尽可能一致。
面向位的同步格式 :
8位 01111110 8位 地址场 8位 控制场 ≥0位 信息场 16位 校验场 8位 01111110
此时,将数据块看作数据流,并用序列01111110作为开始 和结束标志。为了避免在数据流中出现序列01111110时引起 的混乱,发送方总是在其发送的数据流中每出现5个连续的1 就插入一个附加的0;接收方则每检测到5个连续的1并且其后 有一个0时,就删除该0。 典型的面向位的同步协议如ISO的高级数据链路控制规程 HDLC和IBM的同步数据链路控制规程SDLC。 同步通信的特点是以特定的位组合“01111110”作为帧的 开始和结束标志,所传输的一帧数据可以是任意位。所以传 输的效率较高,但实现的硬件设备比异步通信复杂。

80C51单片机串口通信(含原程序)

80C51单片机串口通信(含原程序)
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
buf=NUMCODETAB[num];
transbyte(buf);
void send(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void delay(void)
{
uchar x,y;
for(x=0;x<220;x++)
for(y=0;y<250;Leabharlann ++);}
void main(void)
{
uchar i;
TMOD=0x20;
SCON=0x40;
并将这些代码用发光二极管在发送端显示(流水灯效果)。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit DIPIN = P1^3;
uint num;
uchar receive (void)
{
uchar dat;
while(RI==0);
RI=0;
dat=SBUF;
SBUF=dat;
return dat;
}
unsigned char code NUMCODETAB[]={0xFC,0x60,0xDA,0xF2, //数字0,1,2,3

51单片机串口通信(相关例程)

51单片机串口通信(相关例程)

51单片机串口通信(相关例程) 51单片机串口通信(相关例程)一、简介51单片机是一种常用的微控制器,它具有体积小、功耗低、易于编程等特点,被广泛应用于各种电子设备和嵌入式系统中。

串口通信是51单片机的常见应用之一,通过串口通信,可以使单片机与其他外部设备进行数据交互和通信。

本文将介绍51单片机串口通信的相关例程,并提供一些实用的编程代码。

二、串口通信基础知识1. 串口通信原理串口通信是通过串行数据传输的方式,在数据传输过程中,将信息分为一个个字节进行传输。

在51单片机中,常用的串口通信标准包括RS232、RS485等。

其中,RS232是一种常用的串口标准,具有常见的DB-9或DB-25连接器。

2. 串口通信参数在进行串口通信时,需要设置一些参数,如波特率、数据位、停止位和校验位等。

波特率表示在单位时间内传输的比特数,常见的波特率有9600、115200等。

数据位表示每个数据字节中的位数,一般为8位。

停止位表示停止数据传输的时间,常用的停止位有1位和2位。

校验位用于数据传输的错误检测和纠正。

三、串口通信例程介绍下面是几个常见的51单片机串口通信的例程,提供给读者参考和学习:1. 串口发送数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendChar(unsigned char dat){SBUF = dat; // 发送数据while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志}void main(){UART_Init(); // 初始化串口while (1){UART_SendChar('A'); // 发送字母A}}```2. 串口接收数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_Recv(){unsigned char dat;if (RI) // 检测是否接收到数据{dat = SBUF; // 读取接收到的数据 RI = 0; // 清除接收中断标志// 处理接收到的数据}}void main(){UART_Init(); // 初始化串口EA = 1; // 允许中断ES = 1; // 允许串口中断while (1)// 主循环处理其他任务}}```3. 串口发送字符串```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendString(unsigned char *str){while (*str != '\0')SBUF = *str; // 逐个发送字符while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志str++; // 指针指向下一个字符}}void main(){UART_Init(); // 初始化串口while (1){UART_SendString("Hello, World!"); // 发送字符串}}```四、总结本文介绍了51单片机串口通信的基础知识和相关编程例程,包括串口发送数据、串口接收数据和串口发送字符串。

单片机设计教案-项目8 任务2:MCS-51单片机的串行接口及串行通信


… 0/1 1
0 D0 D1 D2 D3 D4 D5 D6 D7 0/1 1

8位 数 据
奇偶 停

校验 止


(a)
0 D0 D1 …
第 n字 符 帧
空闲位
第 n+ 1字 符 帧
… 1 1 0 D0 D1 D2 D3 D4 D5 D6 D7 0/1 1 1 1 1 0 D0 D1 …

8位 数 据
奇偶 停

校验 止


图8.3 异步通信的字符帧格式 (a) 无空闲位字符帧;(b) 有空闲位字符帧
单片机应用技术
(1) 起始位:位于字符帧开头,只占一位,为逻辑0低电平,用于向接收设 备表示发送端开始发送一帧信息。
(2) 数据位:紧跟起始位之后,用户根据情况可取5位、6位、7位或8位, 低位在前高位在后。
UART , 即 通 用 异 步 接 收 器 / 发 送 器 ( Universal Asychronous Receiver/Transmitter ) ; 能 够 完 成 同 步 通 信 的 硬 件 电 路 称 为 USRT (Universal Sychronous Receiver/Transmitter);既能够完成异步又 能 同 步 通 信 的 硬 件 电 路 称 为 USART ( Universal Sychronous Asychronous Receiver/Transmitter);
1. 异步通信(Asynchronous Communication) 在异步通信中,数据通常是以字符为单位组成字符帧传送的。字符帧由发送端
一帧一帧地发送,每一帧数据均是低位在前,高位在后,通过传输线被接收端一帧一 帧地接收。发送端和接收端可以由各自独立的时钟来控制数据的发送和接收,这两个 时钟彼此独立,互不同步。

51单片机串口通信程序。。含详细例子


{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();

51单片机串口通信程序

51单片机串口通信程序51单片机是我国自主研发的一款微控制器,在国内广泛应用于各种电子设备中。

在很多应用场景中,需要通过串口进行通信,以实现数据传输。

本文将介绍51单片机串口通信程序的编写方法。

一、串口介绍串口是一种通信接口,用于在电子设备之间传输数据。

其主要特点是一条通信线路同时只能传输一位数据,因此称为串口。

串口和并口属于不同的通信接口标准。

串口的优点是具有通信距离远、传输速率快、可靠性高等优点,因此广泛应用于各种场合中。

串口有两种工作模式:同步模式和异步模式。

在实际应用中,异步串口通信更为常见。

二、异步串口通信原理在异步串口通信中,数据的传输是通过发送端和接收端的时钟信号不同步实现的。

在发送数据时,发送端会发出一个起始位,接下来是数据位,最后是一个或多个停止位。

在接收端,当检测到起始位时,开始接收数据。

根据通信协议,在接收完数据位后,接收端会判断是否正确,然后再结束本次通信。

1. 硬件连接在51单片机和电脑之间进行串口通信,需要用到串口转USB线。

将串口转USB线的TxD接口与51单片机的P3.1接口相连,RxD接口与P3.0接口相连。

此外,需要一个5V的电源供给51单片机。

2. 准备工作在编写程序之前,需要进行一些准备工作:(1)将P3口设为外部中断P3口的最低2位是外部中断的2个输入端,需要将它们设为中断输入。

EA=1;EX0=1;(2)设置波特率串口通信需要设置波特率。

常见的波特率有9600、19200、38400等。

对应的波特率常数为0xFD、0xFA、0xF4等。

TH1=0xFD;//波特率9600(3)使能串口中断在发送和接收数据时,会不断产生中断,需要将中断使能。

ES=1;//允许串口中断3. 编写程序(1)发送数据void SendData(unsigned char SendBuff[],unsigned int ULength){unsigned int i;for(i=0;i<ULength;i++){SBUF=SendBuff[i];//发送数据while(TI==0); //等待,直到发送完成TI=0;}}(2)接收数据(3)主函数TMOD|=0x20;//定时器1工作方式2TH1=0xFD;//波特率9600TR1=1;//打开定时器1SCON=0x50;//串口方式1,8位数据,无校验,1停止位EA=1;//开总中断ES=1;//开串口中断while(1){SendData(pSendData,4);//发送数据 RecvData(pRecvData,4);//接收数据if(pRecvData[0]=='K'){P0=0x01;//点亮LED}else{P0=0x00;//关闭LED}}}四、总结。

单片机C语言-第6章串行口的C51编程3


• void t0int( ) interrupt 1
• { TH0=-50000/256; TL0=-50000%256;
• i=i-1;
• while(i==0)
• { i=20;

a=~a;

SBUF=a;
•}
•}
• 修改:将上述程序改为流水灯形式。
【例6-11】串行口自收自发

将51单片机的TXD接RXD,实现单片机
• TH1=256–fosc/(波特率×12×32/2SMOD) • =256-2SMOD×13 • 当SMOD=0时:TH1=256–13=243=0F3H。 • 当SMOD=1时:TH1=256–2×13=230=0E6H。
【例6-10】编程:高4位灯和低4位灯以1s 亮1s灭的频率进行闪烁。
行初始化,以设定其溢出率。
6.3.2 编程步骤
• (1)设定波特率
• 串行接口的波特率设定方式有两种:固守波特率和可 变波特率。当采用可变波特率时,应先确定T1的计数 初值,并对T1进行初始化。当采用固定波特率(工作 方式0和工作方式2)时,该步可以省略。
• (2)填写控制字
• 设定串行口控制寄存器SCON和波特率倍增控制寄存 器PCON。
• ④中断方式接收数据:等待中断、在中断中接 收一个数据。

两种方式中,发送与接收数据后都要将TI
或RI清零。
【例6-9】波特率计算及初始化编程
• 设某51单片机系统,其串行口工作于方式3,要 求传送波特率为1200。作为波特率发生器的定 时器T1工作在模式2时,请求出计数初值为多 少?设单片机的振荡频率为6MHz。 X=256-(2SMOD×fosc)/(384×波特率)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机教程:单片机串行口通信程序设

1.串行口方式0应用编程 8051单片机串行口方式0为移位寄存
器方式,外接一个串入并出的移位寄存器,就能扩展一个并行口。

单片机串行口通信程序设计硬件连接图
例:用8051单片机串行口外接CD4094扩展8位并行输出口,如
图所示,8位并行口的各位都接一个发光二极管,要求发光管呈流
水灯状态。

串行口方式0的数据传送可采用中断方式,也可采用查
询方式,无论哪种方式,都要借助于TI或RI标志。

串行发送时,
能靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中
发送下一帧数据,或者通过查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。

在串行接收时,则由RI
引起中断或对RI查询来确定何时接收下一帧数据。

无论采用什么方式,在开始通信之前,都要先对控制寄存器SCON进行初始化。

在方
式0中将,将00H送SCON就能了。

单片机串行口通信程序设计列子
ORG 2000H
START: MOV SCON,#00H ;置串行口工作方式0
MOV A,#80H ;最高位灯先亮
CLR P1.0 ;关闭并行输出(避象传输过程中,各LED的暗红现象) OUT0: MOV SBUF,A ;开始串行输出
OUT1: JNB TI,OUT1 ;输出完否
CLR TI ;完了,清TI标志,以备下次发送
SETB P1.0 ;打开并行口输出
ACALL DELAY ;延时一段时间
RR A ;循环右移
CLR P1.0 ;关闭并行输出
JMP OUT0 ;循环
说明:DELAY延时子程序能用前面我们讲P1口流水灯时用的延时子程序,这里就不给出了。

二、串行口异步通信
org 0000H
AJMP START
ORG 30H
START:
mov SP,#5fh ;
mov TMOD,#20h ;T1: 工作模式2
mov PCON,#80h ;SMOD=1
mov TH1,#0FDH ;初始化波特率(参见表)
mov SCON,#50h ;Standard UART settings
MOV R0,#0AAH ;准备送出的数
SETB REN ;允许接收
SETB TR1 ;T1开始工作
WAIT:
MOV A,R0
CPL A
MOV R0,A
MOV SBUF,A
LCALL DELAY
JBC TI,WAIT1 ;如果TI等于1,则清TI并转WAIT1
AJMP WAIT
WAIT1: JBC RI,READ ;如果RI等于1,则清RI并转READ
AJMP WAIT1
READ:
MOV A,SBUF ;将取得的数送P1口
MOV P1,A
LJMP WAIT
DELAY: ;延时子程序
MOV R7,#0ffH
DJNZ R7,$
RET
END
将程序编译通过,写入芯片,插入实验板,用通读电缆将实验板与主机的串行口相连就能实验了。

上面的程序功能很简单,就是每隔一段时间向主机轮流送数55H和AAH,并把主机送去的数送到P1口。

能在PC端用串行口精灵来做实验。

串行口精灵在我主页上有下
载。

运行串行口精灵后,按主界面上的“设置参数”按钮进入“设置参数”对话框,按下面的参数进行设置。

注意,我的机器上用的是串行口2,如果你不是串行口2,请自行更改串行口的设置。

设置完后,按确定返回主界面,注意右边有一个下拉列表,应当选中“按16进制”。

然后按“开始发送”、“开始接收”就能了。

按此设置,实验板上应当有两只灯亮,6只灯灭。

大家能自行更改设置参数中的发送字符如55,00,FF等等,观察灯的亮灭,并分析原因,也能在主界面上更改下拉列表中的“按16进制”为“按10进制”或“按ASCII字符”来观察现象,并仔细分析。

这对于大家理解16进制、10进制、ASCII字符也是很有好处的。

程序本身很简单,又有解释,这里就不详加说明了。

三、上述程序的中断版本
org 0000H
AJMP START
org 0023h
AJMP SERIAL ;
ORG 30H
START:
mov SP,#5fh ;
mov TMOD,#20h ;T1: 工作模式2
mov PCON,#80h ;SMOD=1
mov TH1,#0FDH ;初始化波特率(参见表)
mov SCON,#50h ;Standard UART settings MOV R0,#0AAH ;准备送出的数
SETB REN ;允许接收
SETB TR1 ;T1开始工作
SETB EA ;开总中断
SETB ES ;开串行口中断
SJMP $
SERIAL:
MOV A,SBUF
MOV P1,A
CLR RI
RETI
END
本程序没有写入发送程序,大家能自行添加。

相关文档
最新文档