单片机与PC串口通信任务1的C51参考程序

合集下载

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单片机串口通信程序。

单片机与PC的串行通讯 项目实现程序

单片机与PC的串行通讯 项目实现程序

实现单片机的串行通讯的汇编语言程序如下:ORG 0000AJMP MAINORG 0100HMAIN: MOV SP, #06HMOV SCON,#50H //8位UART(1 START ,8 DA TA ,1 STOP),允许接受MOV TMOD,#20H //T1工作方式2MOV TH1, #0FDHMOV TL1, #0FDHSETB TR1KEY: MOV A, #0FFHMOV P0, AMOV A, P0JNB ACC.0, KEY0JNB ACC.1, KEY1AJMP MAINKEY0: MOV P1, #0FFHK0: JB RI,KK //是否接收到数据,有则跳至KKSJMP K0KK: MOV A,SBUF //将接收到的数据保存到累加器MOV P1,A //输出至P1CLR RI //清除RISJMP K0RETKEY1: MOV P2, #0FFHK01: JB RI,KK1 //是否接收到数据,有则跳至KKSJMP K01KK1: MOV A,SBUF //将接收到的数据保存到累加器MOV P2,A //输出至P2CLR RI //清除RISJMP K0RETEND首先是PC机事件过程与程序Dim hand As Boolean'等待回应时间到标志位,为FALSE时时间没有到,TRUE时时间到Private Sub cancel_Click ()Unload MeEndEnd SubPrivate Sub send_Click ()'变量定义Dim strsend$, strbit$Dim intsend% '发送的字符长度Dim writebuff As V ariant '写输出缓冲区Dim readbuff$ '读输入缓冲区数据strsend = txtsend.Textintsend = Len(strsend)If intsend = 0 ThenMsgBox "请输入数字字符!", , "错误"Exit SubEnd If'数据完整性验证For i = 1 To intsend Step 1strbit = Mid(strsend, i, 1)Select Case strbitCase Is < "0", Is > "9"MsgBox "输入的数据中存在非数字字符!" & vbCrLf & "请重新输入!", vbRetryCancel, "错误"txtsend.Text = ""Exit SubEnd SelectNext iOn Error GoTo comrserror'串行通信口参数设置mPort = 1 '使用Com1做为串行通信口MSComm.Settings = "9600,n,8,1" '串口属性设置MSComm.InputLen = 1 '每次从接收缓冲区读取一个字符MSComm.InputMode = comInputModeText '以字符形式从缓冲区中接受字符MSComm.InBufferCount = 0 '清除输入缓冲区MSComm.OutBufferCount = 0 '清除输出缓冲区MSComm.PortOpen = True '打开通行端口txtport.Text = "COM" & mPorttxtmsg.Text = "串口COM" & mPort & "打开成功!波特率=9600bps"'发送握手信号handle:hand = False '开始发送握手信号时回应标志位为FALSEwritebuff = Chr$(&HFF) '准备握手信号&HffhMSComm.Output = writebuff '发送握手信号Timer.Enabled = True '启动应答定时器DoDoEventsIf hand ThenGoTo handle '定时时间到未收到回应信号重发握手信号End IfLoop Until MSComm.InBufferCount '等待回应'收到对方的回应Timer.Enabled = False'读取并判断是否为规定的联络信号readbuff = MSComm.InputIf Asc(readbuff) = 255 Thenwritebuff = Chr$(intsend)MSComm.Output = writebuff '收到正确的回应,发送字符个数和数据writebuff = strsendMSComm.Output = writebuffMSComm.PortOpen = False '发送完数据关闭端口Exit SubElseGoTo handleEnd Ifcomrserror:End SubPrivate Sub Timer_Timer()Timer.Enabled = Falsehand = True '定时间到关闭定时器,设置标志位End SubPrivate Sub txtsend_Click()txtsend.Text = ""End Sub然后是单片机的源程序datanum equ 20h ;存放接收到的数据个数dataadd equ 30h ;接收到的数据存放的地址org 0000hljmp mainorg 000bhljmp t0_intorg 0100h;主程序main: mov sp,#0fh ;从0fh开始设置堆栈mov tmod,#22h ;T0、T1工作于自动重装载方式mov th1,#0fdhmov tl1,#0fdhsetb tr1 ;晶振频率11.059Mhz,波特率设置为9600mov scon,#50h ;设置串行口工作于方式一mov 50h,#40mov 51h,#100mov th0,#6mov tl0,#6 ;1s定时初始化setb tr0 ;开定时器T0setb et0 ;开定时器T0中断setb ea ;开总中断mov datanum,#0 ;初始时接收数据的个数为0 display: mov r7,#6mov r0,#40hcl_next: mov @r0,#0inc r0djnz r7,cl_next ;数据显示区初始化display0: mov r0,#45h ;r0执行待输出的数据地址处mov r7,#6 ;扫描次数mov r6,#0feh ;r6存放数码管的位码,显示初始化display1: mov p0,r6 ;P0口输出位码mov p2,@r0 ;P2口输出段码dec r0 ;r0指向下一个待输出的段码mov a,r6rl a ;位码左移mov r6,ajbc ri,handle ;display_jmp: djnz r7,display1 ;显示未结束继续本次显示sjmp display0handle: mov r5,sbuf ;接收握手信号cjne r5,#0ffh,display_jmp ;非规定的握手信号mov sbuf,#0ffh ;应答握手信号jnb ti,$ ;等待发送结束clr tijnb ri,$ ;等待接受串行传输的字符个数clr rimov a,sbuf ;接收字符个数jz display_jmp ;没有收到数据mov datanum,a ;保存新数据的个数data_ti: setb f0mov r1,#dataadddata_get: jnb ri,$clr rimov @r1,sbuf ;将数据存入数据区inc r1djnz acc,data_get ;接收下一个字符lcall asctoduan ;调用Ascii码转段码程序ljmp display;Ascii码转换成段码子程序asctoduan: mov r1,#dataadd ;r1指向待转换的数据mov r2,datanum ;r2放转换个数mov dptr,#duanma ;dptr指向段码表loop: mov a,@r1 ;取转换数据clr c ;清除借位位subb a,#48movc a,@a+dptr ;取数据的段码mov @r1,ainc r1djnz r2,loop ;数据未转换完,继续setb rs0 ;选用寄存器组一mov r0,#dataaddmov r2,datanum;setb f0 ;新数据送入显示缓冲区clr rs0 ;ret;定时器T0中断子程序,实现数据动态显示t0_int: djnz 51h,intout ;内层循环未结束退出中断程序djnz 50h,intout0 ;外层循环未结束退出中断程序;定时1s时间到执行移位显示操作setb rs0 ;选用工作寄存器组一mov 0fh,40h ;40h单元暂存mov 40h,41hmov 41h,42hmov 42h,43hmov 43h,44hmov 44h,45h ;显示缓冲区数据左移一位jb f0,datamove ;f0=1允许移动数据,否则不允许mov 45h,0fh ;原40h单元数据放入45h中sjmp intout1 ;退出中断程序,为下次左移做准备;将数据区中的数据移动到显示缓冲区的45h单元datamove: mov 45h,@r0 ;将R0指向的数据区中的数据传送到显示缓冲区inc r0 ;r0指向下一个待移动的数据djnz r2,intout1 ;没有全部移入,退出为下次移动做准备mov r3,datanumcjne r3,#6,datamove0 ;不等于6时判定大于还是小于6 datamove1: clr f0 ;等于6时不允许sjmp intout1datamove0: jc datamove1 ;小于6不允许mov r0,#dataadd ;大于6时允许再移mov r2,datanumintout1: clr rs0 ;选用工作寄存器组0mov 50h,#40intout0: mov 51h,#100intout: reti;段码表duanma: db 3fh,06h,5bh,4fh,66h,6dh ;0,1,2,3,4,5db 7dh,07h,7fh,6fh,77h,7ch ;6,7,8,9,A,Bdb 58h,5eh,7bh,71h,00h,40h ;C,D,E,F,(空格),-end最后是6.2中提到的测试程序:mov 30h,#3fhmov 31h,#06hmov 32h,#5bhmov 33h,#4fhmov 34h,#66hmov 35h,#6dhmov 36h,#7dhmov 37h,#07hmov 38h,#7fhmov 39h,#6fhmov 3ah,#77hmov 3bh,#7chmov 3ch,#58hmov 3dh,#5ehmov 3eh,#7bhmov 3fh,#71hmov 08h,#dataaddmov datanum,#3mov 0ah,datanum setb f0。

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;}}。

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”作为帧的 开始和结束标志,所传输的一帧数据可以是任意位。所以传 输的效率较高,但实现的硬件设备比异步通信复杂。

