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

📄 overv_test3.c

📁 51内核单片机的超声波测距代码
💻 C
字号:
#include <reg52.h>                     //包含文件

/********************************************************************/
/*                        寄存器定义,位定义                        */
/********************************************************************/

sfr      WDT_COUNTER=0xE1;             //看门狗寄存器
sfr      CCON=0xD8;                    //PCA模块控制寄存器
sfr      CMOD=0xD9;                    //PCA模块模式寄存器
sfr      CL=0xE9;                      //
sfr      CH=0xF9;                      //PCA模块计数寄存器
sfr      CCAP0L=0xEA;                  //
sfr      CCAP0H=0xFA;                  //PCA模块0初值
sfr      CCAP1L=0xEB;                  //
sfr      CCAP1H=0xFB;                  //PCA模块1初值
sfr      CCAPM0=0xDA;                  //PCA模块0相应设置
sfr      CCAPM1=0xDB;                  //PCA模块1相应设置
//sfr      IP=0xB8;
sfr      IPH=0xB7;

sbit     CR=CCON^6;                      //PCA模块控制位
sbit     csb=P1^5;                     //超声波控制
sbit     test=P1^7;
sbit     CCF1=CCON^1;                  //PCA模块1溢出标志位
sbit     CCF0=CCON^0;
sbit     EPCA_LVD=IE^6;


/********************************************************************/
/*                          相关变量初始化                          */
/********************************************************************/

#define uchar unsigned char
#define uint unsigned int
int count=0;             //计数
int count2=0;
char t0_f=0;
uchar count_1s=0;
int csb_p=0;
float jl=0,jl2=0,jl3=0;
//float jl2=0;
char *buffer;                          //类型转换数组
uchar datan,i,d[20];                   //接收数绝数目,接收数据字符数组
/********************************************************************/
/*                           函数定义                               */
/********************************************************************/
void pwm_init(void)                   //pwm初始化程序声明
{
        CMOD=0x81;
        CCON=0x00;
        CL=0;
        CH=0;
        CCAP0L=0x00;
        CCAP0H=0xB4;  //定时50ms
        CCAPM0=0x49;
        EPCA_LVD=1;
        //CR=1;
}

void intt0(void) interrupt 0 using 0   //外中断0中断处理程序
{
      //IE0=0;
      EX0=0;
      TR0=0;
      t0_f=0;
      jl3=(TH0*256+TL0);
      if(jl3>=500)
      {
            jl=(TH0*256+TL0)*17.0*0.001*12.0/11.0592;
            jl2=(TH0*256+TL0);
      }

}

void pwm0(void) interrupt 6 using 2   //50ms定时中断_PWM0
{
        CR=0;
        //P1^7 = ~P1^7;
        //test=~test;
        CCF0=0;
        count_1s++;
        if(count_1s>=41)
        {
                count_1s=0;
                TI=1;
        }
        CL=0;
        CH=0;
        CCAP0L=0x00;
        CCAP0H=0xB4;
        CR=1;
}

void timer0(void) interrupt 1 using 1  //定时器0中断处理程序
{                                      //距离测量溢出
        EX0=0;
        t0_f=0;
        TF0=0;
        TR0=0;

        jl2=0;
        jl=0;

        //test=!test;

}

void serial(void) interrupt 4 using 2  //串口中断(发送、接收)
{
    if(RI)                             //接收数据中断
    {

         datan=SBUF;                   //传输数据个数,单位为位
         RI=0;                         //清接收中断标志
         for(i=0;i<datan;i++)
	 {
	      while(!RI) ;
	      RI=0;
	      d[i]=SBUF;
	 }                             //接收数据存储
         TI=1;                         //置TI=1,进发送中断
    }
    else if(TI)                        //发送中断
    {
         TI=0;
         //jl=1001.012; buffer=(char*)&jl;          //浮点数转换为字符型数据
         buffer=(char*)&jl2;
         d[5]=buffer[0];
         d[6]=buffer[1];
         d[7]=buffer[2];
         d[8]=buffer[3];
         buffer=(char*)&jl;          //浮点数转换为字符型数据
         d[9]=buffer[0];
         d[10]=buffer[1];
         d[11]=buffer[2];
         d[12]=buffer[3];

         for(i=0;i<datan;i++)
         {
              SBUF=d[i];
              while(!TI);
              TI=0;                    //将接收数据发送回上位机
         }

    }
    else
    {;}

}

void ct_init(void)                    //中断初始化(串口、定时器)
{
    PCON=0x00;                         //波特率不加倍
    SCON=0x50;                         //选择串口工作方式1
    TMOD=0x21;                         //定时器1工作方式2(8位自动重装)
                                       //定时器0工作方式1(16位定时器)
    IT0=1;                             //外中断0(脉冲计数)工作在脉冲方式
    TH1=0xFD;
    TL1=0xFD;                          //定时器1初值
    TH0=0x00;
    TL0=0x00;                          //计数器0计数初值(10ms)

    TR1=1;                             //开启定时器1(串口)
    //TR0=1;                             //开启定时器0
    //ET0=1;                             //定时器0中断允许
    EX0=0;                             //外部中断0中断允许
    ES=1;                              //串口中断允许
    EA=1;                              //总中断允许

}

/********************************************************************/
/*                            主程序                                */
/********************************************************************/
void main(void)
{

    IPH=0x03;
    IP=0x02;     //串口最高,其次超声波发送,再是接收,最后1s定时
    csb=0;                              //初始化超声波无输出
    ct_init();
    pwm_init();
    CR=1;
    EX0=0;
    ET0=1;
    t0_f=1;

    EX0=0;

         ET0=1;
         TR0=0;
         TH0=0x00;
         TL0=0x00;

    while(1)
    {
         EX0=0;
         TR0=0;
         csb=0;
         TH0=0x00;
         TL0=0x00;
         count=100;
         while(--count);
         csb=1;

         TR0=1;
         count=25;
         while(--count);
         csb=0;

         count=100;          //100效果不错
                              //450时延时600us以上
         while(--count);

         t0_f=1;
         EX0=1;
         while(t0_f);

    }
}

⌨️ 快捷键说明

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