1 51串行口结构
51单片机的UART串行通讯是依据其串行口的可编程硬件结构,只要用正确的程序代码经过初始化串行口对应寄存器的方法将其串行硬件结构初始化,再编写契合此串行口通讯的程序代码便能够完结串行通讯,其硬件结构决议了编程机制( 当然还要靠51芯片内CPU等机制 )。此结构具有UART( 通用异步收发器 )的悉数功用,能一同进行数据的发送和接纳,也可作为同步移位寄存器运用。此结构集成于单片机内部。
Figure1:51串行口结构
2 51串行口通讯编程机制
决议编程机制的先决条件是51单片机的硬件结构及51芯片内部CPU的碑文机制。依据串行通讯口硬件结构,完结UART通讯能够分为两步:
(1)初始化串行通讯口( UART )
- 装备SCON:设定串口方法( SM0及SM1位装备4种方法);串口是否要接纳数据(REN位)
- 设定PCON寄存器的SMOD位(若非串口方法0 )
- 若串口为方法1和方法3,则需求装备TMOD:挑选守时器1并装备其初值装载方法(MI M0位),并设置TH1,TL0的初值以确认通讯的波特率(由波特率的计算公式),然后装备TCON:舱位守时器1( TR1 )。
- 答应运用中止( ES ),舱位UART中止( EA )
能够这些寄存器的装备意义能够检查相应的知识点:中止装备IE寄存器、守时/计数方法装备寄存器TMOD、守时/计数操控寄存器及通讯寄存器SCON寄存器笔记。
(2)程序完结:编写发送/接纳数据代码及中止服务程序
注:TI及RI的置位可检查SCON寄存器TI RI被置位的条件
[1]发送的数据需求经过程序指令“SBUF =数据;”来将数据送往串行发送缓冲寄存器中,在此条查办后,要用循环判别SCON寄存器中的TI位是否被硬件置位1(一共发送结束),等候发送结束,TI置位被置为1时会进入串行中止服务程序[由此不能在串行中止服务程序晒干将TI置0,由于从循环晒干进入中止后会返回到循环查办中来,所以要在串行中止服务程序之外将TI置0,置0的意图是供给下一次数据发送成功的依据或进入中止服务器程序],需求用程序代码将TI从头置为0;然后再由CPU操控的时序将数据从TXD( P3.1 )脚宣布,经过衔接的串口线到从设备(接纳数据的设备)。
[2]获取接纳到数据时需求经过程序指令“存数据变量=SBUF;”将串行接纳缓冲寄存器接纳到的数据读取到程序中来,当接纳到数据结束后,RI会被硬件置位1,此刻也会进入串行中止服务程序,需求用程序指令将RI从头置位0。当然接纳数据是由RXD( P3.0 )引脚完结。
[3]串行中止服务程序的中止号为4,所以编写串行中止服务程序时需求有以下格局:
void函数名()interrupt 4
{
中止服务程序内容
}
串行中止服务函数当TI或RI被硬件置位1时才被体系调用。TI被硬件置1的状况是,当串行发送缓冲寄存器内的数据被经过TXD( P3.1 )发送结束时(不同的串口方法置1条件不同)不是指将数据存入串行发送缓冲器中时TI会被置1,同理RI被置1的状况是当RXD( P3.0 )接纳到数据将此数据按位存入串行接纳缓冲寄存器内结束时(不同串口方法置1的条件不同)不是指从串行接纳缓冲寄存器读完数据时RI会被置1。这个数据的长度和TI( RI )被置位1依据串行通讯方法不同而不同。
关于用程序来完结51单片机中的串行通讯还需求清晰两点(与其它部分的联络):
(1)在51单片机串行通讯的方法1和方法3中,波特率由守时器1的溢出率决议。
(2)SBUF为特别功用寄存器,它在程序中的两种不同的指令方法一共不同的意义,当在程序顶用写指令“SBUF=a;”时,一共将a存入串行数据发送缓冲寄存器中;当在程序中运用读指令“a=SBUF;”时,一共向串行数据接纳缓冲寄存器读数据并将得到数据赋值于a。接纳器具有双缓冲结构,即在从接纳寄存器中前一个现已收到的字节之前,便能接纳第二个字节,假如第二个字节现已接纳结束,第一个字节还没有被读出,则第一个字节就丢失( 被掩盖 )。而发送器中的数据是由CPU操控的,所以不用程序用户忧虑。
3 程序完结串行通讯
程序的大体框架为main主函数、串行中止服务程序、子函数(初始化串口、延时函数,字符串处理函数等)
(1)首先是用程序完结串行通讯的初始化
//串口初始化 void UART_Init(void) { SCON = 0x40; //串口方法1 PCON = 0; //SMOD=0 REN = 1; //答应接纳 TMOD = 0x20; //守时器1守时方法2 TR1 = 1; //发动守时器 ES = 1; //UART中止 EA = 1; //中止使能 } |
(2)用程序完结发数据
酿制发送的数据赋值给SBUF即可。
SBUF = aChar; while(TI == 0);//等候,直到发送成功 TI = 0; |
这是发送一次数据(如一个字符,在串口发送方法1下占10个位)的代码,可独自写成函数。此种写法不能够将“TI = 0;”写在中止函数中,否则会形成死循环。
(3)在中止函数中承受数据
不论发送数据成功仍是承受到数据都会进入到中止程序中,故而在中止程序中判别是否RI被置位为1,如是则一共收到了数据。
void UART_Receive_Int() interrupt 4 { if( RI == 1) { RI = 0; if( index < 1 ) { Receive[index] = SBUF; index++; }else{ index = 0; } } } |
然后只需求在主程序main函数中调用串行口初始化函数及用必定的逻辑调用数据发送函数即可。
(4)经过串口调试帮手来调查程序碑文作用
发数据显现
设置串口调试帮手:
Figure2:向调试帮手发数据显现
在串口调试帮手中依照下划线部分设置后,成果显现区域就会显现由程序发将上来的数据。
串口调试帮手往单片机发送数据并再显现到串口调试界面之上
Figure3:调试帮手向单片机发送数据显现界面
对串口调试帮手的设置除了发送数据之上的设置之外还需求在表格中填入字符串,然后点击表格下画圈使之为“中止循环发送”,然后就能够将收到的数据同酿制发送的数据一同发送到串口调试界面之上来。
此次笔记记载结束。