c51的c语言程序格式

c51的c语言程序格式

c51的c语言程序格式
C51 是指基于8051微控制器的编程,通常使用C语言进行开发。

下面是一个简单的C语言程序示例,用于8051微控制器。

```c
include <> // 包含8051的寄存器定义
void main() {
while(1) { // 无限循环
P1 = 0x00; // 将P1端口的所有引脚设置为低电平
delay(1000); // 延时1ms
P1 = 0xFF; // 将P1端口的所有引脚设置为高电平
delay(1000); // 延时1ms
}
}
void delay(unsigned int t) { // 延时函数
while(t--);
}
```
这个程序将在P1端口上周期性地切换高电平和低电平,产生一个简单的LED闪烁效果。

注意:在实际的8051编程中,你还需要考虑如何配置微控制器的时钟、如何配置I/O端口、如何配置中断等。

此外,你还需要一个8051的编译器来编译你的C代码,生成可以在8051上运行的机器码。

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单片机串口通信的基础知识和相关编程例程,包括串口发送数据、串口接收数据和串口发送字符串。

51单片机与PC机串口通信

51单片机与PC机串口通信

单片机P2口接8只LED灯,P3.2~P3.3引脚连接有K1和K2共2个按键,使用单片机串行口与PC机通信。

1)由PC机控制单片机的P2口,将PC机送出的数以二进制形式显示在LED灯上;2)按下按键K1向PC机发送数字0x55,按下K2向PC机发送数字0xAA。

