功能:1602显示超声波模块所测得的值,当距离小于5cm时led红灯亮起,当距离大于5cm时led绿灯亮起
注释会显示乱码,复制在kill5里应该是可以正常显示的,下面是代码的链接
https://download.youkuaiyun.com/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<Y;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);
}
//