
单片机串口
关于串口实验你可以看看这篇文章:手把手教你用增强型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
然后,我们看到了一个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实验板更多的学习内容,我们将在以后几期陆续为大家作介绍,祝大家学习顺利。
单片机串口
void ser()interrupt 4{ RI=0; a=SBUF;\\\/疑问三:\\\/计算机往单片机发数据 flag=1;}\\\/****************************************************************************************************************** 单片机接收串口调试助手发来的数据后,进入中断,清除IR接收标志,单片机把接收到的数据存放到变量a里面,flag = 1,应该是切换标志,flag = 1,进入单片机发送状态*******************************************************************************************************************\\\/if(flag==1) \\\/\\\/进入发送状态 { ES=0; for(i=0;i<6;i++) { SBUF=table[i];\\\/\\\/疑问1:这个是单片机往计算机上发数据 while(!TI);\\\/\\\/发送完毕 TI=0; }\\\/******************************************************************************************************************** 这里SBUF=table[i];是单片机往串口调试助手发送数组*******************************************************************************************************************\\\/ SBUF=a;\\\/\\\/疑问2:单片机往计算机上发数据\\\/******************************************************************************************************************* SBUF=a;这里是单片机把接收到的数据存放到变量a里面,然后再把接收到的数据返回给口调试助手******************************************************************************************************************、 while(!TI); TI=0; ES=1; \\\/\\\/开启中断 flag=0; \\\/\\\/关闭发送标志进入接收 } }}
单片机串口
PC的并口为一个标准的25座,包含一个八位二数据(地378H),即第2脚到第9脚;一个输入控制端口(地址为379H),即第15脚、13脚、12脚、10脚、11脚,其另外低三位无定义;一个输出控制口(地址为37AH),即第1脚、14脚、16脚、17脚,其另外高四位无定义。
由此可见后面两个端口都不是完全的8位。
输出接口电路扩展 这里使用常用的移位寄存器74LS164与单片机的RXD口构成输出接口电路。
双列直插式74LS164引脚定义。
其中:QA-QH为并行输出的数据,送入PC机并口378H端口(接收数据的8个数据位);单片机串口输出的数据从AB输入;CLR信号用于清除输出数据(通常用在移位完成时);内部数据移位依靠时钟CLK信号上升沿(由单片机TX提供)控制。
输入接口电路扩展 使用常用的移位寄存器74LS165与单片机的RXD口构成输入接口电路。
单片机串口
我用这个没调出来,KEIL不好直接仿真,最后我是先在KEIL上运行程序,在单片机上能操作后,然后退出KEIL仿真,通过串口调试助手仿真,来控制单片机,这样就解决了
单片机串口通信
我看了你的说明,其实很简单的,RI是通过软件来复位的,他有固定的格式,比如说b为一个变量存储单元接受if (RI) { RI=0; b=SBUF;}发送SBUF = b;while(!TI);TI = 0;永远记住这个格式,这是不会变的!



