硬汉嵌入式论坛

 找回密码
 立即注册
查看: 329|回复: 1
收起左侧

[有问必答] STM32 超声波OLED显示不出来距离值 温度显示正常求教

[复制链接]

27

主题

25

回帖

106

积分

初级会员

积分
106
发表于 2023-7-29 16:42:12 | 显示全部楼层 |阅读模式
#include "wave.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"

#define Trig GPIO_Pin_15//超声发射引脚pA15
#define Echo GPIO_Pin_12//超声波接受引脚pA12

void Wave_SRD_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        EXTI_InitTypeDef EXTI_InitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;
        //初始化超声波
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
      
        GPIO_InitStruct.GPIO_Pin=Trig;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
      
        GPIO_InitStruct.GPIO_Pin=Echo;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
        //外部中断与引脚的配置,中断与端口12的映射
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource12);
        //外部中断配置
        EXTI_InitStruct.EXTI_Line=EXTI_Line12;
        EXTI_InitStruct.EXTI_LineCmd= ENABLE;
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);
        //中断优先级管理
        NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitStruct);
      
      
}
//外部中断服务函数
void EXTI15_10_IRQHandler(void)
{
        printf("2");
        delay_us(10);
        if(EXTI_GetITStatus(EXTI_Line12)!=RESET)//Echo检测到高电平
        {
                TIM_SetCounter(TIM3,0);//开启定时器
                TIM_Cmd(TIM3,ENABLE);//使能定时器
                while(GPIO_ReadInputDataBit(GPIOA,Echo));//等待Echo出现低电平
                printf("3");                 
                TIM_Cmd(TIM3,DISABLE);//关闭定时器
               
        EXTI_ClearITPendingBit(EXTI_Line12);//清除中断标志
  }
}
//超声波工作条件
//Trig产生一个不低于10us的高电平信号

u8 Wave_SRD_Strat(u8 time)
{
        if(time>10)
        {
        GPIO_SetBits(GPIOA,Trig);//设置Trig为高电平输出
        delay_us(time);
        GPIO_ResetBits(GPIOA,Trig);
        return 0;//产生高于10us高电平,返回0
        }
        else return 1;//为产生高于10us高电平返回1
}

主程序
#include "sys.h"  
#include "delay.h"
#include "oled_iic.h"
#include "stdio.h"
#include "wave.h"
#include "timer.h"
#include "usart.h"         
#include "ds18b20.h"

int main(void)
{               
        u8 a=0;      
        u8 t=20;//trig引脚高电平持续时间
        short temperature;                                             
        u8 Distance;
      
        uart_init(115200);//串口初始化
        Wave_SRD_Init();//初始化超声波
        Timer_SRD_Init(9998,7199);//定时器初始化      

        extern const u8 BMP1[];
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        delay_init();
        OLED_Init();                         //OLED屏幕初始化               
        DS18B20_Init();                //DS18B20初始化      
      
        while(Wave_SRD_Strat(t))
        {
        }
      
        OLED_Clear();      
                printf("1");
        while(1)
        {               
                //18B20读取温度               
                if(a%10==0)                        //每100ms读取一次
                {                                                                          
                        temperature=DS18B20_Get_Temp();
                        if(temperature<0)
                        {
                                OLED_ShowCH(50,6,"-");                        //显示负号
                                temperature=-temperature;                        //转为正数
                        }else{
                                OLED_ShowCH(50,6," ");                        //去掉负号
                        }
                        OLED_ShowNum(60,6,temperature/10,2,16);                        //显示整数部分            
                           OLED_ShowNum(60+28,6,temperature%10,1,16);        //显示小数部分                  
                }                                 
                 delay_ms(10);
                a++;
                if(a==20)
                {
                        a=0;
                }

                OLED_ShowCH(15,0,"屏幕显示测试");                //测试显示中文

                OLED_ShowCH(0,3,"距离:");                //显示中文:距离
//                OLED_ShowCH(0,3,"Distance: ");        //显示英文
                OLED_ShowCH(100,3,"cm");                //测试显示中文

                OLED_ShowCH(0,6,"温度:");                //显示中文:温度
//                OLED_ShowCH(0,6,"Temp: ");                //显示英文
                OLED_ShowCH(78,6,".");                        //显示.                       
                OLED_ShowCH(101,6,"℃");                //显示:℃

                //产生高于10Us的高电平与OLED上显示超声波所测距离               
                Wave_SRD_Strat(t);
                Distance = TIM_GetCounter(TIM3)*340/200.0;//计算距离:cnt * 1/10000 * 340 / 2(单位:m
                if(Distance>0)
                {
                        OLED_ShowNum(50,3,Distance,6,16);                //显示超声波测量距离
                        delay_ms(10);
                }

/*               
                OLED_ShowCH(20,1,"屏幕显示测试");                //测试显示中文

                OLED_ShowNum(20,3,314159265,9,0);                //测试显示数字

                OLED_DrawBMP(0,0,128,8,(u8 *)BMP1);                //测试显示图片
*/
        }
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-7-29 21:10:27 | 显示全部楼层
帮顶。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 02:36 , Processed in 0.207625 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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