单片机学习之十八:串行通讯程序:单片机发送

发布者:飘然出尘最新更新时间:2016-09-09 来源: eefocus关键字:单片机  串行通讯  单片机发送 手机看文章 扫描二维码
随时随地手机看文章
一、实验现象:

 

每次按下k0按键,由单片机向电脑发送数据62。

二、实验目的

 

         掌握单片机串行通讯的概念、特点

         掌握串行通讯波特率的计算方法

         掌握max232接口芯片的连接方法

         掌握方式1串口通讯的简单程序编写

 三、实验任务分析:

 

在这个实验里面,我们来学习编写一个单片机和PC机之间的通讯程序。首先我们来学习一些和串行通讯有关的理论知识。

通讯的基本方式分为并行通讯和串行通讯。由于MCS-51系列单片机有一个异步全双工(全双工:指的是数据可以同时进行双向的传送)的串行口,所以我们只研究串行通讯的问题。这里有个新概念-异步,下面我们简单的给大家解释一下。

 (一)、异步通讯的概念

由于单片机自带的串行口是异步的,所以我们现在只研究异步通讯问题

在异步传送中,一帧信息是一位一位进行传送的。每一个要传送的字符要用“起始位”和“停止位”作为字符开始和结束的标志,传送的时候每个字符的的组成格式如下:

1帧信号=起始位+数据位(可以是5、6、7、8位数据)+停止位,具体格式由通讯双方约定。

 (二)、关于异步通讯需要了解的知识

从异步通讯的特点中我们可以知道,在异步数据传送中,通讯双方事先必须约好两项事宜:

(1)、字符格式:双方要约定两者之间以什么样的格式传递信息,比如字符的编码形式、奇偶校验形式、以及起始位和停止位的规定。在单片机中我们是靠选择串口的工作方式来约定格式的,如何选择稍后介绍。

(2)、波特率:在异步数据传送中,通讯双方传送数据的速率应该相同。我们用“波特率”作为衡量数据传送速率的指标,它定义为“每秒传送的数据位数”。

例如:数据传送的速率是120字符/秒,每一个字符假如是10位,则传送的波特率为:120×10=1200(比特)

一般的,异步传送速率在50~9600比特之间。

可见,在通讯程序中,我们首先应该进行初始化工作,约定双方异步通讯的相关协议。

那么怎样进行初始化呢?这就涉及到串行接口的控制问题,下面我们来谈谈这个问题。

 (三)、MCS-51的串行通讯接口

MCS-51单片机内部有一个功能很强的异步全双工串行口,该串行口有四种工作方式,供不同的场合使用(如何选择后面介绍)。通讯的波特率可以由我们编写的软件设置,由片内的定时器/计数器T1或者T0产生。下面我们就来详细的介绍一下。

1、串行口的工作方式

串行口的四种工作方式中,串行通讯只使用方式1、2、3,方式0主要用于扩展I/O口,这种方式我们不做详细说明,大家可参考相关教材。

          方式1:

这是串口通讯中最常用的方式,为10位异步通讯接口,一帧信息(10位)=起始位(0)+8位数据(低位在前)+停止位(1)。

另外,方式1还有一个特点,波特率可变,我们能够灵活进行设置(如何设置我们稍后介绍),因此这种方式在串行通讯中应用的十分广泛,我们在该试验中,就选择这个工作方式。

          方式2和3:

一般用于主-从式多机通讯的情况下,本试验采用的是方式1,所以我们暂时也不介绍拉!

 2、串行口工作方式的选择

既然决定采用方式1,那么就要对控制寄存器初始化了。串行口的四种通讯方式,使用哪种由特殊功能寄存器SCON决定(也在特殊功能寄存器区,地址是98H,可位寻址,它的各位在单片机复位的时候被清零)。SCON各位说明如下:图

 


 

                                   单片机学习之十八:串行通讯程序:单片机发送 - 北极星 - 要做一粒好的种子

         SM0、SM1:串行接口的工作方式选择:

 

00-方式0;01-方式1;10-方式2;11-方式3。由于在该试验中我们选择方式1,所以应该把SM0和SM1置为01。

         SM2:允许方式2和方式3进行多机通讯的控制位,所以如果我们使用方式2、3进行多机通讯时,将该位置1;但是在本实验中我们采用方式1,所以SM2置0即可。

        再来看看TI:串行口发送中断标志。

当一帧信息发送完成时,发送中断标志TI置1,向CPU申请中断。所以在有串口中断程序的时候,我们初始化的时候应该把这一位置0,免得还没有开始发送就申请中断啦!(我们先这样简单的解释一下,说多了大家可能会晕哦,如果想了解的更加详细,自己参考相关教材吧!^_^)。

          RI:串行口接受中断标志。

