STM8S003F使用IO口模拟串口(二)接收数据

发布者:幸福家庭最新更新时间:2020-01-21 来源: eefocus关键字:STM8S003F  IO口  模拟串口  接收数据 手机看文章 扫描二维码
随时随地手机看文章

在上一篇文章中我们介绍了IO口模拟串口数据的发送,这一篇文章我们介绍IO口模拟串口数据的发送。同样的,我们没有使用库函数和中断,我们使用简单的定时来完成数据的接收。


1、IO口模拟串口接收数据的原理

同样的,我们将要接收的数据认为是10位(实际上,我们在接收数据之前必须搞清楚我们将要接收的是什么,否则我们需要在模拟串口程序中添加其他代码来进行检测)。


同样的,我们事先知道发送数据的波特率为:9600。


我选择的是STM8S003F的PD3引脚作为模拟串口的接收引脚。


思路是这样的,我们使用定时器定时,通过判断是否是起始位(通过低电平判断,因为没有发送数据应该是高电平),得到起始位了以后,延时一个数据位发送的时间(我们将定时器的时间设置为一个数据位的发送时间),然后逐次判断数据位的电位,8次延时以后,在通过最后一次延时,以此来接收完了一个字节。


用这种方法的优点是逻辑简单,能够清晰的认识到串口发送数据的过程,但是,由于我们检验数据是否正确用到的是我们上一篇文章中用到的发送数据的方法,因此在发送字符串的时候我们发现它将只能接收到奇数的字节,只能在接收单字节数据的时候能正常工作,也就是大部分情况无法使用。如果需要它是一个正常代码中能用的全双工模拟串口,需要使用到中断,我【待修改】将在后面进行介绍。


注意:这篇文章实现的IO口模拟串口接收数据,只能实现单个字节的接收!


2、实现过程

2.1、一切从main()函数开始

同样的,我们建立完工程后需要从main()函数开始,我们首先需要进行初始化的配置All_Config()【在UserApp.c中】,代码如下:


//head file 

#include "UserApp.h"

#include "IO.h"

#include "User.h"

#include "Time.h"

#include "Delay.h"

 

//初始化函数

void All_Config( void )

{

    Clock_Config();

    IO_Init();  

    TIM2_Init();

}


其中Clock_Config()【在UserApp.c中】为单片机时钟配置函数,代码如下:

//初始化时钟 选择内部16M晶振

void Clock_Config()

{

    CLK->CKDIVR &= ~( BIT(4) | BIT(3) );

}


其中我们选择的内部16M晶振,单片机默认的也是16M晶振但是会有8分频,我们这里设置的是没有分频。


其中IO_Init()【在IO.c中】是对IO口的初始化,由于我们需要验证接收的正确性,我们需要将接收到的数据发送到电脑串口程序,我们可以使用单片机自己的串口发送口,由于我能保证我自己上一篇文章的正确性,因此我直接在上一篇文章的基础上进行开发。也就是我需要初始化PD2和PD3,代码如下:


//head file

#include "IO.h"

#include "User.h"

 

void IO_Init()

{

    //TXD:TXD位推挽输出  PD2

    UART_PORT->ODR |=  UART_PIN_TX; //0000 0100

    UART_PORT->DDR |=  UART_PIN_TX; //0000 0100

    UART_PORT->CR1 |=  UART_PIN_TX; //0000 0100

    UART_PORT->CR2 &= ~UART_PIN_TX; //0000 0100

    

    //RXD:悬浮输入 高电平 PD3

    UART_PORT->IDR |=  UART_PIN_RX; //0000 1000

    UART_PORT->DDR &= ~UART_PIN_RX; //0000 1000

    UART_PORT->CR1 &= ~UART_PIN_RX; //0000 1000

    UART_PORT->CR2 &= ~UART_PIN_RX; //0000 1000

}


其中TIM2_Init()【在Time.c中】是定时器的初始化,


关键字:STM8S003F  IO口  模拟串口  接收数据 引用地址:STM8S003F使用IO口模拟串口(二)接收数据

上一篇:【嵌入式开发】STM8S103F3P6单线半双工串口通信
下一篇:stm8s103串口

推荐阅读最新更新时间:2024-11-16 21:24

MSP430f5529定时器模拟串口
写这篇文章的目的 本人记性贼差,写过的代码总是忘,每次从头看数据手册,因此借CSDN平台,帮助自己第二次甚至第三次写同一个东西的时候能够有所回忆。 打代码之前的思考 了解串口 串口通信需要三根线,RX, TX, GND 串口数据格式,一个开始位+一字节数据+一个结束位 波特率:一种用于衡量每秒钟UART传输位数的单位 程序思路 发送端 假设波特率为9600,也就是每秒钟需要传输9600位的数据,那么每传输一位就需要1/9600s,因此,在发送端我们只需要在发送数据时打开定时器,定时时间为1/9600,每进一次中断把端口设置成要发送的位数据。 接收端 接收端的实现需要依靠定时器的捕获功能,当捕获到端口
[单片机]
MSP430f5529定时器<font color='red'>模拟</font><font color='red'>串口</font>
模拟串口自动测量波特率的单片机程序
我这个程序能够测量串口的波特率,并且将自身的波特率设置到通讯波特率。 这个在STC89C52/STC15F104(其实主要针对STC15F104,因为它没有串口)上面通过。不过因为是模拟串口,在11.0592 12T的情况下,最多到19200。 然后在STC15F104上面,要适量的减少补偿值…… 顺便说一句,编译器建议使用sdcc。keil的SB printf函数搞死我了……在22.1184 6T的情况下大约能到57600. 当然在STC15F系列到115200毫无压力,可是是半双工的。要做全双工只能减倍波特率…… 测量波特率的方法很简单。校准他的波特率的方法就是发送没有连续低电平的字符,类似0x55/0xff/0x7f之类的。
[单片机]
一种STM32使用串口DMA接收不定长数据的方法
1.UART初始化函数 void uart_init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure; //GPIO端口设置 USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟 GPIO_PinAFConfi
[单片机]
STM32 IO口的八种方式的解释
1、上拉输入:上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!弱强只是上拉电阻的阻值不同,没有什么严格区分。 2、下拉输入:就是把电压拉低,拉到GND。与上拉原理相似。 3、浮空输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。 4、模拟输入:模拟输入是指传统方式的输入.数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的
[单片机]
MSP430单片机控制IO口操作-LED灯闪烁
//******************************************************************************* // D13x Demo - 在上一节基础上改变系统时钟,观察LED灯的闪烁频率 // // 描述:通过改变系统时钟,来改变闪烁频率;通过 P1 异或 来取反 P1.5;软件循环延时 // ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k // // MSP430F13x // ----------------- // /|\| XIN|- // | | | // --|RST XOUT|- // | | // | P1.5|-- L
[单片机]
STM32单片机释放PB3/PB4/PA15作为普通IO口
  一次使用STM32F103RCT6单片机用到多个IO口时发现:不管如何配置,PB3,PB4,PA15无法正常控制输出高低电平,而其他IO口正常。其IO口初始化操作如下: GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟 GPIO_Initure.Pin=GPIO_PIN_15; GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_In
[单片机]
再次发模拟串口,51自适应波特率
这个是在12T的8051上面用的模拟串口程序,配合22.1184M的晶振,加上6T的双倍速,波特率可以上38400 但是我认为和某些STC的芯片比,还是差了一点,所以说,看官门看注释吧。开启帧请发送没有连续低电平的字符,类似0 55,0xff,0x7f如此等等,如果有连续低电平很容易造成判断失误 这个程序可以用在STC的自动冷启动模块里(STC15F101系列就行,很便宜的,注意是八位装载模式顺便把T1X12关了~然后补偿可以顺便减小一点,顺便说一句,用AT89C51来做也行)。这个在24M/22.1184M/11.0592M均工作正常,11.0592能到9600,24能到38400。不过,我提个醒,如果看官们真拿这个做STC冷启的
[单片机]
【STM32Cube_08】使用USART发送和接收数据(DMA模式)
本篇文章主要介绍如何使用STM32CubeMX初始化STM32L431RCT6的USART,并使用DMA模式发送数据和接收数据。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码; 准备一个串口调试助手,这里我使用的是Serial Port Utility; 2.生成MDK工程 选择芯片型号 打开STM32CubeMX,打开MCU选择器: 搜索并选中芯片STM32L431RCT6: 配置时钟源 如果选择使用外部高速时钟(HSE),则需要在System
[单片机]
【STM32Cube_08】使用USART发送和<font color='red'>接收</font><font color='red'>数据</font>(DMA模式)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved