历史上的今天

今天是:2024年10月20日(星期日)

正在发生

2021年10月20日 | 【自学51单片机】11 -- UART串口通信

发布者:国宝集团 来源: eefocus关键字:51单片机  UART  串口通信 手机看文章 扫描二维码
随时随地手机看文章

1、串行通信的初步认识

UART串行通信是单片机最常用的一种通信技术,通常用于单片机和电脑之间以及单片机和单片机之间的通信。



通信可分为并行通信和串行通信两种。(1)并行通信:数据的各各位可同时传送。(2)串行通信:数据只能按顺序一个一个位传送。STC89C52中P3^0(RXD)和 P ^1(TXD)是专门用作UART串行通信的引脚。


下面看下图11-1单片机之间的UART串口通信

单片机之间串口通信

说明:GND 表示单片机系统电源的参考地,TXD 是串行发送引脚,RXD 是串行接收引

脚。他们之间通信要保证以下几点。


(1)电源基准相同,所以我们要把两个单片机的 GND 相互

连接起来,

(2)TXD与RXD相连,比如单片机 1 的 TXD 引脚接到单片机 2 的 RXD 引脚上,即此路为单片机 1 发送而单片机 2 接收的通道。同理单片机 1 的RXD接到单片机 2的TXD上。

(3)两者的通信波特率(指发送二进制数据位的速率,即串口每秒钟传送的位数,用baud表示)保持一致,他们之间通信发送的数据,是以二进制低位先,高位后的顺序发送,TXD会先发起始位0,然后从数据低位开始发送每一位数据,最后发停止位1,若该位为0拉低电平一段时间,若该位为1拉高电平一段时间。  “一段时间” = 1 / baud。


如何判断数据何时开始,何时结束?

延迟,提前接收都会使数据接收错误,所以UART通信规定无通信信号发送时,线路保持高电平,数据发送前发0(低电平)表示起始位,然后按数据低位到高位顺序发送每一位,数据发送结束后再发1(高电平)表示停止位,每个数据位切换时间为: 1 / baud。而接收方,无信号接受保持高电平,一旦检测到低电平,就准备开始接收数据,接收完数据后,检测到停止位便准备下一个数据的接收。


串口数据发送示意图

说明:该图为时域图,信号随时间变化的对应关系。


2、USB转串口通信

在单片机电路上添加一个USB转串口芯片,便可实现计算机与单片机之间的串口通信。KST-51开发板用的为CH340T芯片来实现,见下图11-5说明。

CH340T电路说明:把电源、晶振接好后,6 脚和 7 脚的 DP 和 DM 分别接 USB 口的 2 个数据引脚上去,3 脚和 4 脚通过跳线接到了我们单片机的 TXD 和 RXD 上去。


3、UART串口通信的基本应用

3.1 通信的三种基本类型

通信从传输方向上可分为:单工通信,半双工通信和全双工通信三类。


单工通信:允许一方向另外一方传送信息,而另一方不能回传信息。如遥控器

半双工通信:数据可以在双方之间互相传播,但同一时刻只能其中一方发给另外一方。如对讲机

全双工通信:发送数据的同时也能够接收数据,两者同步进行,如电话


3.2 UARM模块介绍

单片机内部有UART模块,实现串口通信。51单片机的UART 串口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成,先来了解一下串口控制寄存器 SCON。


SCON寄存器说明

说明:第0位RI为接收中断标志位,第1位TI为发送中断标志位,这两个为进入串口中断都不会自动清零,都需要软件清零。第4位REN在接收数据时设置为1,第6位SM1和第7位为模式设置,通常使用模式1,模式1:发送一位起始位,8位数据位,一位停止位。SCON其他位很少用到就不介绍。一般使用SCON时,置SCON=0b01010000,即0x50;使用时查手册即可。


波特率发生器说明

在UART模块中波特率发生器(用来控制发送和接受数据的速度)只能由定时器T1或T2产生,T0不能产生,因T2需要配置额外寄存器,下面以定时器T1做为波特率发生器说明。


当定时器T1做为波特率发生器时,定时器T1需配置为模式2–自动重装载模式。定时器重载值计算公式:TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率。和波特率有关寄存器电源管理寄存器PCON,它最高位置1(PCON |= 0x80)可把波特率提高一倍。计算公式变为:TH1 = TL1 = 256 - 晶振值/12 /16 /波特率。


公式说明:晶振值在KST-51开发板为11059200,12是说一个机器周期等于12个时钟周期。16指采取数据的方式是把一位信号采集 16 次,其中第 7、8、9 次取出来,这三次中其中两次如果是高电平,那么就认定这一位数据是 1,如果两次是低电平,那么就认定这一位是 0,


SBUF寄存器说明

串口通信的发送和接收电路在物理上有 2 个名字相同的 SBUF 寄存器,它们的地址也都

是 0x99,但是一个用来做发送缓冲,一个用来做接收缓冲。我们每次只操作 SBUF,单片机会自动根据对它执行的是“读”还是“写”操作来选择是接收 SBUF 还是发送 SBUF,


