#include "UltrasonicWave.h"
#include "usart.h"
#include "timer.h"
#include "delay.h"
#define TRIG_PORT GPIOC //TRIG
#define ECHO_PORT GPIOC //ECHO
#define TRIG_PIN GPIO_Pin_0 //TRIG
#define ECHO_PIN GPIO_Pin_1 //ECHO
int UltrasonicWave_Distance[6]; //计算出的距离
extern int times;
void UltrasonicWave_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = TRIG_PIN; //PC0接TRIG
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设为推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure); //初始化外设GPIO0
GPIO_InitStructure.GPIO_Pin = ECHO_PIN; //PC7接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
GPIO_Init(ECHO_PORT,&GPIO_InitStructure); //初始化GPIOC
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化外设GPIO2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PC7接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化GPIOC
GPIO_Init(TRIG_PORT, &GPIO_InitStructure); //初始化外设GPIO3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PC7接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
GPIO_Init(ECHO_PORT,&GPIO_InitStructure); //初始化GPIOC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PC7接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PC7接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOC
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PC7接ECH0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设为输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOC
}
struct Disdata
{
int u1;
int u2;
int u3;
};
union Dissend
{
u8 dbuf[12];
struct Disdata data;
};
uint16_t pins[6] = {GPIO_Pin_1,GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_5,GPIO_Pin_6};
void Distance1(void)
{
int i;
union Dissend disend;
disend.data.u1 = UltrasonicWave_Distance[0]*10000+UltrasonicWave_Distance[1];
disend.data.u2 = UltrasonicWave_Distance[2]*10000+UltrasonicWave_Distance[3];
disend.data.u3 = UltrasonicWave_Distance[4]*10000+UltrasonicWave_Distance[5];
USART_SendData(USART1,0xf2);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
for(i=0; i<12; i++)
{
USART_SendData(USART1,disend.dbuf[i]);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_SendData(USART1,0xef);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
for(i=0; i<6; i++){
UltrasonicWave_Distance[i] = 0;
}
int time_start[6] = {0};
GPIO_SetBits(TRIG_PORT,TRIG_PIN); //?>10US?????RIG_PORT,TRIG_PIN????define???
delay_us(20); //??20US
GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
TIM_SetCounter(TIM2,0);
TIM_Cmd(TIM2, ENABLE);
while(1){
int i = 0;
for(i=0; i<3; i++){
if(time_start[i] == 0){
if(GPIO_ReadInputDataBit(ECHO_PORT,pins[i])){
time_start[i] = 1;
time_start[i] = TIM_GetCounter(TIM2);
}
}
if(time_start[i] != 0 && UltrasonicWave_Distance[i]==0){
if(!GPIO_ReadInputDataBit(ECHO_PORT,pins[i])){
UltrasonicWave_Distance[i] = (TIM_GetCounter(TIM2) - time_start[i])*17/1.0;
}
}
}
for(i=3; i<6; i++){
if(time_start[i] == 0){
if(GPIO_ReadInputDataBit(GPIOA,pins[i])){
time_start[i] = 1;
time_start[i] = TIM_GetCounter(TIM2);
}
}
if(time_start[i] != 0 && UltrasonicWave_Distance[i]==0){
if(!GPIO_ReadInputDataBit(GPIOA,pins[i])){
UltrasonicWave_Distance[i] = (TIM_GetCounter(TIM2) - time_start[i])*17/1.0;
}
}
}
int done = 1;
for(i=0; i<6; i++){
done &= UltrasonicWave_Distance[i];
}
if(done || (TIM_GetCounter(TIM2) > 200)){
break;
}
}
TIM_Cmd(TIM2, DISABLE);
}
/*int get_time(){
times*500 + TIM_GetCounter(TIM2)*500/5000;
}
*/