完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
基于stm8s105 ,tm1638显示,HC-SR04超声测距 下面是我编的程序,但是当测距超过50cm之后显示的数值就会产生过大的误差,HC-SR04测距范围是0.02~5m例如测量距离为70cm,数码管就会从70cm降到60到50再到40最后再升回去,非常不稳定,希望有哪位大神能帮我解决一下这个问题啊
#include"stm8s.h" int n=0; u16 x; u16 y; float a; float b; u16 c,d,e,f; u16 DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; #define clk1 GPIO_WriteHigh(GPIOB,GPIO_PIN_1) #define clk0 GPIO_WriteLow(GPIOB,GPIO_PIN_1) #define stb1 GPIO_WriteHigh(GPIOB,GPIO_PIN_0) #define stb0 GPIO_WriteLow(GPIOB,GPIO_PIN_0) #define dio1 GPIO_WriteHigh(GPIOB,GPIO_PIN_2) #define dio0 GPIO_WriteLow(GPIOB,GPIO_PIN_2) void gpio() { GPIO_DeInit(GPIOB); GPIO_Init(GPIOB,GPIO_PIN_0,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOB,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOB,GPIO_PIN_2,GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOB,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_FAST); } void Write_TM1638(u8 ord)//数码管显示 { u16 i; for(i=0;i<8;i++) { clk0; if(ord&0x01) dio1; else dio0; clk1; ord=ord>>1; } } void Command_TM1638(unsigned char Data)//数码管位选 { stb1; stb0; Write_TM1638(Data); } void delay_ms(u16 t)//毫秒定时 { tiM3_DeInit(); TIM3_TimeBaseInit(TIM3_PRESCALER_16,1000); while(t--) { TIM3_Cmd(ENABLE); while(TIM3_GetFlagStatus(TIM3_FLAG_UPDATE)!=1); TIM3_ClearFlag(TIM3_FLAG_UPDATE); TIM3_Cmd(DISABLE); } } void TIM2_Configuration(void) { TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_16,62500);//16分频 TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_RISING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_DIV1, 0);//通道1 上升沿 PD4 TIM2_ITConfig(TIM2_IT_CC1, ENABLE);//中断通道1使能 enableInterrupts(); } void delay_us(u16 z) //10us定时 { while(z--) { nop();nop();nop();nop(); } } void trig() { GPIO_WriteHigh(GPIOB, GPIO_PIN_3); delay_us(25) ; GPIO_WriteLow(GPIOB, GPIO_PIN_3); } void main(void) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); gpio(); Command_TM1638(0x88); Command_TM1638(0x44); TIM2_Configuration(); //enableInterrupts(); // trig(); while(1) {//trig(); /// TIM2_Cmd(ENABLE); TIM2_SetCounter(0); trig(); TIM2_Cmd(ENABLE); a=(float)(y-x)/2000; b=a*340; c=(u16)b%10; d=(u16)b%100/10; e=(u16)b%1000/100; f=(u16)b/1000; Command_TM1638(0xc0); Write_TM1638(DuanMa[c]); Command_TM1638(0xc2); Write_TM1638(DuanMa[d]); Command_TM1638(0xc4); Write_TM1638(DuanMa[e]); Command_TM1638(0xc6); Write_TM1638(DuanMa[f]); delay_ms(2000); } } #pragma vector=16 __interrupt void exti_tim2(void) { n++; if(n%2==1) { x=TIM2_GetCapture1(); TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_DIV1, 0); } else { y=TIM2_GetCapture1(); TIM2_ICInit(TIM2_CHANNEL_1, TIM2_ICPOLARITY_RISING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_DIV1, 0); } TIM2_ClearITPendingBit(TIM2_IT_CC1); } |
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 19:22 , Processed in 0.591912 second(s), Total 65, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4287