⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chaoshengbo.c

📁 单片机超声波测速
💻 C
字号:
/********************************************/
//Program Name  :  超声波测距仪
//Dedigned by      :  sc.Dai
//Date                 :  2007.4.10
/********************************************/
#include <reg52.h>
#include "intrins.h"
#include "12864LCDdriver.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
#define V=173
sbit CSOut=P1^0;
sbit Start=P1^4;

ulong TIME;
uchar DISTANCE;
uchar code discode[11]={'0','1','2','3','4','5','6','7','8','9',' '};
ulong data disnum[5];
bit data ReceiveOK=0;
bit data TOut;
bit data FLAG;

/*-----------------------------------------------------------*/
//延时函数
/*-----------------------------------------------------------*/
void delay2(uchar x)
{
 uchar a,b;
 for(a=0;a<x;a++)
  for(b=0;b<255;b++);
}

/*-----------------------------------------------------------*/
//初始化
/*-----------------------------------------------------------*/
void init(void)
{
 lcd_init();//LCD初始化,开机调用一次
 TMOD=0x01;//T0定时器方式1
 IT0=0;//INT0负边沿触发
 IP=0x01;//INT0高优先级
 EA=1;//开总中断
}

/*-----------------------------------------------------------*/
//超声波发射函数
/*-----------------------------------------------------------*/
void CCOut(void)
{
 TR0=1;
//40KHz
 CSOut=0;//1
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();
 CSOut=1;//2
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();
 CSOut=0;//3
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();
 CSOut=1;//4
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();
 CSOut=0;//5
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();
 CSOut=1;//6
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();
 CSOut=0;//7
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();
 CSOut=1;//8
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();
 CSOut=0;//9
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();
 CSOut=1;//10
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();
 CSOut=0;//11
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 _nop_();_nop_();
 CSOut=1;//12
}

/*-----------------------------------------------------------*/
//数据处理函数
/*-----------------------------------------------------------*/
void DataProcess(void)
{
  ulong time=0;
  TIME=TH0;
  TIME=(TIME<<8)|TL0;
  TIME*=173;//距离
  TIME=TIME/10000;//单位:CM
  disnum[0]=(uchar)TIME%10;        //个位
  disnum[4]=TIME/10;
  disnum[1]=(uchar)disnum[4]%10;//十位
  disnum[4]=disnum[4]/10;
  disnum[2]=(uchar)disnum[4]%10;//百位
  disnum[4]=disnum[4]/10;
  disnum[3]=(uchar)disnum[4]%10;//千位
}
/*-----------------------------------------------------------*/
//超时处理函数 T0
/*-----------------------------------------------------------*/
void TimeOut(void) interrupt 1
{
 TR0=0;
 ET0=0;
 EX0=0;
 ReceiveOK=0;
 TOut=1;
}

/*-----------------------------------------------------------*/
//超声波接收处理函数
/*-----------------------------------------------------------*/
void Receive(void) interrupt 0
{
 TR0=0;
 EX0=0;
 ET0=0;
 ReceiveOK=1; //设定接收成功标志
 TOut=0;      //清除超时标志
}


/*-----------------------------------------------------------*/
//测量结果显示函数
/*-----------------------------------------------------------*/
void LCDDisplay(void)
{
 lcd_home();
 lcd_writestr(0,0,"  超声波测距仪  ");
 lcd_writestr(1,0,"********");
 lcd_writestr(2,0,"当前被测距离为:");
 lcd_writestr(3,0,"        厘米    ");
 lcd_writechar(discode[disnum[3]],discode[disnum[2]],discode[disnum[1]],discode[disnum[0]]);
}

/*-----------------------------------------------------------*/
//出错提示函数
/*-----------------------------------------------------------*/
void ErrorDisplay(void)
{
 lcd_home();
 lcd_writestr(0,0,"  超声波测距仪  ");
 lcd_writestr(1,0,"********");
 lcd_writestr(2,0,"未收到回波信号,");
 lcd_writestr(3,0,"请缩短测量距离!");
}

/*-----------------------------------------------------------*/
//预备好提示函数
/*-----------------------------------------------------------*/
void ReadyDis(void)
{
 lcd_home();
 lcd_writestr(0,0,"  超声波测距仪  ");
 lcd_writestr(1,0,"********");
 lcd_writestr(2,0,"    已准备好    ");
 lcd_writestr(3,0,"    等待测量    ");
}

/*-----------------------------------------------------------*/
//主函数
/*-----------------------------------------------------------*/
void main(void)
{
  uchar ct;
  init();         //初始化
  ReadyDis();
  while(1)
  {
    if(Start==0)
    {
      delay2(50);
      if(Start==0) FLAG=1;
    } 
 
    if(FLAG==1)   //启动测量一次
    {
      TH0=0x00;
      TL0=0x00;
      TIME=0x00;
      ET0=1;
      CCOut();
      ct=100;
      while(--ct);
      EX0=1;
      while(TOut==0)
      {
        if(ReceiveOK==1)    //接收成功
        {
           DataProcess();   //数据处理
           LCDDisplay();    //LCD显示
           ReceiveOK=0;     //清除接收成功标志
           goto aa;
        }
      }
      if(TOut==1)
      {
        TOut=0;
        ErrorDisplay(); //超时,错误提示
      }
  aa: FLAG=0;            //清除定时标志,等待下一次测量
    }
  }
}
 
/*------------------------------end of the program----------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -