初出茅庐的小李博客之STCW15408AS单片机串口1使用记录

news2024/11/29 22:45:15

STCW15408AS单片机串口1使用记录

资源介绍:

STC15W401AS系列单片机是STC生产的单时钟/机器周期(1T)的单片机,是宽电压/高可靠/低功耗/超强抗干扰的新一代8051单片机,采用STC第九代加密技术,无法解密, 代码完全兼容传统8051,但速度快8-12倍。内部集成 R/C时钟(±0.3%),±1%温飘(-40℃+85℃),常温下温飘±0.6%(-20℃+65℃),ISP编程时5MHz~35MHz宽范围可设置,可彻底省掉外部昂贵的晶振和外部复位电路(内部已集成高可靠复位电路,ISP编程时16级复位门槛电压可选)。3路CCP/PWM/PCA,8路高速10位A/D转换(30万次/秒),1组超高速异步串行通信口( 可在3组管脚之间进行切换,分时复用可作3组串口使用),1组高速同步串行通信端口SPI,针对/电机控制/强干扰场合。内置比较器,功能更加强大。
在这里插入图片描述

芯片框图:

在这里插入图片描述

串口介绍:

STC15W408AS只有一个串口,串口1,有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。

401跟408的区别在于FLASH的大小401的大小是1K字节,408的大小是8K字节。
在这里插入图片描述

串口相关的寄存器:

在这里插入图片描述
STC15系列单片机的串行口1设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON

串口控制寄存器Serial Control (SCON)

串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能
在这里插入图片描述
解释其各位含义:

SM0/FE:当PCON寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。当检测到一个无效停止位时,通过UART接收器设置该位。它必须由软件清零。

当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作 方式,如下表所示,通常我们使用这种方式
在这里插入图片描述
翻译一下就是:

当PCON寄存器中的SMOD0/PCON.6位为0时,SCON的[bit7:bit6]=00 01 10 11 是四种工作方式,我们通常使用方式1使其工作在

方式1:

方式1是8位UART 波特率可以调节。

波特率可以有两种方式调节:

第一种计算公式的使用情况介绍:

  1. 串行口1用定时器1作为其波特率发生器

这种要求定时器1工作于模式 0(16位自动重装载模式)

2.串行口用定时器2作为其波特率发生器

这两种情况下波特率计算公司如下:

波特率=(定时器1的溢出率或定时器T2的溢出率) /4

需要注意的是:此时波特率与SMOD无关。

第二种计算公式的使用情况介绍:

  1. 串行口1用定时器1作为其波特率发生器

这种要求定时器1工作于模式 2(8位自动重装模式)时

波特率=( 2SMOD/32 )×(定时器1的溢出率)

需要注意的是:此时波特率与SMOD有关。

总结:波特率的计算公式在使用不同的定时器的不同模式时候计算方法是不一样的。

REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。

接收使能需要打开这个位

TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后TI必须用软件清零,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,即TI=1,响应中断后TI必须用软件清零

RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后RI必须用软件清零,即RI=0。**在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1,向CPU发中断申请,响应中断后RI必须由软件清零。串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以"或逻辑"关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判别,然后分别处理。**因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。

电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加倍。

电源控制寄存器Power Control (PCON)

由于刚才的计算公式中有这个位当作指数,**2的1次方就是加倍,2的0次方就是不加倍。**电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加倍。
在这里插入图片描述

串行口数据缓冲寄存器Serial Buffer(SBUF)

STC15系列单片机的串行口1缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF 的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。

两个操作分别对应两个不同的寄存器,1个是只写寄存器1个是只读寄存器。 串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号(MOV SBUF,A) 的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将 1” TB8的值装入移位寄存器的第9位,并进行发送. 串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为 9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入 SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变. 由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位 寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。

其实SBUF 就是接收跟发送数据的缓冲区。发送信息就是给它赋值接收信息就是从这里读取数据。

辅助寄存器AUXR

在这里插入图片描述

T0x12: 定时器0速度控制位

0, 定时器0是传统8051速度,12分频;
1, 定时器0的速度是传统8051的12倍,不分频

T1x12: 定时器1速度控制位

0, 定时器1是传统8051速度,12分频;
1, 定时器1的速度是传统8051的12倍,不分频

如果UART1/串口1用T1作为波特率发生器,则由T1x12决定UART1/串口是12T还是1T

UART_M0x6: 串口模式0的通信速度设置位

0, 串口1模式0的速度是传统8051单片机串口的速度,12分频;
1, 串口1模式0的速度是传统8051单片机串口速度的6倍,2分频

T2R: 定时器2允许控制位

0, 不允许定时器2运行;
1, 允许定时器2运行

T2_C/T: 控制定时器2用作定时器或计数器

0, 用作定时器(对内部系统时钟进行计数);
1, 用作计数器(对引脚T2/P3.1的外部脉冲进行计数)

T2x12: 定时器2速度控制位

0, 定时器2是传统8051速度,12分频;
1, 定时器2的速度是传统8051的12倍,不分频

如果串口1或串口2用T2作为波特率发生器,则由T2x12决定串口1或串口2是12T还是1T.

EXTRAM: 内部/外部RAM存取控制位

0, 允许使用逻辑上在片外、物理上在片内的扩展RAM;

1, 禁止使用逻辑上在片外、物理上在片内的扩展RAM

S1ST2: 串口1(UART1)选择定时器2作波特率发生器的控制位

0, 选择定时器1作为串口1(UART1)的波特率发生器;
1, 选择定时器2作为串口1(UART1)的波特率发生器,此时定时器1得到释放,可以作为独立定时器使用串口1可以选择定时器1做波特率发生器,也可以选择定时器2作为 波特率发生器当设置AUXR寄存器中的S1ST2位(串行口波特率选择位)为1时,串行口1选择定时器2作为波特率发生器,此时定时器1可以释放出来作为定时器/计数器/时钟输出使用。

对于STC15系列单片机,串口2只能使用定时器2作为其波特率发生器,不能够选择其他定时器作为波特率发生器。**而串口1默认选择定时器2作为其波特率发生器,也可以选择定时器1作为其波特率发生器;*串口3默认选择定时器2作为其波特率发生器,也可以选择定时器3作为其波特率发生器;串口4默认选择定时器2作为其波特率发生器,也可以选择定时器4作为其波特率发生器

这段话非常重要,对于STC15系列单片机来说不一样,总结一下就是尽量使用定时器2作为波特率发生器。这样就不容易出问题。

定时器2的寄存器T2H, T2L

定时器2寄存器T2H(地址为D6H,复位值为00H)及寄存器T2L(地址为D7H,复位值为00H)用 于保存重装时间常数。
在这里插入图片描述

与串行口1中断相关的寄存器位ES和PS

我们使用中断的时候这两个bit是要打开的,PS位决定其中断的优先级 PS = 0 优先级较低 PS =1 优先级较高
在这里插入图片描述

串口1一般编程思路

串口1设置其工作模式位方式1:8位UART,波特率可变

​ 当软件设置SCON的SM0、SM1为"01" 时,串口1则以模式1工作。此模式为8位UART格式,一帧信息为10位:1位起始位,8位数据位(低位在先)和1位停止位。波特率可变,即可根据需要进行设置。TxD/P3.1为发送信息,RxD/P3.0为接收端接收信息**,串行口为全双工接受/发送串行口**

  1. 模式1的发送过程:串行通信模式发送时,数据由串行发送端TxD输出。当主机执行一条写 SBUF" 的指令就启动串行通信的发送,写"SBUF"信号还把"1"装入发送移位寄存器的第9位,并通知TX控制单元开始发送。发送各位的定时是由16分频计数器同步。移位寄存器将数据不断右移送TxD端口发送,在数据的左边不断移入"0"作补充。当数据的最高位移到移位寄存器的输出位置,紧跟其后的是第9位 1" ,在它的左边各位全为"0" ,这个条件,使TX控制单元作最后一次移位输出,然后使允许发送信号 SEND"失效,完成一帧信息的发送,并置位中断请求位TI,即TI=1,向主机请求中断处理。

  2. 模式1的接收过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特率的16分频的速率采样串行接收端口RxD,当检测到RxD端口从 “1"→"0"的负跳变时就启动接收器准备接收数据,并立即复位16分频计数器,将1FFH植装入移位寄存器。复位16分频计数器是使它与输入位时间同步。16分频计数器的16个状态是将1波特率(每位接收时间)均为16等份,在每位时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样直经"三中取二” 即3次采样至少2次相同的值,以此消除干扰影响,提高可靠性。在起始位,如果接收到的值不为"0"(低电平),则起始位无效,复位接收电路,并重新检测 1"→0" 的起始位有效,则将它输入移位寄存器,并接收本帧的其余信息。接收的数据从接收移位寄存器的右边移入,已装入的1FFH向左边移出,当起始位 0" 移位寄存器的最左边时,使RX控制器作最后一次移位,完成一帧的接收。

    若同时满足以下两个条件:

  • ​ RI=0;
  • ​ SM2=0或接收到的停止位为1。

则接收到的数据有效,实现装载入SBUF,停止位进入RB8,置位RI,即RI=1,向主机请求中断,若上述两条件不能同时满足,则接收到的数据作废并丢失,无论条件满足与否,接收器重又检测RxD端口上的 “1"→"0"的跳变,继续下一帧的接收。接收有效,在响应中断后,必须由软件清0,即RI=0。通常情况下,串行通信工作于模式1时,SM2设置为"0”。

串口1测试程序

#include "uart.h"


#define BoudRate    9600               //串口波特率
 
 
void UART_Config(void)
{
	SCON =  0x50;                     //8位可变波特率 串口工作模式1
	T2L  = (65536 - (MAIN_FOSC/4/BoudRate));   //设置波特率重装值
	T2H  = (65536 - (MAIN_FOSC/4/BoudRate))>>8;
	AUXR =  0x14;                     //T2为1T模式, 并启动定时器2
	AUXR |= 0x01;                    //选择定时器2为串口1的波特率发生器
	ES = 1;                          //使能串口1中断
	EA = 1;
}

// UART 中断服务程序
void UART_Irq() interrupt 4
{	
	// 接收中断标志位
	if(RI)
	{
		RI = 0;                 //清除RI位
		UART_SendData(SBUF + 1);     // 把接收的数据+1 再发送出去
	}
	// 发送中断标志位
	if(TI)
	{
		TI = 0;                 //清除TI位
		UART_SendString("发送完成!\r\n");
	}
}
//串口发送串口数据
void UART_SendData(uint8_t Data)
{
  SBUF = Data;
	while(TI == 0);
	TI = 0;
}
//串口发送字符串
void UART_SendString(uint8_t *Str)
{
    while(*Str!='\0')                  //检测字符串结束标志
    {
        UART_SendData(*Str++);              //发送当前字符
    }
}

注意:以上内容仅是个人学习记录、如有错误还请指正,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1159719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node使用fs模块(四)—— 文件夹的使用(创建、读取、删除)

文章目录 前言一、文件的创建1.参数2.基本使用 二、文件的读取1.参数2.读取文件的基本使用3.读取文件的递归使用(option中添加recursive为true) 三、文件的删除1. 参数2. 基本使用(删除文件夹)3. 递归删除文件夹 前言 创建、读取…

学习时遇到的错误

1. pycharm中使用ssh远程连接的jupyter时,出现***端口已经被占用的情况 办法一:更换端口,将端口更换为其他 办法二:重启远程终端服务器 2. 关于wandb,在pycharm中调用了wandb.init()初始化函数,中途关闭…

MolFormer分子预训练模型

Large-scale chemical language representations capture molecular structure and properties(2022,NMI) 和原本transformer encoder的不同: 采用linear attention mechanismrotary positional embedding 模型 transformer e…

x3daudio17.dll丢失是什么原因?x3daudio1_7.dll怎么解决?(修复教程分享)

在我多年的电脑使用经历中,我曾经遇到过x3daudio1_7.dll缺失的问题。这个问题让我苦恼了很久,但最终我还是找到了4种有效的修复方法。今天,我想和大家分享一下这些方法,希望对你们有所帮助。 首先,我要讲述一下我遇到…

跟着Nature Communications学作图:纹理柱状图+添加显著性标签!

📋文章目录 复现图片设置工作路径和加载相关R包读取数据集数据可视化计算均值和标准差 计算均值和标准差方差分析组间t-test 图a可视化过程图b可视化过程合并图ab 跟着「Nature Communications」学作图,今天主要通过复刻NC文章中的一张主图来巩固先前分享…

基础课15——语音标注

语音数据标注是对语音数据进行处理和分析的过程,目的是让人工智能系统能够理解和识别语音中的信息。这个过程包括了对语音信号的预处理、特征提取、标注等步骤。 在语音数据标注中,标注员需要对语音数据进行分类、切分、转写等操作,让人工智…

C++ 多线程之OpenMP并行编程使用详解

