新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2018-7-20
- 在线时间
- 5 小时
|
2金钱
本帖最后由 panda哥 于 2018-7-20 08:37 编辑
这个是我用来做超声波测距的程序
#include "timer.h"
#include "led.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//Mini STM32¿ª·¢°å
//ͨÓö¨Ê±Æ÷ Çý¶¯´úÂë
//ÕýµãÔ­×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2010/12/03
//°æ±¾£ºV1.0
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ÕýµãÔ­×Ó 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//ͨÓö¨Ê±Æ÷Öжϳõʼ»¯
//ÕâÀïʱÖÓÑ¡ÔñΪAPB1µÄ2±¶£¬¶øAPB1Ϊ36M
//arr£º×Ô¶¯ÖØ×°Öµ¡£
//psc£ºÊ±ÖÓÔ¤·ÖƵÊý
//ÕâÀïʹÓõÄÊǶ¨Ê±Æ÷3!
u16 msCount = 0;//ms¼ÆÊý
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//Éú³ÉÓÃÓÚ¶¨Ê±Æ÷ÉèÖõĽṹÌå
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ʱÖÓʹÄÜ
TIM_DeInit(TIM3);//ÅäÖö¨Ê±Æ÷»ù´¡½á¹¹Ìå
TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ ¼ÆÊýµ½4000Ϊ1ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂʳýÊýµÄÔ¤·ÖƵֵ 4MhzµÄ¼ÆÊýƵÂÊ
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //Çå³ý¸üÐÂÖжϣ¬±ÜÃâÒ»´ò¿ªÖжÏÁ¢¼´²úÉúÖжÏ
TIM_ITConfig( //ʹÄÜ»òÕßʧÄÜÖ¸¶¨µÄTIMÖжÏ
TIM3, //TIM3
TIM_IT_Update ,
ENABLE //ʹÄÜ
);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3ÖжÏ
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //ÏÈÕ¼ÓÅÏȼ¶0¼¶
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //´ÓÓÅÏȼ¶0¼¶
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê¹ÄÜ
NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
TIM_Cmd(TIM3, DISABLE); //ʹÄÜTIMxÍâÉè
}
void TIM3_IRQHandler(void) //TIM3ÖжÏ
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //¼ì²éÖ¸¶¨µÄTIMÖжϷ¢ÉúÓë·ñ:TIM ÖжÏÔ´
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //Çå³ýTIMxµÄÖжϴý´¦Àíλ:TIM ÖжÏÔ´
msCount++;
}
}
u32 measure(void)
{
u32 t=0,b=0;
TIM_SetCounter(TIM3,0);//Çå³ý¼ÆÊý
msCount = 0;
TIM_Cmd(TIM3, ENABLE); //ʹÄÜTIMxÍâÉè
LED0=1; //·¢Éä40KHz·½²¨
delay_us(200);
LED0=0;
delay_us(300); //µÈ´ýÓàÕðÏûʧ
while(INPUT==0);
TIM_Cmd(TIM3, DISABLE); //ʹÄÜTIMxÍâÉè
t = msCount*100000;//MS»»Ëã
b = TIM_GetCounter(TIM3)/4*100;//΢Ãë¼¶³ËÒÔ100±¶
t = t+b+(TIM_GetCounter(TIM3)%4*25);//µÃµ½US
TIM_SetCounter(TIM3,0);//Çå³ý¼ÆÊý
delay_ms(10);
return t;
}
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK Mini STM32¿ª·¢°å
//ͨÓö¨Ê±Æ÷ Çý¶¯´úÂë
//ÕýµãÔ­×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2010/12/03
//°æ±¾£ºV1.0
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ÕýµãÔ­×Ó 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
void TIM3_Int_Init(u16 arr,u16 psc);
u32 measure(void);
#endif
#include "LED.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "lcd.h"
#include "usart.h"
//ALIENTEK Mini STM32¿ª·¢°å·¶Àý´úÂë7
//¶¨Ê±Æ÷ÖжÏʵÑé
//¼¼ÊõÖ§³Ö£ºwww.openedv.com
//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
int main(void)
{
u32 max,sum=0,V=0;
u32 i,Time1,V1;
u32 a[10]={0,0,0,0,0,0,0,0,0,0};
u8 k,j;
int Time=0; //¶¨Òå·µ»ØÊ±¼äΪ¸¡µãÐÍ
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// ÉèÖÃÖжÏÓÅÏȼ¶·Ö×é2
uart_init(9600); //´®¿Ú³õʼ»¯Îª9600
LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
LCD_Init(); //³õʼ»¯ÓëLCDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
LCD_Clear(WHITE); //°×É«±³¹â
TIM3_Int_Init(3999,18-1);//4MHz 4000Ϊ1ms
POINT_COLOR=RED; //×ÖÌåÑÕÉ«ÉèÖÃΪºìÉ«
LCD_ShowString(30,70,200,24,24, "Time: . us");
LCD_ShowString(30,100,200,24,24,"V= . m/s");
LCD_ShowString(100,130,200,16,16,"2018/7/19");
while(1)
{
for(i=0;i<10;i++)
{
a=measure();
}
// ðÅÝÅÅÐò
for(k=0;k<10;k++)
{
for(j=k+1;j<10;j++)
{
if(a[k]>a[j])
{
max=a[k];
a[k]=a[j];
a[j]=max;
}
}
}
// ȡƽ¾ùÖµ
sum=0;
for(k=2;k<8;k++)
{
sum+=a[k];
}
Time=sum/6;
V=1490000/Time;
Time=0;
V1=V/100;
LCD_ShowxNum(90,100,V1,4,24,0);
V=V-V1;
LCD_ShowxNum(150,100,V,1,24,0);
Time1=Time/100;
LCD_ShowxNum(100,70,Time1,4,24,0);
Time=Time-Time1;
LCD_ShowxNum(160,70,Time,2,24,0);
delay_ms(10);
}
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜ A¶Ë¿ÚʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0--> A.8 ¶Ë¿ÚÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOA.8
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //PA.8 Êä³öµÍ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //¸¡¿ÕÊäÈ룬IO¿ÚËÙ¶ÈΪ50hz
}
|
|