单片机串口

单片机串口,第1张

关于串口实验你可以看看这篇文章:

http://www.hificat.com/dpj_step/rs232.asp

手把手教你用增强型51实验板实现RS232串口通信 《电子制作》2006年8月 站长原创,如需引用请注明出处

上一期,我们已经利用增强型51实验板学会了单片机控制步进电机转动的方法,这一期,我们将一起来学习一下单片机如何与PC机进行通信,一起来完成一个简单的RS232通信实例,我们不做太多的理论,从实例出发,相信能够给大家一个比较通俗、透彻地认识,掌握了它的原理,那你就可以编出任何和PC机进行通信的程序了。

前几期,我们学习和介绍的内容都是以单机的形式,即所有的功能都是在一块增强型51实验板上得以实现。当单片机技术具体应用到工厂、企业及各类工业、民用领域中,它肯定要与外部设置作数据传输,其交互性也使得单片机的应用越来越广泛,我们可以利用它来传数据,传控制命令等等。因此,单片机与PC机的通信是我们学习单片机技术所经历的必要环节,由此,也使我们的学习更具趣味性。

下面我们一起来完成一个用单片机从串行口接收PC机数据,并在数码管上显示出来的实验。

先介绍一下串口通信基本知识。目前较为常用的串口有9针串口(DB9)和25针串口(DB25)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。串口引脚定义如图1所示。

9针串口(DB9) 25针串口(DB25)

针号

功能说明

缩写

针号

功能说明

缩写

1

数据载波检测

DCD

8

数据载波检测

DCD

2

接收数据

RXD

3

接收数据

RXD

3

发送数据

TXD

2

发送数据

TXD

4

数据终端准备

DTR

20

数据终端准备

DTR

5

信号地

GND

7

信号地

GND

6

数据设备准备好

DSR

6

数据准备好

DSR

7

请求发送

RTS

4

请求发送

RTS

8

清除发送

CTS

5

清除发送

CTS

9

振铃指示

DELL

22

振铃指示

DELL

图1 DB9和DB25的常用信号脚说明

我们来看一下本次实验的电路图,如图2所示,即增强型51实验板实现串口通信及数码管显示的电路部分。图2中的4个三极管分别与4个共阳数码管相连,是各个数码管的使能端,分别通过单片机的P2.0,P2.1,P2.2,P2.3来控制,数码管显示的详细工作原理,我们已在前几期杂志中作过介绍,有兴趣的朋友可以去看一下以前几期的内容。图2中MAX232芯片起到RS232与TTL电平转换的作用,我们通过9芯串口与PC机相连。

图2 硬件电路原理图

下面是我们完成本次实验的源程序代码,使用Keil编译软件,将其编译生成HEX文件,然后,通过A51编程器烧入AT89S51芯片即可。

#include "reg51.h"

#include <absacc.h>

unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

unsigned char dat

void Init_Com(void)

{

TMOD = 0x20//定时器工作方式2,初值自动装入

PCON = 0x00//波特率不增倍

SCON = 0x50//串行工作方式设定

TH1 = 0xFd//定时器初值高位

TL1 = 0xFd//定时器初值低位

TR1 = 1//启动定时器

}

/*函数功能:LED数码管延时程序*/

void delay(void)

{

int k

for(k=0k<600k++)

}

/*函数功能:LED数码管显示程序*/

void display(int k)

{

P2=0xfe//位选

P0=tab[k/1000]//显示千位数字

delay()//延时

P2=0xfd//位选

P0=tab[k%1000/100]//显示百位数字

delay()//延时

P2=0xfb//位选

P0=tab[k%100/10]//显示十位数字

delay()//延时

P2=0xf7//位选

P0=tab[k%10]//显示个位数字

delay()//延时

P2=0xff//位选

}

/*函数功能:主程序*/

void main()

{

P2=0xff//端口初始化,关LED显示

P0=0xff

Init_Com()//调用串口初始化程序

while(1) //主循环

{

if ( RI ) //判断是否收到数据

{

dat = SBUF//接收数据

RI = 0//软件清除标志位

}

display(dat-48)//显示收到的数据

}

}

我们来一起分析一下程序代码,main主程序首先将P2口和P0口全部输出高电平,即数据管不显示任何内容,Init_Com函数用来初始化串口设置,如波特率设置,工作方式的设置,这些都是程序运行的一切初始化设置。然后,我们看到了一个while(1)语句,该语句的作用是产生死循环,即单片机上电复位后,我们就不断地去接收由PC机发过来的串口数据,同时将接收到的数据放在dat 这个变量中,每接收完一次数据,我们需要执行RI = 0这条语句,用来清除串口数据接收标志位,现在我们已经收到了PC机传过来的数据了,余下的任务就是要将数字通过数码管显示出来,我想大家看了我们前几期的介绍,已经并不陌生数码管的使用了,在这里,我们也写得非常简洁,通过display这个函数将数字显示出来,因为我们收到的是字符型的ASCII码数据,如数字“0”的ASCII码值是48,所以,我们要显示“0”的话,还需要将其值减去48后才是真正要显示的数据。数码管我们采用动态扫描法进行显示,delay函数的作用是产生一定时间的延时,对于人眼来说是分辨不出来的,在display的函数体内,我们先将数据装载到P0口,如我们在程序开始时定义的:unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}语句,意思相当于:数字“0”对应的数码管段码值为“0xc0”, 数字“1”对应的数码管段码值为“0xf9”, 数字“2”对应的数码管段码值为“0xa4”……以此类推,最后通过数码管的使能端来显示各位数码管的值。至此,整个程序的功能就轻松地实现了我们所需要的功能,看到这里相信你现在对串行通信感到并不是原来想的那么深奥了吧。

现在我们已经将程序写好,并烧入了单片机芯片,下面我们要做的就是用串口线将增强型51实验板和PC机相连起来,同时给实验板接上电源,然后就是通过PC机软件来发数据了,要在PC机上向串口发送数据一定要借助相应软件,打开光盘内附带的串口调试软件,它设置方便、灵活,界面简洁明。因为我们得告诉实验板来显示哪些数字,程序的功能是发送“1”、“2”、“3”......“8”、“9”、“0”等字符,增强型51实验板收到数据后通过数码管显示出来,所以我们得在软件发送区内填上我们所需要发送的数字,如图3所示。

图3

串口调试软件中,设置参数如下:串口:COM1;波特率:9600;校验位:无;数据位:8位;停止位:1位;发送内容:5

当我们点击“手动发送”按钮后,我们可以看到增强型51实验板上的数码管已显示数字“5”的字样,如图4所示。当然,我们也可以选择“自动发送”,即每隔一定的时间,由软件自动发送“发送缓冲区”内的数据,时间周期可以在软件界面中设置。

图4

现在,你已经可以自由发挥来接收PC机发过来的数据了,只要发挥你的想象力,定义好PC机和单片机两端的数据通信协议,你可以做出任何通过电脑来对单片机进行控制的程序,实现各种各样的数据传输,远程控制功能,比如通过PC机来控制液晶显示、控制步进电机的转动、控制蜂鸣器奏乐等等,您也可以将本期所讲的知识与前几期所讲的关联起来,完成功能更多,更实用的具体应用实例。因此,到本期的学习,我们已经可以将单片机与PC相连,借助PC机强大而灵活的功能,就可以为我们解决各类实际生产及应用型问题提供了方便。这一期的内容我们就介绍到这里,增强型51实验板更多的学习内容,我们将在以后几期陆续为大家作介绍,祝大家学习顺利。

第一,首先要知道PS/2接口跟PC是怎样连的。PC里的ps/2一般接键盘或鼠标。

PS/2的针脚

:

6*

u

*5

4*

*3

2*

*1

1

n/c

不连

2

DATA

KeyData-

3

VCC

Power,+5VDC

电源5伏

4

GND

GND

地线

5

n/c

不连

6

CLK

Clock-

时钟线

接线黄、红、白、绿对应的针脚如下

键盘

鼠标

3

4

6

绿

绿

2

接下来,你要知道数据是怎样经过ps/2接口传输到pc的?

数据是变成了2进制数后经过ps/2接口传递到PC的,常用串行方式传递数据。

所以单片机要用串行方式和ps/2通讯。即单片机的TXD做移位脉冲,接PS/2的6脚RXD是数据线,接PS/2的2脚.

还不明白给hychyc_2008发消息。

ps2是11位。

PS/2帧的第一位是起始位,为0,然后是8位数据位,发送键盘扫描码的一个字节(扫描码为1-4个字节),然后是奇偶校验位,最后是停止位,为1。这些是在数据线(即1号引脚线)上发送的。无键按下时,数据线和始终线都保持为1。当有键按下时,时钟线CLOCK送出脉冲,同时数据线送出数据。主机(此处是89c51

MCU)在始终脉冲的下降沿对数据线采样获得数据。键盘扫描码包括通码和断码,当键按下时发送通码,抬起时发送断码。更详细的内容可参考所附的《PS/2

技术参考》。

根据上述原理,我这样设计了实验:将键盘的脉冲线接至89c51的外部中断输入口(INT0或INT1),当键按下和抬起时有脉冲产生,此脉冲引发MCU

中断。将键盘的DATA线连至89c51的输入口(如P1.0)。在中断处理程序中,从输入口读入数据,然后通过循环移位对读进的数据位进行处理,1(起始位)、10(奇偶校验)、11(停止位)可抛弃,如不嫌麻烦也可将奇偶校验位加以应用。当一个数据帧收完后,将处理后剩下的2-9位(即扫描码)通过串口发至PC机,通过PC机的串口监视软件(如“串口调试助手”)来查看。硬件连线和源码如下:

源码:

ORG

0000H

AJMP

MAIN转入主程序

ORG

0003H

外部中断P3.2脚INT0入口地址

AJMP

INT

转入外部中断服务子程序

以下为主程序进行CPU中断方式设置

MAIN:MOV

SCON,#50H设置成串口1方式

MOV

TMOD,#20H波特率发生器T1工作在模式2上

MOV

PCON,#80H波特率翻倍为2400x2=4800BPS

MOV

TH1,#0F3H预置初值(按照波特率2400BPS预置初值)

MOV

TL1,#0F3H预置初值(按照波特率2400BPS预置初值)

SETB

EA

打开CPU总中断请求

SETB

IT0

设定INT0的触发方式为脉冲负边沿触发

SETB

EX0

打开INT0中断请求

SJMP

$

INT:

CLR

EA

暂时关闭CPU的所有中断请求

CJNE

R0,#0,L1

L3:

INC

R0

SJMP

L5

L1:

CJNE

R0,#9,L2

SJMP

L3

L2:

CJNE

R0,#10,L4

SETB

TR1启动定时器T1

MOV

SBUF,A

MOV

R0,#0

L5:

SETB

EA

允许中断

RETI

退出子程序

L4:

MOV

C,P1.0

RRC

A

SJMP

L3

END

搞定后,当按下和释放键时,会在PC机上显示其扫描码。

忘了说明一点,通电时键盘会自检,此时键盘上三个灯全亮,自检完成后熄灭,并向主机发送十六进制字符AA.。

以上取自某网页。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8120624.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存