源程序如下:#define uchar unsigned char#include "string.h"#include "reg51.h"unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x08,0x03,0x46,0x21,0x06,0x0e}; //十六进制-7段译码表void mDelay(unsigned int DelayTime) //延时函数{ unsigned char j=0;for(;DelayTime>0;DelayTime--) //延时循环{ for(j=0;j<125;j++){;}}}void SendData(uchar Dat) //发送函数{ uchar i=0;SBUF=Dat; //发送Datwhile(1){if(TI) //如果发送中断标志为1,则等待,{ TI=0; break; } //否则清除发送中断标志}}uchar Key() //按键处理函数{ uchar KValue; //声明键值函数P3|=0x3e; //中间4位置高电平 0011 1101if((KValue=P3|0xe3)!=0xff) //如果按键按下{ mDelay(10); //延迟时间函数if((KValue=P3|0xe3)!=0xff) //如果按键还在按下状态{ for(;;) //等待if((P3|0xe3)==0xff) //如果按键抬起,return(KValue); //返回键值}}return(0); //如果按键没有按下,返回0}void main() //主函数{ uchar KeyValue; //定义键值变量KeyValueunsigned char ns,ng,temp; //定义变量ns,ng,tempP2=0xff; //熄灭P2口连接的所有发光管TMOD=0x20; //确定定时器工作模式,模式2,常数自动装入TH1=0xFD;TL0=0xFD; //定时器1的初值波特率为9600,晶体为11.0592MHz //PCON&=0x80; 若是SMOD=1 可以使波特率加倍TR1=1; //启动定时器1SCON=0x40; //串口工作方式1 运行在8位模式REN=1; //允许接收for(;;) //无限循环{if(KeyValue=Key()) //调用按键函数,获取按键信息{ if((KeyValue|0xfb)!=0xff) //如果按键k1按下SendData(0x55); //调用发送函数,送出0x55if((KeyValue|0xf7)!=0xff) //如果k2按下SendData(0xaa); //调用发送函数,送出0xaa}if(RI) //如果接收中断发生{ P2=SBUF; //将接收数据写到端口P2RI=0; } //清除接收标志位temp=P2; //暂存接收到的数据ng=temp & 0x0f; //取接收数据低4位ns=temp>>4; //将高4位右移4位ns &=0x0f; //取接收数据高4位P0=table[ng]; //P0口连接的数码管显示低4位P1=table[ns]; //P1口连接的数码管显示高4位}}。

MC51单片机与PC 机的串口通信

MC51单片机与PC 机的串口通信

单片机与PC 机的串口通信这一讲将介绍单片机上的串口通信。

通过该讲,读者可以掌握单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。

一、原理简介51 单片机内部有一个全双工串行接口。

什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。

串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。

其缺点是传输速度较低。

与之前一样,首先我们来了解单片机串口相关的寄存器。

SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。

从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。

串行口控制寄存器SC ON(见表1)。

表1 SCON寄存器表中各位(从左至右为从高位到低位)含义如下。

SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。

表2 串行口工作方式控制位其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。

SM2 :多机通信控制位。

该仅用于方式2 和方式3 的多机通信。

其中发送机SM2 =1(需要程序控制设置)。

接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。

当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。

工作于方式0 时,SM2 必须为0。

REN :串行接收允许位:REN =0 时,禁止接收;REN =1 时,允许接收。

TB8 :在方式2、3 中,TB8 是发送机要发送的第9 位数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档