完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
测距原理
在蓝桥杯单片机的竞赛综合平台CT107D中,超声波模块的TX引脚接到单片机的P1.0端口,RX引脚接到单片机的P1.1端口。 #include #include #include void delay_ms(int n); void delay12us(); void show_hc(unsigned char pos, unsigned char value); void Delay(unsigned char n); void Display_Distance(); void send_wave(); void measure_distance(); ***it TX=P1^0; //超声波发送端 ***it RX=P1^1; //超声波接收端 unsigned char table[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f}; //0~F 最后两个为——和. unsigned int distance=0; //超声波测量距离 void main() { XBYTE[0X8000]=0XFF;//关闭LED XBYTE[0XA000]=0X00;//关闭蜂鸣器,继电器 while(1) { measure_distance(); Delay(10); } } //显示超声波测的距离函数 void Display_Distance() { if(distance==999) //超出测量范围,显示"F" { show_hc(0,table[15]); delay_ms(1); } else { show_hc(5,table[distance/100]); delay_ms(1); show_hc(6,table[(distance%100)/10]); delay_ms(1); show_hc(7,table[distance%10]); delay_ms(1); } } //发送超声波信号 产生8个40KHz信号 void send_wave() { unsigned char i; for(i=0;i<8;i++) { TX=1; delay12us(); TX=0; delay12us(); } } //超声波测距 void measure_distance() { unsigned int time=0; //用于计数脉冲个数 TMOD&=0x0f; //定时器1模式0,13位,最大8192个计数脉冲 TH1=0X00; TL1=0X00; send_wave(); //发送超声波信号 TR1=1; //启动定时器,开始测距 while((RX==1)&&(TF1==0)); //等待接收到超声波信号返回,或者等到测量超出范围 TF1是溢出标志位,计满溢出后置1 TR1=0; //停止定时器 if(TF1==0) //正常测量范围 { time=TH1; time=(time<<8)|TL1; //读取定时器脉冲个数,获得时间T distance=((time/10)*17)/100+3; //计算距离 } else //超出测量范围,将溢出标志位置0 { TF1=0; distance=999; } } //数码管显示增强 void Delay(unsigned char n) { while(n--) { Display_Distance(); } } //单个数码管显示函数 void show_hc(unsigned char pos, unsigned char value) { XBYTE[0xE000] = 0xFF; //消隐 XBYTE[0xC000] = 0x01 << pos; //选择数码管的位置 XBYTE[0xE000] = value; //输出数码管显示的内容 } //延时1ms函数 void delay_ms(int n) { int i,j; for(i=n;i>0;i--) for(j=110;j>0;j--); } //延时12us函数 void delay12us() //@12.000MHz 延时12us { unsigned char i; _nop_(); _nop_(); i = 33; while (--i); } |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:31 , Processed in 1.214567 second(s), Total 51, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号