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

📄 caoshengpo.c

📁 超声波测距C51程序,产生40HZ信号
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define data_out P1
unsigned char code Seg7Code[17]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,0x3f};	/*用十六进数作为数组下标,可直接取得对应的七段编码字节*/
//0     1    2     3     4    5     6     7     8     9    A     b     C     d    E    F   -
sbit collective_plus0=P3^0;
sbit collective_plus1=P3^1;
sbit collective_plus2=P3^2;
sbit collective_plus3=P3^3;
sbit key_begin=P3^3 ;  /*测距启动键*/
sbit start=P1^0 ;  /*超声波电路启动口*/
sbit back=P1^1 ;  /*回波检测口*/
uchar survey_time;  /*每次测量检测次数*/
uchar count1=0;  /*这两个都是存时间用的*/
uchar count2=0;
float count_all=0;  //T0定时器中断总次数
float distance;    /*实际距离*/
uchar jumpout=0;

//=============================================================
// 函数名称:    time_count() (T0中断服务子程序)
// 功能描述:	记录回波时间
// 语法格式:    void time_count(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    用到count1、count2两个全局变量,这样不利于模块化,有待改进
//=============================================================
time_count()  interrupt 1
 {
  TR0=0;
  TMOD=0x11;
  TH0=0xff;
  TL0=0xf6;
  if(count1<255)
   count1++;
   else {
         count1=0;
         count2++;
        }
   TR0=1;
 }

//=============================================================
// 函数名称:    survey_nothing()   (T1中断服务子程序)
// 功能描述:	处理无回波的情况
// 语法格式:    void survey_nothing(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    用到定时器T1
//=============================================================
survey_nothing()  interrupt 2
 {
  TR1=0;
  data_out=Seg7Code[17];
  collective_plus0=0;
  collective_plus1=0;
  collective_plus2=0;
  collective_plus3=0;
  jumpout=1;
 }

//=============================================================
// 函数名称:    survey_manage()
// 功能描述:	回波检测及预处理
// 语法格式:    void survey_manage(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    由于用外部中断在检测时主程序较难处理,所以用了查询方式
//=============================================================
survey_manage()
 {
  while(1)
   {
    if(back==0)
     {
      TR0=0;
      count_all=count_all+count1+count2*255;
      break;
     }
     if(jumpout==1)
      break;
   }
 }
//=============================================================
// 函数名称:    data_manage()
// 功能描述:	用于将时间转换为距离
// 语法格式:    void data_manage(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    声速取335.55m/s
//=============================================================
data_manage()
 {
  float time;
  time=0.01*count_all;   //回波时间计算
  distance=33.55*time/8;   //距离计算
 }

//=============================================================
// 函数名称:    static_display()
// 功能描述:	静态显示4位数据(LED)
// 语法格式:    void static_display(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:
//=============================================================
void static_display() //先放着
 {
 }

 //=============================================================
// 函数名称:    display(uchar tmpx)
// 功能描述:	显示1位数据(LED)
// 语法格式:    void display(uchar tmpx)
// 入口参数:    无
// 出口参数:    无
// 注意事项:
//=============================================================
display(uchar tmpx)/*本函数用于输出各位的数据*/
   {
    uchar i;
    if(tmpx==0)
         i=0;
    if(tmpx==1)
         i=1;
    if(tmpx==2)
         i=2;
    if(tmpx==3)
         i=3;
    if(tmpx==4)
         i=4;
    if(tmpx==5)
         i=5;
    if(tmpx==6)
         i=6;
    if(tmpx==7)
         i=7;
    if(tmpx==8)
         i=8;
    if(tmpx==9)
         i=9;
    data_out=Seg7Code[i];/*输出数据*/
    }

 //=============================================================
// 函数名称:    dynamic_display(float tmpy)
// 功能描述:	显示1位数据(LED)
// 语法格式:    void dynamic_display(float tmpy)
// 入口参数:    无
// 出口参数:    无
// 注意事项:
//=============================================================
dynamic_display(float tmpy) /*这部分是整个函数的主体,即用于动态显示各位数据*/
 {
  uchar seg3;
  uchar seg2;
  uchar seg1;
  int a;
  a=tmpy;
  seg3=a/100; /*求出百位的数据*/
  a=a-seg3*100;
  seg2=a/10; /*求出十位的数据*/
  a=a-seg2*10;
  seg1=a/1;  /*个位*/
  collective_plus3=0;
  display(seg3);
  collective_plus3=1;
  collective_plus2=0;
  display(seg2);
  collective_plus2=1;
  collective_plus1=0;
  display(seg1);
  collective_plus1=1;
  collective_plus0=0;
  data_out=Seg7Code[13];
  collective_plus0=1;
 }


//=============================================================
// 函数名称:    delay()
// 功能描述:	检测前延时
// 语法格式:    void delay(uchar i)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    时间要具体计算
//=============================================================
void delay(uchar i) //用软件延时
 {

 }
//=============================================================
// 函数名称:
// 功能描述:	测距控制及显示
// 语法格式:    void      (void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    用户可参考设置进行必要修改,以适应不同情况
//=============================================================
 main()
  {
   while(1)
   {
    jumpout=0;
    count1=0;
    count2=0;
    count_all=0;
    while(1)  /*判断测量启动键是否按下*/
    {
     if(key_begin==0)
       break;
    }
    for(survey_time=4;survey_time>0;survey_time--)     /*测4次数据*/
     {
      EA=1;
      ET1=1;
      TR1=0;
      TMOD=0x11;
      TH1=0x2e;  /*定时时间要大于最大测量距离时回波所需的时间(这里大概54ms)*/
      TL1=0x6d;
      TR1=1;  /*启动定时器T1,作用:针对探测时前面无障碍物而无返回的情况*/
      start=1;    /*启动发射电路*/
      TH0=0xff;   /*定时0.01ms*/
      TL0=0xf6;
      ET0=1;
      TR0=1;   /*开定时器T0,开始对回波计时*/
      delay(100);   /*检测前延时*/
      start=0;   /*关闭发射电路*/
      survey_manage();   /*查询回波信号并预处理*/
     }
     data_manage();    /*数据处理*/
     static_display(count_all);   /*静态显示*/
   }
  }






⌨️ 快捷键说明

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