求高手帮助分析51测距程序
时间:10-02
整理:3721RD
点击:
- #include <reg52.h>
- #define uchar unsigned char //定义一下方便使用
- #define uint unsigned int
- #define ulong unsigned long
- uint distance_data;
- uchar outcomeH ,flag , outcomeL;
- sbit Trig= P1^0; //产生脉冲引脚
- sbit Echo = P3^2; //回波引脚
- sbit p0_0=P0^0; //灯
- sbit p0_1=P0^1;
- sbit p0_2=P0^2;
- sbit p0_3=P0^3;
- void DELAY()
- {
- uint i,j;
- for(i=0;i<=50;i++)
- {
- for(j=0;j<=1827;j++);
- }
- }
- //Delay(1)延时26us
- void Delay(uint a)
- {
- a++;
- a++;
- a++;
- a++;
- a++;
- a++;
- }
- void main(void) //主程序
- {
- P0=0xff;
- Trig =0;
- TMOD=0x11; //定时器0,16位工作方式定时
- IT0=1; //下降沿触发外部中断
- while(1) //程序循环
- {
- TH0=0;
- TL0=0; //定时器0初值
- TH1=0;
- TL1=0; //定时器1初值
- TF0=0; // 溢出标志位清0
- TF1=0;
- distance_data=0;
- outcomeH=0;
- outcomeL=0;
- TR1=1;
- EA=0; //关总中断;
- flag=0;
- //出发传感器
- Trig=1;
- Delay(1); //延时26us
- Trig=0;
- EX0=1; //打开外部中断0
- while(Echo==0); //等待Echo引脚变高电平执行以下语句
- p0_2=0;
- DELAY();
- p0_2=1;
- TR0=1;//定时器0开始计时
- EA=1; //开总中断
- while(TH1<0xDF) ; //等待中断测距,为DF00时为57088,57088×1us=57ms,测量周期设为60ms
- TR0=0;
- TR1=0;
- EX0=0; //关外部中断;
- if(flag==1)
- {
- if( distance_data<0x24C) //10cm为588us,1us加一次,加588次,即十六值24c
- {
- p0_1=0;
- DELAY();
- p0_1=1;
- }
- }
- if(flag==0)
- {
- p0_3=0;
- DELAY();
- p0_3=1;
- }
- }
- }
- //外中断0
- void INTO_() interrupt 0
- {
- EX0=0; //关外部中断0
- flag=1;
- TR0=0;
- outcomeH=TH0; //从定时器0取值
- outcomeL=TL0;
- distance_data=outcomeH; //测量结果的高8位
- distance_data<<=8; //放入16位的高8位
- distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
- p0_0=0;
- DELAY();
- p0_0=1;
- }
测出distance_data值不对,求大家帮帮分析下程序
都不说下你是用什么测的,不知道的还以为51有新功能了。貌似是超声波?
使用超声波测距离了
用的测距hs-04模块吧?以前我在430上也用过这样的问题!你是不是只能测试1.3米左右而不是4。5米?是你的distance_data问题,改成ulong就好,因为uint数位不够溢出了,你可以仔细算算。当时我的程序也是这问题苦恼了好久好久,小编要加油!
小编认真研究一下这里
http://wenku.baidu.com/view/fa2e9425a5e9856a56126011.html
路过,看看,看看