3.3编写UART串口步骤及程序

编写UART串口步骤:

配置SCON的模式,一般为模式一(0x50)。

配置定时器T1为模式二(0x20),自动重装载模式。

根据波特率计算TH1和TL1的初值(TH1 = 256 - (11059200 / 12 / 32)/baud),需要可使用PCON加倍波特率。


打开定时器寄存器TR1,开启T1。

UART小程序

//UART串口通信小程序

#include


void configUART(unsigned int baud);


void main()

{

EA = 1;//使能总中断

configUART(9600);//配置波特率为9600

while(1);

}


void configUART(unsigned int baud)

{

SCON = 0x50;//配置串口为模式一

TMOD &= 0x0F;//清零T1的控制位

TMOD |= 0X20;//配置T1为模式一

TH1  = 256 - (11059200/12/32)/baud;//计算T1重载值

TL1 = TH1; //初值等于重载值

ES = 1;//使能串口中断

ET1 = 0;//禁止T1中断

TR1 = 1;//启动T1

}


void InterruptUART() interrupt 4

{

if(RI)   //接收到字节

{

RI = 0; //手动清零接收中断标志位

SBUF = SBUF + 4;//接收的数据+4后发回,左边是发送SBUF,右边是接收SBUF

}

if(TI) //字节发送完毕

{

TI = 0;//手动清零发送中断标志位

}

}


程序结果图

结果

4、串口调试助手

串口助手中,还有 ‘字符格式的发送’ 和 ‘字符格式显示’,先介绍字符,在一个字节的256个值中取 0 ~ 127共128个值赋予它另外一种含义,让他们分别代表一个常用字符,这个对应关系为ASCII码字符表。这样就在字符和字节数据之间创建了一一对应关系,一个字节即可代表整数,又可代表一个字符,但本质都是一个字节的数据。


串口助手中,选择字符格式发送和十六进制接收。若发送小写a,则接收的数据为字符a对应的十六进制值0x61。十六进制发送和十六进制接收,都是按字节数据的真实值进行的;而字符格式发送和字符格式接收,是按 ASCII 码表中字符形式进行的,但它最终传输的实际上还是一个字节数据。见下例。

说明:例子中以字符格式发送 ‘20’,但实际上是分别发送 字符‘2’ 和 ‘0’ 。而显示则分别显示 字符’1’ 和 字符’2’ 对应的十六进制数值0x32和0x30。


5、通信小程序

实现单片机串口调试助手发送的数据,在开发板数码管上以十六进制显示出来。

#include


sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned char code LedChar[] = { //数码管显示字符转换表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};


unsigned char LedBuff[]={ //数码管+独立LED显示缓冲区

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};


unsigned char T0RH;//T0重载值的高字节

unsigned char T0RL;//T0重载值的低字节

unsigned char RxdByte = 0;//串口接收到的字节


void configUART(unsigned int baud);

void configTimer0(unsigned char ms);

void Ledscan();


void main()

{

EA = 1; //使能总中断

ENLED = 0;//选择数码管

ADDR3 = 1;

configUART(9600);//配置波特率为9600

configTimer0(1);//配置T0定时1ms

while(1)

{ //将接收字节在数码管上以十六进制形式显示出来

LedBuff[0] = LedChar[RxdByte & 0x0F];

LedBuff[1] = LedChar[RxdByte>>4];

}

}


//串口配置函数,baud为通信波特率

void configUART(unsigned int baud)

{

SCON = 0x50; //配置串口为模式1

TMOD &= 0x0F;//清零T1的控制位

TMOD |= 0x20; //配置T1为模式二

TH1 = 256 - (11059200/12/32)/baud;//计算T1重载值

TL1 = TH1;   //初值等于重载值

ES = 1;   //使能串口中断

TR1 = 1;  //启动T1

}


//配置并启动T0,ms-T0定时时间

void ConfigTimer0(unsigned char ms)

{

unsigned long tmp; //临时变量

tmp = 11059200 / 12; //定时器计数频率

tmp = (tmp * ms) / 1000;//计算所需要的计数值

tmp = 65536 - tmp + 13; //计算定时器重载值,并补偿中断延时造成的误差

T0RH = (unsigned char)(tmp >> 8);//定时器重载值拆分为高低字节

T0RL = (unsigned char)tmp;

TMOD &= 0xF0;//清零T0的控制位

TMOD |= 0x01;//配置T0为模式一

TH0 = T0RH; //加载T0重载值

TL0 = T0RL;

ET0 = 1;//使能T0中断

TR0 = 1;//启动T0


}


void InterruptUART() interrupt 4

{

if(RI) //接收到字节

{

RI = 0;//手动清零·接收中断标志位

RxdByte = SBUF ;//接收到的数据保存到接收字节变量中

SBUF = RxdByte;//接收到的数据又发回,用以提醒用户输入的信息是否正确

}

if(TI) //字节发送完毕

{

TI = 0;//手动清零发送中断标志位

}

}


void InterruptTimer0() interrupt 1

{

TH0 = T0RH;//重新加载重载值

TL0 = T0RL;

Ledscan(); //Led扫描显示

}


//LED动态扫描函数,需在T0中断中调用

void Ledscan()

{

static unsigned char i = 0; //动态扫描索引


P0 = 0xFF;    //关闭数码管所有段,显示消隐

P1 = (P1 & 0xF8) | i;//位索引值赋值到P1口低三位

P0 = LedBuff[i];//缓冲区中索引值德数据送到P0口

i++; //索引递增循环,遍历整个缓冲区

if(i > 5)

{

i = 0;

}

}


6、收获

本章是通信的开章,整体难度不难,学起来也比较轻松,后面应该难度就会上来了,还有八天开学,还有9章没学完,还是加油学吧,奥利奥奥里给!!

关键字:51单片机  UART  串口通信 引用地址:【自学51单片机】11 -- UART串口通信

上一篇:#51单片机# UART串口通信的基本应用、模块介绍和串口程序
下一篇:【自学51单片机】12 --- 1602液晶初步认识

推荐阅读

探讨这个问题、切入正题之前我想先科普一下著名的“边际递减效应”理论,是指:边际递减效应是指在其他条件不变的情况下,如果一种投入要素连续地等量增加,增加到一定产值后,所提供的产品的增量就会下降,即可变要素的边际产量会递减。可能看着有点晦涩,举个例子来讲呢,就是你不断重复同一享乐,带来的享受会越来越小。这一定律应用到产品的开发上来讲...
互联网、、人工智能等技术与机器人产业加速融合,促使机器人技术及其产品也发生天翻地覆的变化。大象机器人以全新逻辑,持续在机器人算法、控制器、及产品开发方面创新和投入,布局安全机器人细分市场,以满足市场多元化的需求。 伴随智能化、信息化、网络化的不断发展,机器人技术及其产品也发生着天翻地覆的变化。在汽车行业,工业机器人一改以往固定...
在在第二届5G千兆网产业论坛上,北京经信局总工程师顾瑾栩表示,到2022年,北京运营商5G网络投资累计将超过300亿元,截止今年八月底,已建设完成5G基站44000个,今年底计划完成50000个基站建设,实现五环内和城市副中心室外连续覆盖,五环外重点区域和典型应用场景精准覆盖。 目前,中国5G基站数已经超过60万个,5G用户数突破1.5亿,5G面向垂直行业的应用...
瑞萨电子打造全新“Renesas Ready合作伙伴网络”,搭建强大可靠的技术合作伙伴社区,为RA、RX和RL78 MCU产品线带来性能优化的商业级构建模块该计划提供超过100家可信赖合作伙伴的软件构建模块;解决方案开箱即用,显著加速产品上市2021年10月20日,日本东京讯 - 全球半导体解决方案供应商瑞萨电子集团 今日宣布,推出全球化技术合作伙伴网络——“Ren...

史海拾趣

问答坊 | AI 解惑

cpld 学习程序

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 cpld学习  …

查看全部问答∨

NandFlash 掉程序问题

请教各位高手,     是否都是把 NK 装到 NANDFLASH 中,     在开关机的过程中,     有没有发现掉程序的现象呢??        该怎么样避免呢??…

查看全部问答∨

关于nuclues net!

如果我的网络芯片属于I/O Port Device,我如何知道协议栈有数据包发送?具体点就是,我的NUCLEUS NET如何跟我的驱动的发送程序接口??请高手帮忙解决啊,跪谢了!…

查看全部问答∨

高分求mentor graphics 软件

mentor graphics 有的话传给我好吗? 如果我收到软件我再加分哦…

查看全部问答∨

急!!!怎样实现在电视上看电脑上的片?

怎样实现在电视上看电脑上的片(就是让电视充当另一个显示屏,声音也输出到电视或电视音响上,最好不影响电脑正常工作)? 家里的电视是29寸(有s端子),电脑显卡是geforse mx 200(应该没有s端子),请各位专家说详细点步骤! 提前谢谢大家了! ...…

查看全部问答∨

怎样在allegro里面建立不规则零件?

网上找到一详细描述: 1.开启allegro , file>new>shape symbol. 2.setup>drawing size下将type改为package, 设置好单位,原点坐标,然后OK! 3.用编辑shape的指令以shape的形式画出你想要的焊盘图形,然后再将第2步中的type改回shape(重要) ...…

查看全部问答∨

在Activehaltmode怎样配置才能使lcd正常显示

在Active halt mode 怎样配置才能使lcd 显示, CLK_LSICmd(ENABLE); CLK_RTCClockConfig (CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1); CLK_PeripheralClockConfig (CLK_Peripheral_RTC,  ENABLE); 其他的都是在初始化时配置的。这 ...…

查看全部问答∨

wince5.0平台下如何将界面做成像flash那样的感觉

最近使用wince5.0平台 ,但是再设计界面时出现了一些问题,再wince平台下没有flash控件我该怎样实现动画呢望大家指点…

查看全部问答∨

求角度传感器资料

本帖最后由 paulhyde 于 2014-9-15 08:54 编辑 角度传感器资料!!!!  …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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