51单片机UART 串口通信[ 方式1 ]实现

发布者:德州小孙最新更新时间:2021-11-25 来源: eefocus关键字:51单片机  UART  串口通信  方式1 手机看文章 扫描二维码
随时随地手机看文章

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)通过串口调试助手来观察程序执行效果

 

【1】发数据显示


设置串口调试助手:

Figure2:向调试助手发数据显示


在串口调试助手中按照下划线部分设置后,结果显示区域就会显示由程序发将上来的数据。


【2】串口调试助手往单片机发送数据并再显示到串口调试界面之上

Figure3:调试助手向单片机发送数据显示界面


对串口调试助手的设置除了发送数据之上的设置之外还需要在表格中填入字符串,然后点击表格下画圈使之为“停止循环发送”,然后就可以将收到的数据同将要发送的数据一起发送到串口调试界面之上来。


 


此次笔记记录完毕。

关键字:51单片机  UART  串口通信  方式1 引用地址:51单片机UART 串口通信[ 方式1 ]实现

上一篇:单片机UART串口通信(代码亲自调试成功)
下一篇:关于两块51单片机之间的串口通信(排队叫号系统)

推荐阅读最新更新时间:2024-11-05 11:12

51单片机自动凉衣服源程序电路图与实物图
电路原理图如下: 制作出来的实物图如下: 单片机源程序如下: #include REGX51.H #include intrins.h #include math.h #include stdio.h #define uchar unsigned char #define uint unsigned int sbit DATA=P1^0; sbit MOTOR_A_1=P2^5; //电机控制脚 sbit MOTOR_A_2=P2^6; //电机控制脚 sbit EN_MOTOR_A =P2^7; //电机控制脚 sbit k1=P3^2; //按键 sbit k2
[单片机]
<font color='red'>51单片机</font>自动凉衣服源程序电路图与实物图
STC89C52系列单片机内部资源——串口通信
计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类:并行通信与串行通信。 并行通信通常是将数据字节的各位用多条数据线同时进行传送 。 并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。 串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。 串行通信的基本概念 一、异步通信与同步通信 1、异步通信 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调
[单片机]
STC89C52系列单片机内部资源——<font color='red'>串口通信</font>
MAX813L工作原理及其在51单片机系统抗干扰中的应用
  近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。其中系统的抗干扰性能是系统可靠性的重要指标。   本文在分析MAX813L工作原理的基础上,结合实践给出了其在51单片机系统中的具体抗干扰应用实例。详细介绍了硬件电路的工作原理和相应的系统程序抗干扰编程方法。 1 MAX813L芯片及其工作原理 1.1 芯片特点       ·加电、掉电以及供电电压下降情况下的复位输出,复位脉冲宽度典型值
[单片机]
基于51单片机的SD卡读卡器MMC存储器
硬件设计 程序设计 #include reg52.H #define F_OSC 11059200//晶振平率Hz #define F_BAUD 9600 #define RELOAD 256-F_OSC/12/32/F_BAUD #define CR 0x0D //回车 //定义SD卡需要的4根信号线 sbit SD_CLK = P1^4; sbit SD_DI = P1^6; sbit SD_DO = P1^5; sbit SD_CS = P1^7; unsigned char xdata DATA ; //定义512字节缓冲区,注意需要使用 xdata关键字 //=================
[单片机]
基于<font color='red'>51单片机</font>的SD卡读卡器MMC存储器
基于51单片机的可由按键切换12\24小时制的电子时钟proteus仿真
仿真电路图: 部分源代码: #include reg51.h #define uchar unsigned char #define uint unsigned int sbit lcdrs=P3^5; sbit lcden=P3^4; sbit s1=P3^0; sbit s2=P3^1; sbit s3=P3^2; sbit s4=P3^3; sbit beep=P2^2; sbit led=P2^3; uchar count,s1num,s4num; char year,month,day,week,miao,shi,fen,pshi; uchar code table = 20 -
[单片机]
基于<font color='red'>51单片机</font>的可由按键切换12\24小时制的电子时钟proteus仿真
光照强度预警器(AD转换)
本程序与MQ-3酒精浓度报警器一样,都是将对应的模拟信号转换为数字信号,然后通过单片机监控预警,程序也基本相同,接线方法也一样,AD转换器型号为AD0804。相关工程文件、开发板电路图以及模块资料在最下方附件下载。 关于粘贴复制乱码的问题:如果程序复制到Keil编译器上出现注释乱码,可以先建一个.c文件,也就是说不在keil里面编辑,然后用记事本打开.c文件,将源码复制进去,再在keil中添加文件即可。 /*************************************说明*********************************** 此程序只采集模块信号的大小 需要转换为对应的值 还需要转换公式
[单片机]
51单片机在定时中断函数里执行独立按键的扫描程序
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: Independent-KEY ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200506 ---- @ModifiedTime: 2020
[单片机]
<font color='red'>51单片机</font>在定时中断函数里执行独立按键的扫描程序
6位数字显示频率计数器电路及51单片机源程序
1.频率计算器功能 利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。 2.电路原理图 3.程序设计内容 (1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数
[单片机]
6位数字显示频率计数器电路及<font color='red'>51单片机</font>源程序
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved