查看: 177|回复: 4

[天问STC8]单片机学习笔记(串口)

[复制链接]

6

主题

40

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2021-7-29 17:23:37 | 显示全部楼层 |阅读模式
本帖最后由 陈畅南 于 2021-7-30 15:26 编辑

目录
1、基本介绍
2、串口的使用方法
3、串口的应用
回复

使用道具 举报

6

主题

40

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2021-7-29 17:29:25 | 显示全部楼层
1、串口的基本介绍
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。


2、stc8中的串口功能
    8051单片机内部有一个功能强大的全双工异步通信串行口。
    所谓全双工就是双机之间串行通信时接收和发送数据可同时进行。
    所谓异步通信,就是接收和发送双方不使用共同的同步时钟来控制收、发双方的同步,而是依靠各自的时钟来控制数据的传送。
    异步通信传送的串行数据是一帧一帧进行的,一帧信息一般包括以下内容:一个起始位,一般为0,表示一帧信息的开始;若干数据位,一般为8~9位;一个停止位,一般为1,表示一帧信息的结束;数据与数据之间用空闲位“1”来填充。在串行通信中,为保证收发双方数据的正确传送,发送和接收的速率(即波特率)必须一致。




在stc8上,主要使用的是串口1
图片1.png
回复

使用道具 举报

6

主题

40

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2021-7-30 15:25:59 | 显示全部楼层
2、串口的使用方法
    在一开始学习串口的时候,我对串口的机理有很多不明白,所以整出了很多错误。串口这个功能和GPIO等不同,对串口的理解会大大影响串口的使用。所以,我这里在串口的应用时试图理解串口的原理,更好掌握串口的使用。
(1)串口传输数字
    最简单的串口程序。


   
    打开串口监视器,观察结果。


   其实这里可以看到串口的传输使用ASCLL码完成的,0x31对应字符‘1’。在这个时候,我试图通过串口来升级我的时钟程序,加一个通过串口改时间的模块,可是串口总是不能正确读取我输入的时间,后来我发现,输入的得是16进制。

(2)串口传输字符串
    同样使用天问block中的反、范例进行实验。




以下是串口传输字符串的源代码。

void uart_putstr(UART_Name uart_n, uint8* str)
{
        while (*str)
        {
                uart_putchar(uart_n, *str++);
        }
}

下面这个是uart_putchar()函数的源代码:

void uart_putchar(UART_Name uart_n, uint8 dat)
{
        switch (uart_n)
        {
                case UART_1:
                        /*while (busy[1]);
                        busy[1] = 1;*/
                        SBUF = dat;
                        while (UART1_GET_TX_FLAG == 0);
                        UART1_CLEAR_TX_FLAG;
                        break;
                case UART_2:
                        /*while (busy[2]);
                        busy[2] = 1;*/
                        S2BUF = dat;
                        while (UART2_GET_TX_FLAG == 0);
                        UART2_CLEAR_TX_FLAG;
                        break;
                case UART_3:
                        /*while (busy[3]);
                        busy[3] = 1;*/
                        S3BUF = dat;
                        while (UART3_GET_TX_FLAG == 0);
                        UART3_CLEAR_TX_FLAG;
                        break;
                case UART_4:
                        /*while (busy[4]);
                        busy[4] = 1;*/
                        S4BUF = dat;
                        while (UART4_GET_TX_FLAG == 0);
                        UART4_CLEAR_TX_FLAG;
                        break;
        }
}


结合之前串口的基础知识,串口是一位一位传输的,也就是说串口输入输出的信号都是二进制的串。这也就能理解为什么输入输出都是16进制了。也是通过这一些源码,可以发现串口不能传输整形浮点型数字,只能传输ASCLL码,如果要传输“2020”这样的数字,得把她转化为字符串,并将字符串与其的ASCLL码相对应。
1.3.PNG
1.PNG
1.2.PNG
1.1.PNG
1.2.PNG
回复

使用道具 举报

6

主题

40

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2021-7-30 17:16:12 | 显示全部楼层
3、串口的应用

上一层楼演示了串口的“发”,要使用串口,就得学习串口的接收。


串口有两种接收方式,查询接收和中断接收







和定时器中断以及外部中断不同的是,串口接收中断得将一个RX标志清除,否则程序就会一直中断下去。

接下来我将试着把一个RTC时钟改成可以通过串口完成调整和发送时间的时钟。

我先编了一个实验性的程序,当串口接收到了信息,则把时间重置。


可以实现效果,印证了串口中断的使用方法。
接下来测试了传输。


没有问题。

接下来对RTC时钟进行测试。
RTC时钟的时间设置源码如下:
    _mytime.year = 2020;
    _mytime.month = 10;
    _mytime.day = 27;
    _mytime.hour = 15;
    _mytime.minute = 06;
    _mytime.second = 20;

然后去查了这些的定义,除了year是无符号16位,其他都是无符号8位。

接收、发送和RTC三者都搞清楚之后,我尝试了编程,可是发现单片机接收的东西叫做SBUF,且尚不清楚这个SBUF是什么东西。

百度得知,SBUF是两个寄存器,分别是发送寄存器和接收寄存器。
3.2.PNG
3.1.PNG
2.2.png
2.1.png
回复

使用道具 举报

6

主题

40

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2021-7-31 11:48:38 | 显示全部楼层
接下来我就修改了中断程序,使其可以输入两位数,并修改hour的值。先用一个judge函数来将输入的十六进制转化为十进制,避免串口监视器输入输出时的错误。由于串口是一位一位输入的,比如说我输入“12”,他其实是先输入了“1”,后输入了“2”,一共中断了两次。所以就做一个计数器就可以保证输入的是一个两位数了。



程序编写完毕,运行测试。打开串口监视器,传输12进去,发现的确可以把时间修改为12,但是在后续的输入时,要输入3遍才可以把数码管改成相应的数值。
4.1.PNG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|好好搭搭在线 ( © 好好搭搭在线 浙ICP备19030393号-1 )

GMT+8, 2021-9-27 00:09 , Processed in 0.282644 second(s), 25 queries .

Powered by Discuz!

© 2001-2021 Comsenz Inc.

快速回复 返回顶部 返回列表