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

📄 csb.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;
uchar idata buf[1];
unsigned char cont=0;
unsigned char co=0;
/**************针脚定义************/
sbit rect_wave=P1^3;           //晶振控制信号
sbit d=P1^0;
sbit clk=P1^1;
sbit dir=P1^2;
/**************函数声明************/
void l_delay(unsigned int t);                     //长延时
void ret(void);                                   //初始化系统
void retcont(void);                               //定时器复位子程序
void send(uchar idata *d);                        //串口发送子程序
void init(void);                                  //串口初始化子程序
void Delay400Ms(void);
void turn (void);                                 //电机转动子程序
/**************子程序**********************/
void int_0 () interrupt 0    //中断0服务程序
 {
   EX0=0;                  //关闭中断
   TR0=0;                  //关闭定时器
   TF0=0;                  //标志位清零
   rect_wave=0;            //停止发送超声波   
   intt=0;  
 } 
/********************************************/
void int_t0 () interrupt 1
{
 count++;
 distance=count;
}
//*********************//
void init(void)
{ TMOD=0x22;
  TH1=0xf3;
  TL1=0xf3;
  PCON=0x80;
  TR1=1;
  SCON=0x50;              /*串口初始化设置,波特率4800BPS*/
}
/**********************************/
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
//*******************************//
void send(uchar idata *d)   /*发送子程序*/
{ uchar i;
     for(i=0;i<1;i++){       /*发送一个数据*/
     SBUF=d[i];
     while(TI==0);
	 TI=0;
     }
}
//**************************//
void turn (void)                  //电机转动控制
{
 unsigned char x; 
 cont++;
 clk=~clk;
 Delay400Ms();
 clk=~clk;
 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++)
  {clk=~clk;
   l_delay(10);
   clk=~clk;
   co++;
   if(co == 3)
   {d=~d;
   }
   if(co == 4)
   {d=~d;
    co=0;
   }
  }
  dir=~dir;
  cont=0;
 }
}
//**********************************//
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 ret(void)   //初始化计数器
{
  TH0=0xc6;      //设置计数初值高字节
  TL0=0xc6;      //设置计数初值低字节
  count=0;
  IE=0x00;       //禁止中断
  TF0=0;         //溢出标志位清零
  TR0=1;         //打开定时器1
  rect_wave=1;
  EA=1;          //打开中断
  ET0=1;
  IP=0x01;     //外部中断0为高中断优先级
  IT0=0;       //外部中断低电平触发シ?
  EX0=1;
}
/*************************************/
void retcont(void)
{ 
  TF0=0;         //溢出标志位清零
  EX0=1;
  count=0;
  TR0=1;         //打开定时器1
  rect_wave=1;
}
/**************主程序************/
void main(void)
{ 
  rect_wave=0;                  //关闭超声波发送
  init();                       //串口初始化
  ret();                        //定时器初始化
  while(1)
    {
     if(!intt)
      {
        intt=1;
        if (distance > 250)               //进行字节限制
          distance=0;
		buf[0]=(uchar)distance;         
	    send(buf);                   //发送数据
        turn();                          //电机转动
		Delay400Ms();             //延时
	    retcont();              //定时器复位
      }
    }
}

⌨️ 快捷键说明

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