完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
`#include #include #define uint unsigned int #define uchar unsigned char ***it trig=P3^3; //触发控制信号输入 ***it echo=P3^2; //回响信号输出 ***it pwm=P3^4;//输出PWM信号 ***it P2_0=P1^0; ***it P2_1=P1^1; ***it P2_2=P1^2; ***it P2_3=P1^3; uchar count,jd; uint time=0,timer=0; bit flag =0; unsigned long s=0,zs=0,ys=0; /********************************************************/ void delay(uint x) {uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--);} /********************************************************/ void tingzhi()//停止 {P2_0=0;P2_2=0;P2_1=0;P2_3=0;} void qianjin()//前进 {P2_0=0;P2_2=0;P2_1=1;P2_3=1;} void houtui()//后退 {P2_0=1;P2_2=1;P2_1=0;P2_3=0;delay(100);delay(100);delay(100);;tingzhi();} void zuozhuan()//左转 {P2_0=1;P2_2=0;P2_1=1;P2_3=1;delay(100);delay(100);delay(100);;tingzhi();} void youzhuan()//右转 {P2_0=0;P2_2=1;P2_1=1;P2_3=1;delay(100);delay(100);delay(100);;tingzhi();} /********************************************************/ void ceju(void) { while(!echo);//当echo为零时等待 TR0=1;//开启计数 while(echo);//当echo为1计数并等待 TR0=0;//关闭计数 time=TH0*256+TL0; TH0=0; TL0=0; s=(time*2)/100;//算出来是CM } /********************************************************/ void qingling() { timer=0; TH1=65036/256; TL1=65036%256; count=0;} /********************************************************/ void zd0() interrupt 1//T0中断用来计数器溢出,超过测距范围 {flag=1;}//中断溢出标志/********************************************************/ void zd1() interrupt 3 { TH1=65036/256; TL1=65036%256; if(count else pwm=0; count++; count=count%40; timer++; if(timer>=800) //一直直行每隔0.4S 就发出一个超声波 {timer=0; trig=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //18us trig=0;} } /*********************************************************/ void main(void) { //jd=3; //count=0; TMOD=0x11;//设T0,T1为方式1, TH0=0; TL0=0; TH1=65036/256;//计数器1定时0.5ms TL1=65036%256; IE=0x8a;//总中断开,允许计数器0,1中断开 while(1) {TR1=1; ceju(); if(s<=20) { tingzhi();//停止 jd=1; count=0; delay(20); //舵机转到0°,关定时器再清零。 TR1=0; qingling(); TR1=1; //可以在下一行写,在这里写 为了保证20ms 一定有40次中断 ceju(); ys=s; jd=5; count=0; delay(20); TR1=0; qingling(); TR1=1; ceju(); zs=s; jd=3; count=0; delay(20); TR1=0; qingling(); if((zs>=ys)&&(zs>20)) {zuozhuan();}//左转 else if((ys>=zs)&&(ys>20)) {youzhuan();}//右转 else {houtui();}//后退 } else if((s>20)||(flag==1)) {qianjin();}//前进 } } 为什么开始的时候是 舵机先转动啊? 我看的主程序 先是测距,距离小于20cm 舵机才转向,但是我用小车实验的时候 超声波模块的正前方没有障碍物啊 这是怎么一个情况???????? `
|
|
相关推荐
4 个讨论
|
|
|
下面呢?
|
|
|
|
|
|
|
|
185 浏览 0 评论
340 浏览 0 评论
367 浏览 0 评论
752 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
737 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16979 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-11 00:59 , Processed in 1.959346 second(s), Total 56, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2282