问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32应用详解:测速模块、寻迹模块、数码管显示与TFT显示屏

创作时间:
作者:
@小白创作中心

STM32应用详解:测速模块、寻迹模块、数码管显示与TFT显示屏

引用
CSDN
1.
https://blog.csdn.net/weixin_45751396/article/details/119417660

本文详细介绍了STM32开发板常用的四个外设模块:测速模块、寻迹模块、数码管显示和TFT显示屏。文章内容包括每个模块的实物图、接线方式、功能原理以及代码示例,适合有一定嵌入式开发基础的读者学习参考。

1. Zave测速模块红外槽型光耦对射光电传感器码盘计数器

1.1 实物图和接线

接线如下:

光耦对射光电传感器
单片机
VCC
3.3-5V
GND
GND
D0
开关信号输出
A0(一般不接)
模拟信号输出

1.2 模块特色

1.3 使用说明

所谓测电机转速,是对不含编码器的电机的老式测速方法。

2. TCRT5000红外反射光电开关

2.1 实物图和接线

接线如下:

循迹传感器
单片机
VCC
3.3-5V
GND
GND
D0
开关信号输出
A0(一般不接)
模拟信号输出

输出形式:数字开关量输出(0 和 1)

检测反射距离:1mm~25mm 适用

2.2 功能介绍

TCRT5000 传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。

在检测反射距离内,若检测面为黑色,指示灯灭,输出高电平。

在检测反射距离内,若检测面为白色,指示灯亮,输出低电平。

2.3 工程配置和代码编写

开关式传感器,我们就不需要采用ADC采样,直接将PA1口作为输入。将PA1口的高低电平作为判定逻辑的条件即可。

uint16_t RAY;
RAY = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1);//检测PA1口电平
if(RAY == 1)//若为高电平则点亮LED1,即检测到黑色,点亮led
{
    HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);
}
else
{
    HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
}
HAL_Delay(8);

3.MAX7219数码管显示

3.1 实物图和接线

连线如下:

数码管
单片机
VCC
5V
GND
GND
DIN
P00
CS
P01
CLK
P02

3.2 原理简介

MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路、段字驱动器,而且还有一个8* 8的静态RAM 用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。

只需要3个I0口即可驱动8位数码管,数码管显示时无闪烁,支持级联!

电路图:

接线说明:(以提供的程序为例,可以接任意I0口,在程序中修改端口定义即可) :

3.2 部分代码

#include "sgt.h"
const int32_t pow10[]={0,10,100,1000,10000,100000,1000000,10000000};
const int8_t font[]="-EHLP ";
#define PIN_DIN(state) HAL_GPIO_WritePin(GPIOF, GPIO_PIN_13, (GPIO_PinState)state)
#define PIN_CS(state) HAL_GPIO_WritePin(GPIOF, GPIO_PIN_12, (GPIO_PinState)state)
#define PIN_CLK(state) HAL_GPIO_WritePin(GPIOF, GPIO_PIN_14, (GPIO_PinState)state)
void Write_Max7219_byte(uint8_t DATA);
void Write_Max7219(uint8_t address,uint8_t dat);
void Segments_WriteSingle(uint8_t pos,int8_t ch,bool point);
/********************************************/
//功能:向MAX7219写入字节
//入口参数:DATA 
//出口参数:无
void Write_Max7219_byte(uint8_t DATA)         
{   
    PIN_CS(0);	//CS
    for(uint8_t i=0;i<8;i++)
    {		  
        PIN_CLK(0);//CLK
        uint8_t DIN=(DATA&0x80)>>7;
        PIN_DIN(DIN);//DIN
        DATA=DATA<<1;
        PIN_CLK(1);//CLK
    }                                 
}
/********************************************/
//功能:向MAX7219写入数据
//入口参数:address、dat
//出口参数:无
void Write_Max7219(uint8_t address,uint8_t dat)
{ 
    PIN_CS(0);//CS
    Write_Max7219_byte(address);           //写入地址,即数码管编号
    Write_Max7219_byte(dat);               //写入数据,即数码管显示数字 
    PIN_CS(1);	//CS                        
}
void Segments_Init(void)
{
    Write_Max7219(0x09, 0xff);       //译码方式:BCD码
    Write_Max7219(0x0a, 0x03);       //亮度
    Write_Max7219(0x0b, 0x07);       //扫描界限;8个数码管显示
    Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1
    Write_Max7219(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
}
void Segments_WriteSingle(uint8_t pos,int8_t ch,bool point)
{
    if(ch>10)
    {
        for(uint8_t i=0;i<6;i++)
            if(ch==font[i])
            {
                ch=10+i;
                break;
            }
    }
    if(point)
        ch|=0x80;
    Write_Max7219(pos+1,ch);
}
//清屏数码管
void Segments_ClearAll()
{
    for(uint8_t i=0;i<8;i++)
    {
        Write_Max7219(i+1,0x0f);
    }
}
//向数码管写入一个整数
void Segments_Write_Int(int32_t num)
{
    if(num<-9999999||num>99999999)
        return;
    Segments_ClearAll();
    bool isNgt=num<0;
    uint8_t i=0;
    if(num<0)
        num=-num;
    do
    {
        Segments_WriteSingle(i,num%10,false);
        num/=10;
        i++;
    }while(num!=0);
    if(isNgt)
        Segments_WriteSingle(i,'-',false);
}
//向数码管写入一个浮点数
void Segments_Write_Float(float fnum,uint8_t decimals)
{
    Segments_ClearAll();
    int32_t num=fnum*pow10[decimals];
    bool isNgt=num<0;
    uint8_t i;
    if(num<0)
        num=-num;
    else if(num==0)
        Segments_WriteSingle(0,0,false);
    for(i=0;num!=0||i<decimals+1;i++)
    {
        bool point=false;
        if(i==decimals)
            point=true;
        Segments_WriteSingle(i,num%10,point);
        num/=10;
    }
    if(isNgt)
        Segments_WriteSingle(i,'-',false);
}

4.TFT SPI串口显示显示屏 2.8寸可触摸

4.1 实物图和接线

使用硬件SPI驱动TFT-LCD

不触摸的接线方式:

TFT
STM32
VCC
5V
GND
GND
RESET
LCD_RST
DC/RS
LCD_RS
SDI(MOSI)
SPI1_ MOSI
SCK
SPI1_ SCK
LED
5V/3.3V

4.2 参数特性

1、产品类型:TFT
2、产品尺寸:2.8寸
3、驱动芯片:ILI9341
4、分辨率: 320*240
5、工作温度:-20°C60°C
6、VCC电源电压:3.3V
5V
7、接口类型:4线SPI接口
8、触摸类型:可选配电阻触摸

分辨率在驱动函数中是长度和宽度的限制。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号