打印

AT892051做超声波遇到的问题

[复制链接]
1982|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ZGL3314|  楼主 | 2011-2-17 13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟做了一个超声波测距,做的时候用的是89C52单片机开发板写的程序,后来由于有点资源浪费,换成了AT89C2051,但是问题出来了,程序不执行判断了,不知道怎么回事,求大侠帮助 xinchengxu.rar (1.22 KB)

相关帖子

沙发
ZGL3314|  楼主 | 2011-2-17 14:36 | 只看该作者
#include<reg51.h>
#include<intrins.h>
//#include<DS18B20.h>
#define uchar unsigned char                        /*缩定义*/
#define uint unsigned int
sbit vout=P1^7;                                                /*声明40KHz脉冲信号输出口*/
//sbit P16=P1^6;                                        /*看门狗复位引脚*/
sbit Led1= P1^5;                                        /*收到回波指示*/
sbit Led2=P1^4;                                                /*达到距离指示*/
sbit Led3=P1^3;                                                /* 不在测试范围指示*/
//sbit DQ=P1^2;
sbit Out=P1^1;                                                       
uint i,time,distance;                                /*定义接收时间与距离变量*/
bit rec_flag;                                                  /*定义接收成功标志位*/
uchar k,j;                                                        /*定义脉冲个数与位选控制变量*/
int tempValue;

/**************************函数声明*****************************/
void Init();                                                        /*初始化函数*/
/**************************延时函数*****************************/
void delay_1ms(uchar x)
{
        uchar y;
        while(x--)
                for(y=0;y<110;y++);
}

/****************************主程序****************************/
void main()
{
        Init();
        while(1)
        {
//                sendChangeCmd();
//                tempValue = getTmpValue();
                if(rec_flag)
                {
                        rec_flag=0;
                        Led1=1;
                        for(i=400;i>0;i--);                                        /*测量间隔控制(约4*100=400MS)*/                       
                        if(distance>=130&&distance<=200)           /*测试距离设置*/
                        {
                                Led2=1;
                                Led3=0;
//                                Out=1;
                        }
                        else
                        {
                                Led2=0;
                                Led3=1;
//                                Out=0;
                        }                                               
                }
                        EA=1;
                        TR0=1;       
        }       
}

void Init()                                                                                /*初始化函数*/
{
        vout=0;
        Led1=0;
        Led2=0;
        Led3=0;
        TMOD=0x21;                                                /*T1为8位自动重装模式*/
        TH0=0x00;                                                /*65ms计数初值*/
        TL0=0x00;
        TH1=0xf2;                                                /*12us计数初值*/
        TL1=0xf2;
//        PX0=1;
        PT1=1;
        ET0=1;
        EA=1;
        TR0=1;       
}  

/************************定时器T0中断程序************************/
void TIMER0() interrupt 1
{
        EA=0;
        TH0=0x00;
        TL0=0x00;
        EA=1;
        ET1=1;
        TR1=1;
        TR0=1;
}
/**********************定时器2中断程序************************/
void TIMER1() interrupt 3
{
        vout=!vout;
        k++;
        if(k>=4)                                                                /*超声波肪冲个数控制(为赋值的一半)*/
        {
                k=0;               
                TR1=0;
                ET1=0;
//                for(j=200;j>0;j--);                                        /*1ms延时避开盲区*/
                delay_1ms(10);
                EX0=1;                                                                /*开启外部中断0*/
//                IT0=0;                                                               
        }       
}
/***************************外部中断0程序***************************/
void int0() interrupt 0
{       
        TR0=0;                                  
        TR1=0;
        ET1=0;
        EA=0;
        EX0=0;       
//        sendChangeCmd();
//        tempValue = getTmpValue();
        rec_flag=1;                                                        /*接收成功标志位置1*/
        time=TH0;
        time=time*256+TL0;
        time=time-120;                                                /*补偿软件或硬件带来的误差*/
//        distance=time*(331.5+tempValue/1000*0.607)*0.00005;
        distance=time*(331.5+20*0.607)*0.00005;               
}

贴上程序,希望大虾多多帮助了

使用特权

评论回复
板凳
ZGL3314|  楼主 | 2011-2-17 16:00 | 只看该作者
咋没人回复啊

使用特权

评论回复
地板
chunyang| | 2011-2-17 23:06 | 只看该作者
二者是兼容的,但注意2051没有定时器2。

使用特权

评论回复
5
yewuyi| | 2011-2-18 09:30 | 只看该作者
俺强烈怀疑这个是你自己独立完成的!!!

如果你能在AT89C5X上搞定它,那么你一定能在AT89C2051上搞定它,如果搞不定,要么不是你自己做的,要么你严重的懒惰。

使用特权

评论回复
6
luolaerd| | 2011-2-19 12:51 | 只看该作者
学习

使用特权

评论回复
7
老鱼探戈| | 2011-2-19 13:01 | 只看该作者
俺强烈怀疑这个是你自己独立完成的!!!

如果你能在AT89C5X上搞定它,那么你一定能在AT89C2051上搞定它,如果搞不定,要么不是你自己做的,要么你严重的懒惰。 ...
yewuyi 发表于 2011-2-18 09:30

有道理

使用特权

评论回复
8
ZGL3314|  楼主 | 2011-3-5 17:10 | 只看该作者
问题找到了,呵呵[/img]的问题,改错了

使用特权

评论回复
9
diyanhua| | 2011-7-15 14:06 | 只看该作者
求一个关于超声波的高手  qq联系  757476810

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

21

帖子

1

粉丝