1602显示超声波所测的距离,stm32f4的代码

1602显示超声波所测的距离,stm32f4的代码,第1张

功能:1602显示超声波模块所测得的值,当距离小于5cm时led红灯亮起,当距离大于5cm时led绿灯亮起

注释会显示乱码,复制在kill5里应该是可以正常显示的,下面是代码的链接

https://download.csdn.net/download/D180230/85162680​​​​​​​

///

主函数的代码

#include "stm32f4xx.h"
#include "delay.h"
#include "lcd.h"
#include "sr04.h"
#include "led.h"
u16 dio;

int main(void)
{
    char dio_value[6];//用于显示所测的距离
    int value=0;//接收超声波模块所得的数据
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级
    delay_init(168);//
    LCD_init();//1602初始化
    ultrasonicGPIO_init();//超声波模块gpio初始化
    ultrasonic_init();//超声波初始化
    TIM3_init(10-1,84-1);//设置定时器时间
    LCD_ShowString(1,1,"Nixie");//
    LCD_ShowString(2,1,"Distance:");//
    LCD_ShowString(2,15,"cm");//
    LED_init();//LED灯初始化
    while(1)
    {
        value=ultrasonic_measure()*100;
        dio_value[0]=value/1000+0x30;
        dio_value[1]=value%1000/100+0x30;
        dio_value[2]=value%1000%100/10+0x30;
        dio_value[3]='.';
        dio_value[4]=value%1000%100%10%10+0x30;
        dio_value[5]='\0';
        LCD_ShowString(2,10,dio_value);
        if(value<50)
        {
            LED1=1;
            LED2=0;//
            LCD_ShowString(1,8,"err");
        }
        else if(value>50)
        {
            LED1=0;
            LED2=1;
            LCD_ShowString(1,8,"ok ");
        }
    }
}

///

1602的头文件

#ifndef __lcd_h_
#define __lcd_h_
#include "sys.h"

#define LCD_RS     PEout(0)
#define LCD_RW    PEout(1)
#define LCD_E        PEout(2)


//ÆäËûº¯ÊýÉùÃ÷
void lcddata_init(void);//³õʼ»¯D0µ½D7Êý¾Ý´«Êä¶ËµÄ½Ó¿Ú
void lcdcaoz_init(void);//³õʼ»¯lcdÖ¸Áî¶Ë¿Ú
void lcdyj_init(void);//led1602Ó²¼þ³õʼ»¯
void LCD_DataPort(unsigned char data);//stm32f4ÏòLCD·¢ËÍÊý¾Ý
void LCD_WriteCommand(unsigned char Command);//дָÁî
void LCD_WriteData(unsigned char Data);//дÊý¾Ý
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);//ÉèÖùâ±êλÖÃ
int LCD_Pow(int X,int Y);

//Óû§µ÷ÓÃÇø
void LCD_init(void);//³õʼ»¯
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);//LCD1602ÏÔʾ×Ö·û
void LCD_ShowString(unsigned char Line,unsigned char Column,char String[]);//LCD1602ÏÔʾ×Ö·û´®
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char len);//LCD1602ÏÔʾÊý×Ö(ÎÞ·ûºÅ)
void LCD_ShowsugnedNum(unsigned char Line,unsigned char Column,int Num,unsigned char len);LCD1602ÏÔʾÊý×Ö(ÓзûºÅ)
#endif

///

1602的主函数

#include "lcd.h"
#include "stm32f4xx.h"
#include "delay.h"

