51单片机hc-sr04超声波测距程序 不知道哪里错求大神指导sbit Trig = P1^1;sbit Echo = P3^1;
voidmain{intdistance_data,a,b;P1=0;i=0;flag=0;test=0;Echo=0;Trig=0;TMOD=0x11;TR0=1;T0...
void main{ int distance_data,a,b; P1=0;i=0;flag=0;test=0;Echo=0;Trig=0; TMOD=0x11; TR0=1; T0=0;ET0=1; EX0=0; EA=1; while(1) //程序循环 { succeed_flag=0; //清测量成功标志 EA=0; Trig=0;delay_20us(); Trig=1; //产生一个20us的脉冲,在Trig引脚 while(Echo==1); TH1=0;TL1=0; //定时器1清零 TF1=0; TR1=1; EX0=1; EA=1; while(TH1<30); //等待测量的结果,周期65.535毫秒(可用中断实现) TR1=0; EX0=0 if(succeed_flag==1) { distance_data=outcomeH; //测量结果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据 distance_data*=12; //因为定时器默认为12分频 distance_data/=58; //微秒的单位除以58等于厘米 } if(succeed_flag==0) {distance_data=0; //没有回波则清零 } a=distance_data;conversion(a); } }INTO_() interrupt 0 { outcomeH =TH1; outcomeL =TL1; //取出定时器的值 succeed_flag=1; EX0=0; }timer0() interrupt 1 {TH0=0xfd; TL0=0x77;//写入定时器0初始值 switch(flag) {case 0x00:P0=ge;P2=0xfe;flag++;break;case 0x01:P0=shi;P2=0xfd;flag++;break;case 0x02:P0=bai;P2=0xfb;flag=0;break;} }timer1() interrupt 3 {TH1=0;TL1=0;}void conversion(uint temp_data) //显示数据转换程序 { uchar ge_data,shi_data,bai_data ; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余运算 shi_data=temp_data/10 ; temp_data=temp_data%10; //取余运算 ge_data=temp_data; bai_data=SEG7[bai_data]; shi_data=SEG7[shi_data]; ge_data =SEG7[ge_data]; EA=0;bai = bai_data; shi = shi_data; ge = ge_data ; EA=1;}void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++); }
展开
1个回答
2014-06-22
展开全部
echo一般接外部中断P32或P33,利用中断确认echo的高电平结束
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询