当串口接受完一帧信息后,接受中断标志RI置1,向CPU申请中断,如果CPU允许中断,就进入串行中断服务程序。同样,在有串口中断程序的时候,初始化的时候也应该把RI清0,免得还没有开始接受就申请中断啦!

但是这里需要说明一点:CPU事先不能分辩是TI还是RI的中断请求,所以必须在中断服务程序中加以判断,然后在程序中用软件清零。

         REN:允许串行口接受控制位。当REN=1时为允许串行口接受数据;当REN=0时为禁止接受状态。在这个实验里面,由于我们用单片机发送数据,所以这一位置0置1均可,我们就把它置0吧。

         TB8:在方式1中该位没有用,在方式2、3中,是要发送的第九位数据。所以这一位是1和0均可。

         RB8:在方式2、3中,它是接受到的第九位数据位。在方式1中,当SM2=0,RB8是已经接受的停止位。

 综上所述,我们这个实验里面,对串口的初始化程序可以是:mov scon,#40h

3、串口波特率的计算

当串口工作于方式1,波特率是可变的,我们可以灵活的进行设置,通过给计数器置入不同的初值,产生不同的波特率。

计数初值N和波特率之间的关系可以用下面的公式描述:

N=28-(2SMOD×fosc)/(32×12×波特率)

其中的SMOD是特殊功能寄存器PCON的最高位,叫做波特率选择位,格式如下,其中和串口有关的只有D7位,其余的我们就不研究了。

            单片机学习之十八:串行通讯程序:单片机发送 - 北极星 - 要做一粒好的种子

它的设置可以通过如下的程序完成:

mov pcon,#00h   ;使smod=0

mov pcon,#80h   ;使smod=1

下面通过例子说明N的计算方法,例如:

(1)、系统晶振12MHZ,当SMOD=1,欲产生的波特率为2400,时间常数N的计算如下:

N=256-(2×12×106)/(32×12×2400)=256-26.04=230=E6H

(2)、系统晶振12MHZ,当SMOD=0,欲产生的波特率为2400,时间常数N的计算如下:

N=256-(1×12×106)/(32×12×2400)=256-13.02=243=F3H

关于N的计算我们就简单的说这么多吧,后面的说明里面有一个常用的波特率设置的表格,在设置波特率的时候可以进行查阅。

从上面我们可以看到,SMOD取0或者1都可以产生2400的波特率,那么到底应该如何选择呢?其实,SMOD的选择影响着波特率的准确度。关于这部分内容的详细讨论大家可以参考相关教材,我们就不多说了。

 4、数据的发送过程

设置好了串口的工作方式和波特率,我们就可以进行数据的发送拉。发送的过程如下:CPU执行一条将数据写入发送缓冲区SBUF的指令即可启动发送(如mov sbuf,a),串行数据从TXD引脚输出,发送完一帧数据后,由硬件把TI置位。

 (五)、单片机的串口电平转换电路

以上我们介绍的是单片机串口的定义和设定,在实际使用的时候,单片机串口输出的是TTL电平,传输的距离非常有限,不超过1.5m。而电脑的串口输出的是RS232电平,两者的电平并不相同,需要外接接口进行电平匹配,这个电平转换芯片采用专用芯片max232来完成。

在学习板的电路上,是采用3线制连接串口,也就是说和电脑的9针串口连接3条线即可,RXD(串行输入通道)、TXD(串行输出通道)、GND,对我们来说已经够用了。具体的电路如下图所示,这是一个典型电路,可以直接使用:

 

单片机学习之十八:串行通讯程序:单片机发送 - 北极星 - 要做一粒好的种子

对这个电路我们简单解释一下:

         T1IN、T2IN:   两路TTL电平输入引脚,连接单片机的串行输出TXD脚。

         T1OUT、T2OUT: 两路RS232电平输出引脚,连接电脑9针串口的串行输入RXD。

         R1IN、R2IN:    两路RS232电平输入,连接电脑9针串口的串行输出TXD端。

         R1OUT、R2OUT:两路TTL电平输出,连接电脑9针串口的串行输入RXD端。

          4个外接电容进行电压匹配和电源去耦。

 通过MAX232的TTL和RS232输入输出端口,自动调节了单片机串口的TTL电平信号和RS232串行通信信号的电平匹配。

顺便说一句:本实验是单片机和电脑之间的串行通讯,两者电平不同,所以需要电平转换芯片,如果是单片机和单片机之间的通讯,两者都是TTL电平,就不需要进行电平转换,两个串口可以直接通过导线连接。

 (六)、串口调试助手

为了能够在电脑上看到单片机发送过来的数据,我们必须用一个软件来观察通讯情况。这里采用“串口调试助手”软件,这是一个绿色软件,无需安装,可以直接运行。它的设置方法可见下面的图解:

单片机学习之十八:串行通讯程序:单片机发送 - 北极星 - 要做一粒好的种子

 

 

 

四、实验程序

 

org 0000h

clr p1.5

 ;以下是串口初始化程序

mov scon,#40h       ;选择串口工作于方式1

mov tmod,#20h      ;定时器T1设置为工作方式2,用作波特率发生器

mov tl1,#0f3h       ;按照波特率为2400计算初值

mov th1,#0f3h       ;把计数初值送入常数缓冲器

mov pcon,#80h      ;smod=1,波特率变成4800

setb tr1            ;启动定时器T1

 

;以下判断是否按键k0按下

wait1:   jb p1.1,wait1        ;k0没有按下,等待

        acall del10ms       ;延时10ms去抖动

jb p1.1,wait1       ;再次查询k0,是抖动返回

wait2:   jnb p1.1,wait2       ;等待按键弹起

mov a,#62h        ; 01100010送到a

mov sbuf,a         ;发送信息,传送的一帧信息为:0+01100010+1

ajmp wait1         ;返回继续查询k0是否按下

 

del10ms: mov r7,#20         ;延时10ms子程序

del1:    mov r6,#0ffh

del2:    djnz r6,del2

        djnz r7,del1

        ret

  end

 五、几点说明

 

1、该例子中,单片机向电脑发送的是一个数据,所以我们我们在串口助手上选择16进制显示,就会显示数据62,如果我们不选择16进制显示,那么发送的就是ASCII码,大家可以试一下,这时显示的是字符b。

2、下表是串口常用的波特率设置,便于大家使用的时候查阅:

工作

方式

波特率

Fosc=6M

Fosc=12M

Fosc=11.0592M

 

方式1

或者

方式3

 

SMOD

TMOD

TH1

SMOD

TMOD

TH1

SMOD

TMOD

TH1

62500

-

-

-

1

20

FFH

-

-

-

19200

-

-

-

-

-

-

1

20

FDH

9600

-

-

-

-

-

-

0

20

FDH

4800

-

-

-

1

20

F3H

0

20

FAH

2400

1

20

F3H

0

20

F3H

0

20

F4H

1200

1

20

E6H

0

20

E6H

0

20

E8H

600

1

20

CCH

0

20

CCH

0

20

D0H

 

 

 

关键字:单片机  串行通讯  单片机发送 引用地址:单片机学习之十八:串行通讯程序:单片机发送

上一篇:单片机学习之十九:串行通讯程序-单片机接收
下一篇:单片机学习之十六:定时器应用3(模式3)

推荐阅读最新更新时间:2024-03-16 15:09

