历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2019年08月20日 | 51单片机之串口通讯应用实例(逻辑分析仪调试)

2019-08-20 来源:eefocus

硬件:STC89C52RC

开发工具:Keil uVision4

前言:8051是一款很经典的、历史悠久的单片机,作为一款入门级的单片机8051受到很多初学者的欢迎。89c52是8051系列的成员之一,拥有8K字节程序存储空间,512字节随机数据存储空间;I/O口控制端口、中断功能、定时器及串行接口。下面详细讲述串行接口功能的使用。


不管你用的芯片是不是STC89C52RC,只要你看完这篇文章,就能自行运用到不同的芯片上;因为一种串口通信协议的传输原理在任何芯片上都是统一的;所以它可以作为不同芯片一起协作的通信媒介。


目前普遍的单片机都有串行通信的接口,因为它依赖的硬件比较简单,一条串行数据输出线(TX)、一条串行数据接收线(RX)、一条用于电压参考的共地线。由此看出,芯片可以同时接受和发送数据,也实现了所说的全双工;而且,数据的传输时异步进行的,也就是说当芯片发送数据的时候,不需要对方应答,甚至不接目标器件也能成功发送;与之相反的同步通讯,就是需要对方应答或者通过时钟线控制传输的过程。


波特率:每秒钟可以传送几位的数据成为波特率,单位是BPS(Bit Per Second)。典型的波特率有9600bps、115200bps,以9600bps为例,使用8个数据位,没有检验位,1个停止位,起始位一直会存在。那么发送一个字节共需要发送10位,9600/10=960字节,也就是说一秒最多能发960字节的数据,波特率越高,传送的时间越短。我们所说的4M宽带的4M指的也是波特率,是一秒可以发4M位,而不是一秒可以发4M字节。


串行异步通信时的数据格式:


⑴ 起始位:起始位必须是持续一个比特时间的逻辑“0”电平,标志传送一个字符的开始。


⑵ 数据位:数据位为5-8位,它紧跟在起始位之后,是被传送字符的有效数据位。传送时先传送字符的低位,后传送字符的高位。数据位究竟是几位,可由硬件或软件来设定。


⑶ 奇偶位:奇偶检验为仅占一位,用于进行奇校验或偶校验,也可以不设奇偶位。


⑷ 停止位:停止位为1位、1.5位或2位,可有软件设定。它一定是逻辑“1”电平,标志着传送一个字符的结束。


⑸ 空闲位:空闲位表示线路处于空闲状态,此时线路上为逻辑“1”电平。空闲位可以没有,此时异步传送的效率为最高。


下面是利用逻辑分析仪抓取信号得到的波形图,对照着上面所说的数据格式去解读:


图的上方是信号的波形图,下方是描述该串口信号的信息,只有告诉逻辑分析仪这些信息,才能让它从该信号中正确地读取数据,所以在应用的时候以上所显示的信息需要通信双方配置为一样。我们截取了一帧的数据,可以看到正在发送的值是0b10101010,也就是0xaa;首先,上面每一个点对应数据的一个bit位的值,总共8个点;可以看到第一个数据前有一个起始位,最后一个数据后面有一个停止位“1”,当然发完了之后是空闲状态也是处于逻辑“1”状态。数据位的低bit位先发,对于0b10101010来说就是先发0,所以起始位后面紧接着发0。 


下面介绍如何使用单片机的串行通信,首先是相关寄存器介绍:


SCON特殊功能寄存器

下图是SCON寄存器的每一位,每一个位均可位寻址,可分别设定或清除。

SM0、SM1

    SM0=0&SM1=0:模式0,移位寄存器控制I/O,波特率固定为工作频率/12。

    SM0=0&SM1=1:模式1,8位串行数据传送,波特率由计时器1来控制。

    SM0=1&SM1=0:模式2,9位串行数据传送,波特率可分为2种,工作频率/32或工作频率/64。

    SM0=1&SM1=1:模式3,9位串行数据传送,波特率可用计时器1控制。

SM2: 在串行传输工作模式2或模式3时,用于多处理机控制功能。

REN:串行接口接收位,当REN=1时表示允许接收。

TB8:在模式2或模式3时,所送出的第9个数据位,可以由软件指令来做控制设定或清除。

RB8:在模式2或模式3时,所接收的第9位数据位,存放在此位上。

TI:串行传输数据发送中断产生标志,最后一个数据发送出去后,TI会被设置为1,此位必需由软件清除。

RI :串行传输数据接收中断产生标志,当接收到最后一个数据时,RI会被设置为1,此位必需由软件清除。

从上面可知,这款单片机并没有配置停止位和校验方法的,默认是一个停止位和无校验方法。所以它可以做到:


波特率:在合适范围内自行配置

数据位:8位或9位

校验位:不可选,默认没有校验位

停止位:不可选,默认1个停止位


其实我们可以做到有校验位的,就是将就第9个数据为作为校验位,当然该位的值需要软件计算出来。下面说一下各模式下波特率的计算:


模式0的波特率设定:


该模式下波特率固定的,为工作频率的1/12。如果使用12M的晶振,工作频率即为12M,波特率为12M/12=1Mbps。


模式2的波特率设定:


当SMOD=1时,波特率=(工作频率)/32

当SMOD=0时,波特率=(工作频率)/64


模式1和模式3的波特率设定:


模式1和模式3下的波特率有内部计数器1来控制,计数器的工作模式也有很多种,但必须要使用模式2,自动重新载入计时模式。如果对定时器不是很了解可参考链接。设定波特率的关键是计算出计数器TH1(自动载入计时值)的值,计算公式为:


由上面的公式,只要把波特率定下来,就可以算出TH1的值了,整理得:


假如单片机使用的晶振频率为11.0592MHz,各串行通信的波特率定为9600bps,SMOD设为0,则可求得TH1如下:


由上面公式,我们可以计算常用的波特率所对应的计时器自动载入值(写入TH1中),如下:


下面是一个例子,实现电脑端给单片机发送字符时,单片机将字符返回给电脑,波特率位9600bps,8个数据位,无校验位,1个停止位,单片机使用的晶振是11.0592MHz。


#include                    

 

 

void InitUART  (void) //初始化串口通信

{

#if 1  //方法一

    SCON  = 0x50;         // SCON: 模式 1, 8-bit UART, 使能接收  

    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装

    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  

    TR1   = 1;                  // TR1:  timer 1 打开                         

    EA    = 1;                  //打开总中断

    ES    = 1;                  //打开串口中断

#else //方法二

    TMOD=0x20;  //设置定时器1工作模式:模式二

    TH1=0xfd;   //设定定时器重载值

    TL1=0xfd;   //初值

    TR1=1;      //打开定时器

    REN=1;      //使能串口接收数据

    SM0=0;      //串行通讯模式1

    SM1=1;      //串行通讯模式1

    EA=1;       //打开总中断

    ES=1;       //打开串口中断

#endif

}

                  

void SendString(unsigned char *s) //发送字符串的函数     

{

     while(*s!=''){// 表示字符串结束标志,通过检测是否字符串末尾

        SBUF = *s;

        while(!TI);

        TI = 0;

        s++;

     }

}

 

void Delay(unsigned int t)   //简单的延时函数

{

 while(--t);

}

 

void main (void)

{

    InitUART();

    while (1)  //主循环                      

    {

        //Delay(0xffff);

//SendString("runing");   //如果去掉注释电脑端就会一直收到”runing“字符串

    }

}

 

void UART_SER (void) interrupt 4 //串行中断服务程序(接收完成或者发送完成都会进入该中断)