C 多线程之OpenMP并行编程使用详解 总结OpenMP使用详解本文转载自:https://blog.csdn.net/AAAA202012/article/details/123665617?spm1001.2014.3001.5506 1.总览 OpenMP(Open Multi-Processing)是一种用于共享内存并行系统的多线程程序设计方案,支持…

软件测试之用例篇(万能公式、具体方法)

目录 1. 概念 2. 万能公式 3.具体设计测试用例的方法 (1)等价类 (2)边界值 (3)判定表(因果图) (4)场景设计法 (5)正交法 如何使用 allparis 生成正交…

绕开网站反爬虫原理及实战

1.摘要 在本文中,我首先对网站常用的反爬虫和反自动化技术做了一个梳理, 并对可能能够绕过这些反爬技术的开源库chromedp所使用的技术分拆做一个介绍, 最后利用chromedp库对一个测试网站做了爬虫测试, 并利用chromedp库绕开了爬虫限制,成功通过程序自动获取到信息。在测试过程…

基站/手机是怎么知道信道情况的?

在无线通信系统中,信道的情况对信号的发送起到至关重要的作用,基站和手机根据信道的情况选择合适的资源配置和发送方式进行通信,那么基站或者手机是怎么知道信道的情况呢? 我们先来看生活中的一个例子,从A地发货到B地…

小程序如何设置自动预约快递

小程序通过设置自动预约功能,可以实现自动将订单信息发送给快递公司,快递公司可以自动上门取件。下面具体介绍如何设置。 在小程序管理员后台->配送设置处,选择首选配送公司。为了能够支持自动预约快递,请选择正常的快递公司&…

vue3写nav滚动事件中悬停在顶部

1. 防抖类Animate, 使用requestAnimationFrame代替setTimeout 也可以使用节流函数, lodash有现成的防抖和节流方法 _.debounce防抖 _.throttle节流 export default class Animate {constructor() {this.timer null;}start (fn) > {if (!fn) {throw new Error(需要执行…

力扣:147. 对链表进行插入排序(Python3)

题目: 给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中&#xff0c…

解决在Win7下运行一些老游戏花屏或色彩异常问题的方法

有一些喜欢回顾经典老游戏的玩家们,在目前最新的windows7的操作系统下,运行某些游戏会出现花屏,问题的原因是因为win7对这些游戏的DirectDraw不兼容,一种方法是改游戏配置文件,把游戏色彩8bit改成16bit,当然…

安装pytorch报错torch.cuda.is_available()=false的解决方法

参考文章: https://blog.csdn.net/qq_46126258/article/details/112708781 https://blog.csdn.net/Andy_Luke/article/details/122503884 https://blog.csdn.net/anmin8888/article/details/127910084 https://blog.csdn.net/zcs2632008/article/details/127025294 …

为什么Facebook运营需使用IP代理?有哪些美国IP代理好用?

随着互联网的快速发展和全球用户规模的不断增长,Facebook已成为了全球最大的社交媒体平台之一。然而,大批量地运营Facebook账号往往需要借助IP代理这一工具,提高账号的安全性和可靠性,使得运营Facebook更加流畅。那么Facebook为什…

嵌入式到底如何理解呢?

今日话题,嵌入式到底如何理解呢?以我个人的理解,可以用一个客观的比喻来描述,就是将某个系统嵌入到特定的环境中,以实现特定的功能。这个过程包括将现实世界中的人、物的意图和逻辑关系,通过计算和运算的方…

【计算机网络】同源策略及跨域问题

1. 同源策略 同源策略是一套浏览器安全机制,当一个源的文档和脚本,与另一个源的资源进行通信时,同源策略就会对这个通信做出不同程度的限制。 同源策略对 同源资源 放行,对 异源资源 限制。因此限制造成的开发问题,称…

【Acwing170】加成序列(dfs+迭代加深+剪枝)题解和一点感想

本思路来自acwing算法提高课 题目描述 看本文需要准备的知识 1.dfs算法基本思想 2.对剪枝这个词有个简单的认识 迭代加深思想和此题分析 首先,什么是迭代加深呢?当一个问题的解有很大概率出现在递归树很浅的层,但是这个问题的解本身存在…

树结构及其算法-用数组来实现二叉树

目录 树结构及其算法-用数组来实现二叉树 C代码 树结构及其算法-用数组来实现二叉树 使用有序的一维数组来表示二叉树,首先可将此二叉树假想成一棵满二叉树,而且第层具有个节点,按序存放在一维数组中。首先来看看使用一维数组建立二叉树的…