单片机智能集群控制消防应急指示灯设计
  传统的消防应急标志灯有一个致命缺陷,就是它只能指示一个固定的逃跑方向,一般是指向最近的安全门,但是这样会出现很多不利情况:如果指示的前方发生火灾或正是烟雾蔓延过来的方向,或安全门由于故障而不能自动开启,或建筑内的消防应急灯在平时没能实时维护,在危机情况出现故障时,消防应急标志灯失去了应有的作用,所以目前应用的传统消防应急灯有很大的局限性。对此我们设计出一种新型的智能应急逃生指示终端,能够实时报告设备状况,在险情发生时自动将危险信息传送到各个终端,照明终端自动打开,指示智能终端根据险情自动计算出合理的逃生方向。   1 智能消防应急逃生指示与管理维护系统的组成   智能应急逃生指示系统包括智能终端(智能应急照明灯、智能应急指
[单片机]
<font color='red'>单片机</font>智能集群控制消防应急指示灯设计
PIC12F629 单片机开发程序,LED灯
#include pic.h __CONFIG(0x0184); //什么都关,用内部RC #define OUT_LED GPIO2 void Delay_us(unsigned int n) { while(n--); } void main() { GPIO = 0X37; //IO口数据 INTCON = 0X00; //中断控制位;全关 IOCB = 0X00; //电平变化触发中断;全关 CMCON = 0X07; //关比较器 OPTION = 0X00; //IO口上拉;WPU只能在输入的时候使用 TRISIO = 0X08; //GPIO3只能输入,别的都输出 while(1) { OUT_
[单片机]
51mcu模拟ps2键盘发送数据
这个是程序是来自我以前开发的一个项目,其中里面的的void ps_send(uchar x) 这个函数,便可实现向电脑发送按键的数据 你只要对照 ps2 扫描码的表填入适当的参数即可 #include "STC89C51.H" #include"keyboard.h" #include INTRINS.H #define nop() _nop_() uchar *receive_buf;//接收来自计算机的数据 //uchar key; unsigned char key_buf ; /******延时子程序********/ void delay_ms(uchar a) {uchar i; uchar j; for(j=0;j
[单片机]
基于DSP的纸币号码识别系统
   1 引言   近年来,钱币、特别是纸币被抢劫事件不断发生,严重影响了社会治安,也使银行在经济上受到了严重的损失。如果被抢劫的钱币不能在市场上流通,将从一个方面抑制银行抢劫事件的发生。其中一种解决方案是记录每一捆纸币的号码,将被抢劫的纸币号码建立一个数据库。在货币流通市场提供一种纸币号码自动识别装置,比如说与点钞机结合,将货币号码识别数据与被抢劫号码数据库比较,一旦有相同号码出现,便可确认目前流通的钱币为被抢劫的钱币,从而限制其流通,同时也有利于抢劫案件的侦破。另外,由于纸币号码的唯一性,通过识别纸币上的号码,可以帮助识别假币。国外有一种验钞打号机,可以对典型的纸币,比如美元、英镑等进行自动识别和号码打印,这种装置的典型识
[嵌入式]
IAR Embedded Workbench现已支持性价比出众的新型STM32 MCU系列
IAR Embedded Workbench现已支持性价比出众的新型STM32 MCU系列 IAR携手ST帮助成本敏感型应用的开发人员从8位/16位MCU转向全新的入门级32位STM32 MCU系列 瑞典乌普萨拉–2023年2月23日–意法半导体(STMicroelectronics,以下简称 ST)最近推出了性价比出众的STM32C0系列产品,为开发人员降低了STM32入门门槛。 现在,嵌入式开发软件和服务的全球领导者、ST的授权合作伙伴IAR 宣布支持这款热门STM32微控制器的最新产品系列。性能强大的IAR Embedded Workbench for Arm可帮助开发人员构建紧凑的代码并加以优化,以及提供全面
[单片机]
IAR Embedded Workbench现已支持性价比出众的新型STM32 <font color='red'>MCU</font>系列
51单片机的数码管和矩阵键盘
使用4*4的矩阵键盘和一个数码管 在4*4的矩阵键盘上编码0-F的字符,和一个数码管显示每个键盘上输入的字符。 //4*4键盘检测程序,按下键后相应的代码显示在数码管上 #include reg51.h typedef unsigned char UINT8; UINT8 i=100; UINT8 j,k,temp,key; void delay(unsigned char i) { for(j=i;j 0;j--) for(k=125;k 0;k--); } UINT8 code table = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
[单片机]
改善8051系统用电效率的微控制器
摘要:一种改进架构的高性能8051设计、外围功能集成、选用合适的时钟源以降低功耗;并介绍节省电能的软件技术及采用待机模式降低功耗的技巧。 关键词:停机模式 空闲模式 功率管理模式 便携式产品的功能和性能日新月异。 消费者对产品性能的要求也越来越高,需要更强大的运算能力支持;另一方面,希望产品具有更低的功耗。 尽管已经出现了很多功耗处理器,但它们的性能通常很有限。Dallas公司的系列高速微控制器在性能和功耗之间取得了一个很好的折衷,采用了8051架构——世界上最流行的微控制器之一。简单易用、丰富的I/O资源使这种微控制器深受设计者的喜爱,并被广泛接受。它的流行势头已蔓延到了便携式领域,在很多应用中都有其用武之地。 本文
[应用]
一文读懂汽车控制芯片(MCU
本文从工作要求,性能要求,产业格局,行业壁垒四个维度,分别介绍车身、底盘、动力、座舱四个域的 MCU 芯片 。并整理了国产MCU芯片的应用现状,供从业者参考。 1.控制类芯片介绍 控制类芯片主要就是指MCU(Microcontroller Unit),即微控制器,又叫单片机,是把CPU的主频与规格做适当缩减,并将存储器、定时器、A/D转换、时钟、I/O端口及串行通讯等多种功能模块和接口集成在单个芯片上,实现终端控制的功能,具有性能高、功耗低、可编程、灵活度高等优点。 车规级MCU示意图 汽车是MCU的一个非常重要的应用领域,据 IC Insights数据,2019年全球MCU应用于 汽车电子 的占比约为33%。高端车
[汽车电子]
一文读懂汽车控制芯片(<font color='red'>MCU</font>)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved