微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机学习之十八:串行通讯程序:单片机发送

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

时间:11-18 来源:互联网 点击:

机发送数据,所以这一位置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进

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top