/*****************************************************************************************
*²ÎÊý£ºÎÞ
*¹¦ÄÜ£º³õʼ»¯lcd1602µÄD0µ½D7µÄ´«Êä½Ó¿Ú
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void lcddata_init(void)//³õʼ»¯Êý¾Ý´«ÊäµÄ¶Ë¿Ú¶ÔÓ¦µÄÒý½Å
{
    GPIO_InitTypeDef lcdinit;//½á¹¹Ìå±äÁ¿£¬³õʼlcd¶ÔÓ¦µÄÒý½Å
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
    
    lcdinit.GPIO_Mode=GPIO_Mode_OUT;
    lcdinit.GPIO_OType=GPIO_OType_PP;
    lcdinit.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    lcdinit.GPIO_PuPd=GPIO_PuPd_UP;
    lcdinit.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOF,&lcdinit);
}


/*****************************************************************************************
*²ÎÊý£ºÎÞ
*¹¦ÄÜ£º³õʼ»¯lcdÖ¸Áî¶Ë¿Ú¶ÔÓ¦µÄÒý½Å
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void lcdcaoz_init(void)//³õʼ»¬¿ØÖÆÖ¸ÁîµÄ¶ÔÓ¦Òý½Å
{
    GPIO_InitTypeDef lcdcaozinit;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
    
    lcdcaozinit.GPIO_Mode=GPIO_Mode_OUT;
    lcdcaozinit.GPIO_OType=GPIO_OType_PP;
    lcdcaozinit.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
    lcdcaozinit.GPIO_PuPd=GPIO_PuPd_UP;
    lcdcaozinit.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOE,&lcdcaozinit);
}


/*****************************************************************************************
*²ÎÊý£ºÎÞ
*¹¦ÄÜ£ºlcd1602Ó²¼þ³õʼ»¯
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void lcdyj_init(void)//lcdÓ²¼þ³õʼ»¯
{
    lcdcaoz_init();
    lcddata_init();
}


/*****************************************************************************************
*²ÎÊý£ºËùÒª·¢Ë͵ÄÊý¾Ý
*¹¦ÄÜ£ºstm32f4ÏòLCD·¢ËÍÊý¾Ý
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_DataPort(unsigned char data)
{
    GPIO_Write(GPIOF,data);
}


/*****************************************************************************************
*²ÎÊý£ºËùҪдµÄÖ¸Áî
*¹¦ÄÜ£ºstm32ÏòLCDдָÁî
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_WriteCommand(unsigned char Command)//дָÁî
{
    LCD_RS=0;
    delay_ms(1);
    LCD_RW=0;
    delay_ms(1);
    LCD_E=1;
    delay_ms(1);
    LCD_DataPort(Command);
    delay_ms(1);
    LCD_E=0;
}


/*****************************************************************************************
*²ÎÊý£ºËùҪдµÄÊý¾Ý
*¹¦ÄÜ£ºstm32ÏòLCDдÊý¾Ý
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_WriteData(unsigned char Data)//дÊý¾Ý
{
    LCD_RS=1;
    delay_ms(1);
    LCD_RW=0;
    delay_ms(1);
    LCD_E=1;
    delay_ms(1);
    LCD_DataPort(Data);
    delay_ms(1);
    LCD_E=0;
}    


/*****************************************************************************************
*²ÎÊý£ºÎÞ
*¹¦ÄÜ£ºLCD³õʼ»¯
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_init(void)
{
    lcdyj_init();
    LCD_WriteCommand(0x38);
    LCD_WriteCommand(0x0c);
    LCD_WriteCommand(0x06);
    LCD_WriteCommand(0x01);
}


/*****************************************************************************************
*²ÎÊý£ºµÚÒ»¸öΪÐУ¬µÚ¶þ¸öΪÁÐ
*¹¦ÄÜ£ºÉèÖÃLCD¹â±êλÖÃ
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
    if(Line==1)
    {
        LCD_WriteCommand(0x80|(Column-1));
    }
    else if(Line==2)
    {
        LCD_WriteCommand(0x80|((Column-1)+0x40));
    }
}


/*****************************************************************************************
*²ÎÊý£ºµÚÒ»¸öΪÐУ¬µÚ¶þ¸öΪÁУ¬µÚÈý¸öΪÏëÒªÏÔʾµÄ×Ö·û
*¹¦ÄÜ£ºLCD1602ÏÔʾһ¸ö×Ö·û
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
     LCD_SetCursor(Line,Column);
    LCD_WriteData(Char);
}


/*****************************************************************************************
*²ÎÊý£ºµÚÒ»¸öΪÐУ¬µÚ¶þ¸öΪÁУ¬µÚÈý¸öΪÏëÒªÏÔʾµÄ×Ö·û´®
*¹¦ÄÜ£ºLCD1602ÏÔʾ×Ö·û´®
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_ShowString(unsigned char Line,unsigned char Column,char String[])
{
    unsigned char i;
    LCD_SetCursor(Line,Column);
    for(i=0;String[i]!=0;i++)
    {
        LCD_WriteData(String[i]);
    }
}

int LCD_Pow(int X,int Y)
{
    unsigned char i;
    int Result=1;
    for(i=0;i     {
        Result*=X;
    }
    return Result;
}


/*****************************************************************************************
*²ÎÊý£ºµÚÒ»¸öΪÐУ¬µÚ¶þ¸öΪÁУ¬µÚÈý¸öΪÏëÒªÏÔʾµÄÊý×Ö£¬µÚËĸöΪÊý×Ö³¤¶È
*¹¦ÄÜ£ºLCD1602ÏÔʾÊý×Ö
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char len)
{
    unsigned char i;
    LCD_SetCursor(Line,Column);
    for(i=len;i>0;i--)
    {
        LCD_WriteData('0'+Num/LCD_Pow(10,i-1)%10);
    }
}

/*****************************************************************************************
*²ÎÊý£ºµÚÒ»¸öΪÐУ¬µÚ¶þ¸öΪÁУ¬µÚÈý¸öΪÏëÒªÏÔʾµÄÊý×Ö£¬µÚËĸöΪÊý×Ö³¤¶È
*¹¦ÄÜ£ºLCD1602ÏÔʾÊý×Ö
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void LCD_ShowsugnedNum(unsigned char Line,unsigned char Column,int Num,unsigned char len)
{
    unsigned char i;
    unsigned int Num1;
    LCD_SetCursor(Line,Column);
    if(Num>=0)
    {
        LCD_WriteData('+');
        Num1=Num;
    }
    else
    {
        LCD_WriteData('-');
        Num1=-Num;
    }
    for(i=len;i>0;i--)
    {
        LCD_WriteData('0'+Num1/LCD_Pow(10,i-1)%10);
    }
}
///

超声波模块的头文件

#ifndef __sr04_h
#define __sr04_h
#include "sys.h"


#define TRIGout      PBout(0)
#define ECHOout    PBout(1)
#define TRIG      GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)
#define ECHO    GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
//ÆäËûº¯Êý
void TIM3_init(u16 arr,u16 psc);//¶¨Ê±Æ÷³õʼ»¯
void ultrasonicGPIO_init(void);//³¬Éù²¨Ä£¿é¶ÔÓ¦µÄÒý½Å³õʼ»¯

//Óû§µ÷ÓÃ
void ultrasonic_init(void);//³¬Éù²¨Ä£¿é³õʼ»¯
float ultrasonic_measure(void);//³¬Éù²¨²â¾à
#endif

///

超声波模块的主函数

#include "sr04.h"
#include "stm32f4xx.h"
#include "delay.h"
#include "lcd.h"
extern u16 dio;
/*****************************************************************************************
*²ÎÊý£ºµÚÒ»¸öΪÖØ×°ÔØÖµ£¬µÚ¶þ¸öΪԤ·ÖÆÁϵÊý
*¹¦ÄÜ£º¿ªÆô¶¨Ê±Æ÷3£¬²¢ÇÒ¿ªÆôÖжÏ
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void TIM3_init(u16 arr,u16 psc)//³õʼ»¯¶¨Ê±Æ÷3£¬¿ªÆôÖжÏ
{
    TIM_TimeBaseInitTypeDef Tim_init;//1
    NVIC_InitTypeDef Nvic_init;//2
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//3
    Tim_init.TIM_Period=arr;//4
    Tim_init.TIM_Prescaler=psc;//5
    Tim_init.TIM_CounterMode=TIM_CounterMode_Up;//6
    Tim_init.TIM_ClockDivision=TIM_CKD_DIV1;//7
    
    TIM_TimeBaseInit(TIM3,&Tim_init);//8
    
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//¿ªÆô¶¨Ê±Æ÷3µÄ¸üÐÂÖжϲ¢Ê¹ÄÜ//9
    
    Nvic_init.NVIC_IRQChannel=TIM3_IRQn;//10
    Nvic_init.NVIC_IRQChannelPreemptionPriority=0x01;//11
    Nvic_init.NVIC_IRQChannelSubPriority=0x03;//12
    Nvic_init.NVIC_IRQChannelCmd=ENABLE;//13
    NVIC_Init(&Nvic_init);//14
}

/*****************************************************************************************
*²ÎÊý£ºÎÞ
*¹¦ÄÜ£º³õʼ»¯³¬Éù²¨Ä£¿éµÄ¶ÔÓ¦µÄÒý½Å
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void ultrasonicGPIO_init(void)
{
    GPIO_InitTypeDef ultrasonicinit;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    
    ultrasonicinit.GPIO_Mode=GPIO_Mode_OUT;
    ultrasonicinit.GPIO_OType=GPIO_OType_PP;
    ultrasonicinit.GPIO_Pin=GPIO_Pin_0;
    ultrasonicinit.GPIO_PuPd=GPIO_PuPd_UP;
    ultrasonicinit.GPIO_Speed=GPIO_Speed_50MHz;
    
    GPIO_Init(GPIOB,&ultrasonicinit);
    
    ultrasonicinit.GPIO_Mode=GPIO_Mode_IN;
    ultrasonicinit.GPIO_OType=GPIO_OType_PP;
    ultrasonicinit.GPIO_Pin=GPIO_Pin_1;
    ultrasonicinit.GPIO_PuPd=GPIO_PuPd_DOWN;
    ultrasonicinit.GPIO_Speed=GPIO_Speed_50MHz;
    
    GPIO_Init(GPIOB,&ultrasonicinit);
}

/*****************************************************************************************
*²ÎÊý£ºÎÞ
*¹¦ÄÜ£º³õʼ»¯³¬Éù²¨Ä£¿é
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void ultrasonic_init(void)
{
    TRIGout=0;
    ECHOout=0;
}

/*****************************************************************************************
*²ÎÊý£ºÎÞ
*¹¦ÄÜ£º¿ØÖƳ¬Éù²¨Ä£¿é£¬½«µÃÀ´µÄÖµÅÅÐò²¢ÇÒÈ¡³öƽ¾ùÖµ
*·µ»Ø£ºËù²âµÃµÄÖµ
*******************************************************************************************/
float ultrasonic_measure(void)
{
    u16 temp_buf[10];
    u16 temp;
    u16 temp_sum=0;
    u8 i=0,j=0;
    float ftemp;
    TIM_Cmd(TIM3,DISABLE);
    for(i=0;i<10;i++)
    {
        TRIGout=1;
        delay_ms(1);
        TRIGout=0;
        while(ECHO==0);
        dio=0;
        TIM_Cmd(TIM3,ENABLE);
        while(ECHO==1);
        TIM_Cmd(TIM3,DISABLE);
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
        temp_buf[i]=dio;
        delay_ms(80);
    }
    for(i=0;i<9;i++)
    {
        for(j=i+1;j<10;j++)
        {
            if(temp_buf[i]>temp_buf[j])
            {
                temp=temp_buf[i];
                temp_buf[i]=temp_buf[j];
                temp_buf[j]=temp;
            }
        }
    }
    for(i=2;i<8;i++)
    {
        temp_sum+=temp_buf[i];
    }
    
    ftemp=(float)temp_sum/6;
    return (float)(ftemp*0.00034/2)*100;
}


/*****************************************************************************************
*²ÎÊý£ºÎÞ
*¹¦ÄÜ£º¶¨Ê±Æ÷3µÄÖжϣ¬Òç³öʱdio++
*·µ»Ø£ºÎÞ
*******************************************************************************************/
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
    {
        dio++;
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
//

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/674858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存