初级会员
- 积分
- 131
- 金钱
- 131
- 注册时间
- 2016-3-16
- 在线时间
- 33 小时
|
#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); //测试显示图片
*/
}
}
|
|