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

📄 ctest2.c

📁 此程序为超声波测距程序
💻 C
字号:
#include<reg52.h>
#include<intrins.h>
#include<absacc.h>
#include<string.h>
#define uchar unsigned char
#define uint  unsigned int

uint count;   //当前计数值
uint distance;
bit intt=1;
unsigned char cont=0;
unsigned char co=0;
uchar buf;
//uchar m,lm,cm;
/**************针脚定义************/
sbit rect_wave=P2^0;           //晶振控制信号
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit CLR=P1^3;
sbit DATA=P1^4;
sbit CLK=P1^5;
sbit d=P2^1;
sbit cp=P2^2;
sbit dir=P2^3;

/***********************************/

/**************函数声明************/
void time0over(void);                              //定时器计时程序
void clrlcd(void);                                 //clr LCD
void c_send(unsigned char y);                         //发命令
void reset(void);                                 // reset LCD
void d_send(unsigned char x);                     //发数据
void pos(unsigned char pos);                     //设定显示位置
void l_delay(unsigned int t);                      //长延时
void trans(j);
void ret(void);                                   //初始化系统
void retcont(void);                               //定时器复位
void math(void);                                  //计算测量距离

/***************************/
void init(void)
{ TH1=0xf3;
  TL1=0xf3;
  PCON=0x80;
  TR1=1;
  SCON=0x50;              /*串口初始化设置,波特率4800BPS*/
}

//*******************************//
void send(uchar dat)   /*发送子程序*/
{ //uchar i;
            /*发送一个数据*/
     SBUF=dat;
     while(TI==0);
	 TI=0;
     
}
/***********************************/
void turn (void)                  //电机转动控制
{
 unsigned char x; 
 cont++;
 cp=~cp;
 l_delay(50);
 cp=~cp;
 co++;
 if(co == 3)
 {d=~d;
 }
 if(co == 4)
 {d=~d;
  co=0;
 }
 if (cont == 200)               //判断是否进行反转复位
 {dir=~dir;
  cont=0;
  for(x=0;x < 200;x++)
  {cp=~cp;
   l_delay(5);
   cp=~cp;
   co++;
   if(co == 3)
   {d=~d;
   }
   if(co == 4)
   {d=~d;
    co=0;
   }
  }
  dir=~dir;
  cont=0;
 }
}
 /**************子程序**********************/
void int0 () interrupt 0    //中断0服务程序
 {
   EX0=0;                  //关闭中断
   TR0=0;                  //关闭定时器
   TF0=0;                  //标志位清零
   rect_wave=0;            //停止发送超声波
   intt=0;
 } 

void work(void)
{
  if(!intt)
  {
        intt=1;
       if (distance < 400)
       { 
	     buf=distance;
	     send(buf);
         turn();
	     math();}             //计算所测得的距离
        l_delay(5);             //延时
	    retcont();              //定时器复位
        rect_wave=1;
        count=0;
   }
 }


void math(void)         //计算所测得的距离
{ uchar m,lm,cm;
   

   
   cm=distance%10;        //取距离的最低位
   distance=distance/10;  //取距离的次高位
   lm=distance%10;
   distance=distance/10;  //取距离的最高位
   m=distance%10;

   clrlcd();              //输出计算结果
   pos(0);
   d_send('d');
   d_send('i');
   d_send('s');
   d_send('=');
     //pos(4);
   d_send(m+0x30);
   d_send(lm+0x30);
   d_send(cm+0x30);
   d_send('c');
   d_send('m');
   l_delay(500);
}



void time0over(void)       //定时器计时程序
 { TF0=0;
   count++;
   distance=count;
  }


/*
void trans(j)
{
  switch(j)
  {
  case 0:   d_send('0');break;
  case 1:   d_send('1');break;
  case 2:   d_send('2');break;
  case 3:   d_send('3');break;
  case 4:   d_send('4');break;
  case 5:   d_send('5');break;
  case 6:   d_send('6');break;
  case 7:   d_send('7');break;
  case 8:   d_send('8');break;
  case 9:   d_send('9');break;
  }

}
*/
delay()                        //延时
{
   int i;
          for(i=0;i<1000;i++);
}




void l_delay(unsigned int t)                        //延时
{
  unsigned int p;
  unsigned int j;

     for(j=0;j<t;j++)
      {
	     for(p=0;p<1000;p++);
      }
}





void reset(void)               // reset LCD
{
     delay();
    c_send(0x38);
    c_send(0x01);
    c_send(0x06);
    c_send(0x0c);
    c_send(0x80);
}


void clrlcd(void)               // clr LCD
{
     delay();
    c_send(0x01);

}

void pos(unsigned char pos)        //设定显示位置
{
  c_send(pos | 0x80);
}

void c_send(unsigned char y)         //发命令
{
  unsigned char i;
  EN=1;
  RS=0;
  RW=0;
  for(i=0;i<8;i++)
    {
       if(_crol_(y,i)&0x80)
            DATA=1;
       else
            DATA=0;
      CLK=0;
      CLK=1;
	 }
  EN=0;
  delay();
}

void d_send(unsigned char x)     //发数据
{
    unsigned char i;
  EN=1;
  RS=1;
  RW=0;
 for(i=0;i<8;i++)
    {
       if(_crol_(x,i)&0x80)
            DATA=1;
       else
            DATA=0;
      CLK=0;
      CLK=1;
	 }
  EN=0;
  delay();
}

void ret(void)   //初始化计数器

{ TMOD=0x22;     //设置定时器计数器1为工作方式2
  TH0=0xc6;      //设置计数初值高字节
  TL0=0xc6;      //设置计数初值低字节
  count=0;
  IE=0x00;       //禁止中断
  TF0=0;         //溢出标志位清零
  TR0=1;         //打开定时器1
  rect_wave=1;

  EA=1;          //打开中断
  IP=0x01;     //外部中断0为高中断优先级
  IT0=0;       //外部中断低电平触发シ?
  EX0=1;
}
void retcont(void)
{ TF0=0;         //溢出标志位清零
  TR0=1;         //打开定时器1
  EA=1;          //打开中断
  IP=0x01;     //外部中断0为高中断优先级
  IT0=0;       //外部中断下降沿触发
  EX0=1;
  rect_wave=1;


  }
/**************主程序************/
void main(void)
{ rect_wave=0;
  reset();
 l_delay(10);
   ret();
   init();
   math();
  for(;;)
    {
     if(TF0)
     {
        time0over();
     }
     work();
     }
 }

⌨️ 快捷键说明

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