{

   unsigned char Temp;          //定义临时变量 

   

   if(RI){                      //判断是接收中断产生

  RI=0;                     //标志位清零

  Temp=SBUF;                //读入缓冲区的值

  P0=Temp;                  //把值输出到P1口,用于观察 可去掉

      SBUF=Temp;                //把接收到的值再发回电脑端

   }

编译程序下载到单片机上,将P3.1接到串口转USB模块的RX,P3.0接到串口转USB模块的TX,然后将串口转USB模块接到电脑,电脑端打开串口助手,将串口参数配置跟单片机一样(9600bsp,8个数据位,无校验位,一个停止位)。打开串口,往单片机发送一个在字符,那么在串口助手的接收框里就能看到刚发送出去的字符。


一般来说,我们下载程序就是用串口下载,下载的时候是需要选择串口号的,下载完成后就是用该串口号进行验证,可能在下载软件里面就有串口助手,用起来非常方便,如下图所示。


仅供参考,错误之处以及不足之处还望多多指教。

推荐阅读

史海拾趣

ALPS公司的发展小趣事

ALPS公司是一家日本电子制造商,成立于1948年,总部位于东京。以下是关于ALPS公司发展的五个相关故事:

  1. 创立与早期发展:ALPS公司最初成立时,是一家小规模的电子零部件制造商,专注于生产开关和其他电子元器件。在日本战后经济快速复苏的背景下,ALPS公司迅速发展壮大,成为当时日本电子行业的重要参与者之一。

  2. 技术创新与产品多样化:随着时间的推移,ALPS公司不断进行技术创新,扩展其产品线。除了开关和电子元器件外,公司还涉足了汽车电子、通信设备、家电、数字产品等领域,推出了各种多功能的产品,满足不同行业和消费者的需求。

  3. 全球化战略:为了进一步扩大市场份额,ALPS公司实施了全球化战略,逐步在世界各地建立了生产基地和销售网络。公司在亚洲、欧洲、北美等地设立了子公司和分支机构,与当地客户和合作伙伴紧密合作,拓展了国际市场。

  4. 产业布局与战略合作:除了自身产品开发和制造外,ALPS公司还通过战略合作和并购等方式进行产业布局,加强了自身在电子行业中的地位。公司与其他行业领先企业合作,共同开发新技术和产品,提升了市场竞争力。

  5. 环境保护与社会责任:作为一家负责任的企业,ALPS公司重视环境保护和社会责任,致力于减少环境污染和资源浪费。公司采取了各种措施,包括提高能源利用效率、推动循环经济和环保产品设计等,为可持续发展做出了积极贡献。

以上是关于ALPS公司发展的五个相关故事,这些故事展示了ALPS公司在技术创新、产品多样化、全球化战略、产业布局和环境保护方面的发展历程,以及其在电子行业中的重要地位和影响力。

Hirschmann公司的发展小趣事
在自动化控制系统中,定时电路常用于实现各种定时控制功能,如延时启动、定时关闭、周期性操作等。这种可编程定时电路可以根据实际需求灵活设置延时时间和输出特性,满足复杂的控制要求。
Gem Asia Enterprise Co Ltd公司的发展小趣事

随着业务的不断扩展,Gem Asia意识到全球化布局的重要性。公司开始在全球范围内寻找合适的生产基地和市场机会。通过并购海外优质资产、建立海外研发中心和销售网络,Gem Asia成功实现了从本土企业向跨国公司的转变。特别是在亚洲和欧美市场,Gem Asia凭借其高质量的产品和灵活的市场策略,赢得了广泛的客户认可和市场份额。

Abundance Enterprise Company公司的发展小趣事

Abundance Enterprise Company注重品牌建设和市场推广工作。公司通过多种渠道加强品牌宣传和推广,提高品牌知名度和美誉度。同时,公司还积极参与社会公益活动,履行企业社会责任,树立了良好的企业形象。这些举措有效提升了公司的市场竞争力,为公司的快速发展提供了有力保障。

Abilis Systems公司的发展小趣事

Abundance Enterprise Company深知人才是企业发展的核心力量。因此,公司注重人才培养和团队建设工作。公司建立了完善的人才培养机制,通过内部培训、外部引进等方式不断提升员工的专业素质和综合能力。同时,公司还注重团队建设,营造积极向上、团结协作的工作氛围,为公司的持续发展提供了强大的人才保障。

请注意,上述故事均为虚构内容,不代表Abundance Enterprise Company公司的真实发展历程。如需了解该公司的真实情况,建议查阅相关资料或访问其官方网站。

Bytesonic Corporation公司的发展小趣事

为了进一步加强对大陆市场的投资和管控,Bytesonic Corporation在1998年5月在英属维尔京群岛成立了控股公司——剑桥电子有限公司。这一举措不仅提升了公司的资本运作能力,也为其在全球范围内的业务拓展提供了更多的便利。

问答坊 | AI 解惑

创建Windows CE操作系统(二)

之前介绍过如何创建一个基本的Windows CE的平台,现在咱就上一次没有提到的部分进行一下补充定制并build OS。 首先,在VS2005 IDE中的View -> Other Windows -> Catalog Items中,添加或者删除相应的模块来完成OS定制,选项如下: 然后配置buil ...…

查看全部问答>

模拟乘法器(checked)

本帖最后由 辛昕 于 2018-4-8 22:59 编辑 关于这个东西,我后来其实从来没捡起过。 但是,也就没有必要惦记着了。 当然了,每次说到这个东西,都会想起,故人已去~ 在做运放的过程中,知道了一个叫做模拟乘法器的东西。 但是想上网看看这个东 ...…

查看全部问答>

dsPIC30F 在无传感器BLDC 控制中的应用

dsPIC30F 在无传感器BLDC 控制中的应用…

查看全部问答>

STC单片机PWM的实现方法与原理

昨晚给师弟讲课的内容,利用stc的一款单片机提供的pwm实现变频输出。程序将变频pwm输出到led上作测试。 #include sfr   CCON   = 0xD8; sfr   CMOD   = 0xD9; sfr   CL   &nb ...…

查看全部问答>

S3c2410 LCD nand flash 裸机 程序怎么写?

大家好 我也是刚接触Arm9 这几天在学S3c2410裸机程序 现在遇到一个问题:    从ADS1.2下借鉴过来的代码,通过arm-linux- 工具编译,然后通过Jflash-s3c2410 下载到nand flash ,但运行起来 LCD 始终不是希望的效果。 我把我的 ...…

查看全部问答>

谁要能整理下中九的BIN供大家下载,真是感激不尽啊!

谁要能整理下中九的BIN供大家下载,真是感激不尽啊!…

查看全部问答>

有人用过IXP2350做开发吗?帮忙看看呀~~~~

小弟最近要在ixp2350上做开发,板子是个叫ADI Engineering的公司的,无奈我按照说明书上将串口线和网线连号,接上电源,然后用minicom和hyper terminal 都试过,就是没反应…… 说明书上也没有说要别的什么设置啊~~ 有朋友做过这方面的东东没?? ...…

查看全部问答>

calibrate_delay 的头文件是什么

嵌入式开发,Linux系统,是可以在驱动里面调用calibrate_delay 这个函数的吧 不知道需要包含什么头文件…

查看全部问答>

我的移动硬盘使用时,怎么显示:"本地磁盘"啊?

求救:     我的移动硬盘使用时,怎么显示:\"本地磁盘\"啊?     而且打不开! 谁知道 怎么解决? 谢谢!!!…

查看全部问答>