打印

超声波模块程序求指正

[复制链接]
1338|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wbxdz|  楼主 | 2013-5-17 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define VELOCITY_30C        3495       //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
#define VELOCITY_23C        3453       //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;
sbit INPUT  = P3^2;                //回声接收端口
sbit OUTPUT = P1^4;                //超声触发端口
sbit Beep   = P2^3 ;                           // 蜂鸣器
Sbit dula   =P2^6;
Sbit wela  =P2^7; 
long int distance=0;               //距离变
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar count;
extern void delay(uint x);
/******************************************************************************/
/* 函数名称  : Delay_xMs                                                      */
/* 函数描述  : 延时函数                                                       */
/* 输入参数  : x                                                              */
/* 参数描述  : 延时时间                                                       */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Delay_xMs(unsigned int x)
{
    unsigned int i,j;
    for(i = 0;i < x;i++ )
    {
        for(j = 0;j < 3;j++ )
        {
            ;
        }
    }
}
/******************************************************************************/
/* 函数名称  : Alarm                                                          */
/* 函数描述  : 蜂鸣器发声函数                                                 */
/* 输入参数  : t                                                              */
/* 参数描述  : 发声的次数                                                     */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Alarm(uchar t)
{
        uchar i;
        for(i = 0;i < t;i++)
        {
                Beep = 0;
                Delay_xMs(1000);
                Beep = 1;
                Delay_xMs(1000);
        }
}       
/******************************************************************************/
/* 函数名称  : delayt                                                         */
/* 函数描述  : 延时函数                                                       */
/* 输入参数  : x                                                              */
/* 参数描述  : 延时时间数据                                                   */
/* 返回值    : 无                                                             */
/******************************************************************************/       
void delayt(uint x)
{
    uchar j;
    while(x-- > 0)
    {
              for(j = 0;j < 125;j++)
        {
            ;
        }
    }
}
/******************************************************************************/
/* 函数名称  : Init_MCU                                                       */
/* 函数描述  : 初始化单片机函数                                               */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Init_MCU(void)
{
        TMOD = 0x01;          //定时器2初始化,设置为16位自动重装模式
        TL0 = 0x66;
        TH0 = 0xfc;              //1ms
    ET0 = 1;              //开定时器2
        EA = 1;                      //总中断使能
}
/******************************************************************************/
/* 函数名称  : Init_Parameter                                                 */
/* 函数描述  : 初始化参数和IO口函数                                           */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Init_Parameter(void)
{
         OUTPUT =1;
         INPUT = 1;
         count = 0;
         distance = 0;
}


void display(long int temp)
{
    uchar ge,shi,bai;
    bai=temp/100;
    shi=(temp%100)/10;  
    ge=temp%10;  
    wela=1;
    P0=0xfe;
    wela=0;
    dula=1;
    P0=table[bai];
    dula=0;
    delay(1);
    dula=1;
    P0=0x00;   //关位码
    dula=0;
    wela=1;
    P0=0xfd;
    wela=0;
    dula=1;
    P0=table[shi];
    dula=0;
    delay(1);
    dula=1;
    P0=0x00;   //关位码
    dula=0;

    dula=1;
    P0=table[ge];
    dula=0;
    wela=1;
    P0=0xfb;
    wela=0;
    delay(1);
    dula=1;
    P0=0x00;   //关位码
    dula=0;
}
/******************************************************************************/
/* 函数名称  : display                                                        */
/* 函数描述  : 显示数字                                                       */
/* 输入参数  : number,address                                                */
/* 参数描述  : number写入的数据,address地址                                  */
/* 返回值    : 无                                                             */


void Trig_SuperSonic(void)//出发声波
{
         OUTPUT = 1;
         delayt(1);
         OUTPUT = 0;
}
/******************************************************************************/
/* 函数名称  : Measure_Distance                                               */
/* 函数描述  : 计算距离函数                                                   */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void Measure_Distance(void)
{
        uchar l;
        uint h,y;
        TR0 = 1;
        while(INPUT)
    {
        ;
    }       
        TR0 = 0;
        l = TL0;
        h = TH0;
        y = (h << 8) + l;
        y = y - 0xfc66;//us部分
        distance = y + 1000 * count;//计算总时间
        TL0 = 0x66;
        TH0 = 0xfc;
        delayt(30);
        distance = VELOCITY_30C * distance / 20000;
}
/******************************************************************************/
/* 函数名称  : main                                                           */
/* 函数描述  : 主函数                                                         */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/                                       
void main(void)
{       
   
        Init_MCU();
        Init_Parameter();
        while(1)
        {
                 Trig_SuperSonic();         //触发超声波发射
                 while(INPUT == 0)          //等待回声
         {
             ;
         }
                 Measure_Distance();        //计算脉宽并转换为距离
                 
                 display(distance);    //显示距离
                 Init_Parameter();          // 参数重新初始化
                 delayt(100);               //延时,两次发射之间要至少有10ms间隔
         }       
}
/******************************************************************************/
/* 函数名称  : timer0                                                         */
/* 函数描述  : T0中断处理函数                                                 */
/* 输入参数  : 无                                                             */
/* 参数描述  : 无                                                             */
/* 返回值    : 无                                                             */
/******************************************************************************/
void timer0 (void) interrupt 1
{
        TF0 = 0;
        TL0 = 0x66;
        TH0 = 0xfc;
        count++;
        if(count == 18)//超声波回声脉宽最多18ms
        {
                TR0 =0;
                TL0 = 0x66;
                TH0 = 0xfc;
                count = 0;
        }
}
/******************************************************************************/
下载到51单片机中,只有p0=0xfe的数码管亮,其他的不亮,求大神们指正

相关帖子

沙发
dongranmengming| | 2013-5-23 21:52 | 只看该作者
1:确定发出超声波函数延时函数delayt(1)约为12.5us
2:mian函数INPUT==0等待,计算函数中INPUT==1等待,你想干啥!
3:你用P32口没用外部中断做???

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