用户工具

站点工具


侧边栏

抱歉,您没有权限增加页面
4.单片机入门教程:8.串口发送与接收

单片机入门教程之串口发送与接收

在做实验之前,首先,什么是串口这个概念得搞清楚。串口是计算机上的通讯接口之一,由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口,九针串口学名叫RS232接口,现在大部分主机板都没有引出这个接口了,先看看长啥样吧:

打开设备管理,如果在端口中能看到COM1,那么你就可以瞅瞅你的机箱后面,亲眼目睹一下那帅的惨绝人寰丧尽天良的串口了,这种带针的叫公口,插在这上面的叫母口(X宝搜一下串口延长线就可以看到了)。岁月匆匆不饶人啊,骚年,趁着年轻要多多学习啊。由于时代在进步,串口(COM)传输速率较低,这种接口在家用电脑上已经淘汰,所以现在的家用电脑主板基本都不会带串口了,工控机上会有好几个。9针功能定义如下:

目前串口多用于工控设备,如果想用电脑和单片机之间通信,最简单的就是用串口了,电脑串口(RS232)的电平是±12V,而单片机一般是5V(TTL)或3.3V,直接连在一起会烧掉单片机,这时候就要用一片电平转换芯片,使他们之间安全的通信,最常用的就是使用max232(5V单片机使用)或MAX3232(3.3V单片机使用)芯片。和单片机通讯只需要三根线就可以了,其他不接,分别是接收数据2脚(RXD),发送数据3脚(TXD)和信号地5脚(GND),这三个引脚通过电平转换芯片MAX232连接到单片机的RXD和TXD引脚就可以通讯了。电路图如下,如果你的电脑有串口,可以用一块万能板焊出来玩玩。

考虑到笔记本99.999%没有串口,51Discovery板放弃了传统的九针接口,使用了USB转串口方案,型号为CH340T,用此芯片可以使用USB口给电脑转换出来一个串口,而且电平可直接连接单片机。芯片的TXD连接单片机的RXD,RXD连接到单片机的TXD,这样一个发送一个接收就可以通信了,电路请查看原理图。

两个端口之间进行通信,必须设置的几个参数如下:(9600,8,N,1)

1) 波特率:这是一个通信速度参数。它表示每秒钟传送bit的个数。例如300波特表示每秒钟可以发送300个bit。通常使用9600 ,115200等

2) 数据位:这是通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

3) 停止位:用于表示单个数据包的最后一位。典型的值为1、1.5或2位。停止位不仅表示传输的结束,并且提供计算机校正时钟同步的机会。停止位的位数越多,不同时钟同步的容错程度越大,但同时数据传输率也越慢。

4) 校验位:在串口通信中一种简单的检错方式。有三种检错方式:偶(E)、奇(O)、无(N)。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据不同步。

电脑如何发送数据给单片机呢?你需要写一个上位机来控制电脑串口发送和接受数据。还好,已经有人写好并打包成了程序,我们直接就可以拿来使用,名字叫串口助手,搜索一下可以找到多个版本供我们使用。在51Discovery资料包【工具软件】文件夹中可以找到串口助手软件UartAssist.exe ,如果我们已经写好了单片机程序,打开这个软件设置好以上四个参数,就可以和单片机发送接收数据了。

相关概念介绍完毕,内容大多来自网络,百度一下,你就知道,接下来看看,如果让单片机串口工作需要设置的寄存器有哪些。STC12C5A60S2有两个串口,这里我们只学习串口1。串口1对应的管脚是TXD(P3.1)和RXD(P3.0)。

串口1的相关寄存器如上,串口的发送和接受也会触发中断,这时候就可以在中断服务函数中处理发送的和接受的数据了,但通常程序中会使用查询方式,个人感觉比用中断服务函数更方便直观些,使用查询中断标志位方式只需要设置上面红框中四个寄存器就行了。

在看代码之前,先来了解下四个寄存器的意思:
1.BRT寄存器,用于保存独立波特率发生器重装数,重装数决定着串口的波特率是多少,如果不使用独立波特率发生器将会占用定时器1作为波特率发生器,在以下演示代码中使用的都是独立波特率发生器,这样可以省掉定时器1。
2.AUXR寄存器,串口辅助寄存器,主要用来设置是使用定时器1作为波特率发生器还是使用独立的波特率发生器。
3.SCON寄存器,串口的主要控制寄存器,用来设置串口的工作方式,其中串口的中断发生标志位也在此寄存器中。
4.SBUF寄存器,串口发送和接受数据缓冲寄存器,把你想通过串口发送出去,数据写进SBUF即可,把你想读出串口发送过来的数据直接读SBUF中的数据即可。

代码演示一:单片机串口如何接收电脑串口发来的数据
(通过电脑端串口助手发送16进制数值,单片机接收此数据P0口LED显示值)

注:本代码完整工程在stc51 discovery开发板【实验例程】【入门实验】【实验二十八】

代码解释
先从Uart_Init();串口初始化函数走起,第41行,SCON=0x50;设置串口为工作方式1,8位数据,可变波特率,允许串口接收。寄存器功能定义如下:

SCON=0x50即:SM0/FE=0;SM1=1;SM2=0;REN=1;TB8=0;RB8=0; 寄存器各位设置如下:

第42行,BRT=0XFD;设置串口波特率为9600;计算公式为BRT=256-(SYSclk/Bund/32/12)这个就和定时器装载值差不多。寄存器功能说明如下:

第45行,AUXR=0x11;设置串口1使用独立波特率发生器,串口速度12分频兼容传统8051速度,波特率不倍速,释放定时器1,寄存器功能如下:

串口初始化完毕,串口已经开始工作,现在主函数中就可以接收串口发来的数据了,第27行,if(RI= =1)这句话就是判断有没有数据发过来,第29行,RI=0; RI必须由软件清零,第30行,P0=SBUF;读取串口缓存区SBUF中的值,把发来8位16进制值在LED上显示。RI是上面SCON寄存器中的B0位,功能如下:

好了,单片机串口接收数据就是这样的了,自己写一下,下载到单片机中试一下吧,通过电脑端串口助手软件发送0x01给单片机,如果P0口LED最低位一个灯亮一下。恭喜,试验成功了。串口助手怎样操作呢,看看这张无码高清图你就明白。

代码演示二:单片机串口如何发送数据到电脑串口(单片机串口不断向电脑串口发送hello字符串)

注:本代码完整工程在stc51 discovery开发板【实验例程】【入门实验】【实验二十九】

代码解释:
可以看到,发送代码的串口初始化部分和接收的一模一样,只是在主函数中把接收代码换成了发送,第28行,SBUF=hello[i];这句话的意思就是把要发送的数据写进SBUF。第29行,while(!TI); 等待查询8位数据是否发送完毕。第30行,发送标志位由软件清零。TI是上面SCON寄存器中B1位。功能如下:

好了,下进去看看吧,打开串口助手,并打开串口,接收区设置:不要勾选 16进制显示 选项,否则看到的是乱码哦。实验成功现象如下,单片机每隔三秒向串口助手发送HELLO:

到这里,单片机串口接收和发送数据都已经OK了,怎样把他们整合在一起呢?就是通过串口助手发给单片机的数据,然后单片机再返回发来的数据给串口助手,聪明的你应该想的到,把上面的发送和接收都放在主函数里不就OK了吗?对了,就是这样的,把SBUF里发送来的数据保存在临时缓存里,然后再把缓存中的内容给SBUF发送出去就好了,尝试自己写一下吧,这里就不贴代码了,完整工程在:【实验例程】【入门实验】【实验三十】

4.单片机入门教程/8.串口发送与接收.txt · 最后更改: 2017/03/06 16:42 由 wawooo