历史上的今天
返回首页

历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2019年10月30日 | HC-SR04超声波模块51+PIC单片机例程

2019-10-30 来源:51hei

单片机源程序如下:

//晶振=8M

//MCU=STC10F04XE

//P0.0-P0.6共阳数码管引脚

//Trig  = P1^0

//Echo  = P3^2

#include      //包括一个52标准内核的头文件

#define uchar unsigned char //定义一下方便使用

#define uint  unsigned int

#define ulong unsigned long

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

sfr  CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频

                     //为STC单片机的IO口设置地址定义

sfr   P0M1   = 0X93;

sfr   P0M0   = 0X94;

sfr   P1M1   = 0X91;

sfr   P1M0   = 0X92;

sfr        P2M1   = 0X95;

sfr        P2M0   = 0X96;

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

sbit Trig  = P1^0; //产生脉冲引脚

sbit Echo  = P3^2; //回波引脚

sbit test  = P1^1; //测试用引脚


uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9

uint distance[4];  //测距接收缓冲区

uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i;  //自定义寄存器

bit succeed_flag;  //测量成功标志

//********函数声明

void conversion(uint temp_data);

void delay_20us();

//void pai_xu();


void main(void)   // 主程序

{  uint distance_data,a,b;

   uchar CONT_1;   

   CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页) 

     P0M1 = 0;   //将io口设置为推挽输出

     P1M1 = 0;

     P2M1 = 0;

     P0M0 = 0XFF;

     P1M0 = 0XFF;

     P2M0 = 0XFF;

   i=0;

   flag=0;

        test =0;

        Trig=0;       //首先拉低脉冲输入引脚

        TMOD=0x11;    //定时器0,定时器1,16位工作方式

        TR0=1;             //启动定时器0

   IT0=0;        //由高电平变低电平,触发外部中断

        ET0=1;        //打开定时器0中断

//ET1=1;        //打开定时器1中断

        EX0=0;        //关闭外部中断

        EA=1;         //打开总中断0        

  

        

while(1)         //程序循环

        {

  EA=0;

             Trig=1;

        delay_20us();

        Trig=0;         //产生一个20us的脉冲,在Trig引脚  

        while(Echo==0); //等待Echo回波引脚变高电平

             succeed_flag=0; //清测量成功标志

             EX0=1;          //打开外部中断

                   TH1=0;          //定时器1清零

        TL1=0;          //定时器1清零

             TF1=0;          //

        TR1=1;          //启动定时器1

   EA=1;


      while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)  

                  TR1=0;          //关闭定时器1

        EX0=0;          //关闭外部中断


    if(succeed_flag==1)

             {         

                   distance_data=outcomeH;                //测量结果的高8位

           distance_data<<=8;                   //放入16位的高8位

                     distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据

            distance_data*=12;                  //因为定时器默认为12分频

           distance_data/=58;                   //微秒的单位除以58等于厘米

         }                                      //为什么除以58等于厘米,  Y米=(X秒*344)/2

                                                               // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 

    if(succeed_flag==0)

                   {

            distance_data=0;                    //没有回波则清零

                           test = !test;                       //测试灯变化

           }


     ///       distance[i]=distance_data; //将测量结果的数据放入缓冲区

     ///        i++;

            ///         if(i==3)

          ///             {

          ///               distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;

     ///        pai_xu();

     ///        distance_data=distance[1];


      

           a=distance_data;

       if(b==a) CONT_1=0;

       if(b!=a) CONT_1++;

       if(CONT_1>=3)

                   { CONT_1=0;

                          b=a;

                          conversion(b);

                        }       

          ///                 i=0;

          ///                }             

         }

}

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

//外部中断0,用做判断回波电平

INTO_()  interrupt 0   // 外部中断是0号

{    

     outcomeH =TH1;    //取出定时器的值

     outcomeL =TL1;    //取出定时器的值

     succeed_flag=1;   //至成功测量的标志

     EX0=0;            //关闭外部中断

  }

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

//定时器0中断,用做显示

timer0() interrupt 1  // 定时器0中断是1号

   {

         TH0=0xfd; //写入定时器0初始值

         TL0=0x77;                 

         switch(flag)   

      {case 0x00:P0=ge; P2=0xfd;flag++;break;

            case 0x01:P0=shi;P2=0xfe;flag++;break;

            case 0x02:P0=bai;P2=0xfb;flag=0;break;

      }

   }

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

/*

//定时器1中断,用做超声波测距计时

timer1() interrupt 3  // 定时器0中断是1号

    {

TH1=0;

TL1=0;

     }

*/

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

//显示数据转换程序

void conversion(uint temp_data)  

{  

    uchar ge_data,shi_data,bai_data ;

    bai_data=temp_data/100 ;

    temp_data=temp_data%100;   //取余运算

    shi_data=temp_data/10 ;

    temp_data=temp_data%10;   //取余运算

    ge_data=temp_data;


    bai_data=SEG7[bai_data];

    shi_data=SEG7[shi_data];

    ge_data =SEG7[ge_data];


    EA=0;

    bai = bai_data;

    shi = shi_data;

    ge  = ge_data ; 

         EA=1;

}

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

void delay_20us()

{  uchar bt ;

    for(bt=0;bt<100;bt++);

}

/*

void pai_xu()

  {  uint t;

  if (distance[0]>distance[1])

    {t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值

  if(distance[0]>distance[2])

    {t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值

  if(distance[1]>distance[2])

    {t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值         

    }

*/



推荐阅读

史海拾趣

ept Connectors公司的发展小趣事

随着全球环保意识的不断提高,EPT Connectors公司也开始关注环保和可持续发展问题。公司积极采取各种措施减少生产过程中的污染和浪费,并推出了一系列环保型连接器产品。同时,EPT还积极参与各种环保活动和社会公益事业,以实际行动践行企业的社会责任。这些举措不仅提升了EPT的品牌形象和社会声誉,也为其未来的发展注入了新的动力。

普芯达电子(Chipswinner)公司的发展小趣事

普芯达电子自创立之初,就立志成为国产高品质、高性价比的IC产品供应商。在成立初期,公司面临着资金紧张、技术积累不足以及市场竞争激烈等多重挑战。然而,凭借着创始人对集成电路行业的深厚理解和坚定信念,普芯达电子逐步克服了这些困难,通过引进优秀人才、加大研发投入以及不断优化产品质量,逐渐在市场上崭露头角。

Holmes Co Inc公司的发展小趣事

面对日益增长的全球市场需求,Holmes Electronics决定实施全球化战略。他们首先在亚洲建立了生产基地,利用当地的成本优势和供应链资源,大幅提高生产效率并降低成本。随后,公司又在欧洲和美国设立了研发中心和销售网络,以更好地服务当地客户并捕捉市场机会。这一全球化战略不仅使Holmes Electronics的产品遍布全球,还增强了公司的市场响应能力和品牌影响力。

Analog Modules Inc公司的发展小趣事

面对突如其来的新冠疫情挑战,Holmes Electronics迅速调整策略,加速数字化转型。他们利用云计算、大数据和人工智能等先进技术,构建了高效的远程办公和智能制造体系。通过数字化转型,公司不仅有效保障了员工的安全健康和生产效率,还进一步提升了产品质量和客户满意度。此外,Holmes Electronics还积极开发防疫相关的电子产品,如智能体温检测设备和消毒机器人等,为抗击疫情贡献了自己的力量。

Eurofarad公司的发展小趣事

Eurofarad,作为Exxelia Technologies旗下的知名品牌,自1965年成立以来,就专注于电子元件的设计和制造。在创立初期,Eurofarad凭借对电子技术的深入研究和对市场需求的敏锐洞察,迅速推出了多款高性能、高质量的电子元件产品。这些产品在市场上获得了广泛的认可,为Eurofarad的后续发展奠定了坚实的基础。

Crowd Supply公司的发展小趣事

Crowd Supply的创立源于几位麻省理工大学的毕业生对于硬件创新的热情与追求。他们意识到,许多优秀的硬件项目因缺乏资金和市场渠道而无法实现商业化。于是,他们决定创建一个平台,专门服务于这些创新项目,帮助它们从原型设计走向市场。这就是Crowd Supply的初心,也是其使命所在——将原创、有用、受人尊敬的硬件带入生活。

问答坊 | AI 解惑

嵌入式构架206页

送给需要的朋友。   …

查看全部问答>

刚装的ev4.0 运行程序提示 Cannot Execute Program

今天上午刚安装的evc4.0     安装过程是    ActiveSync->eVC4->eVC4 sp4->smartphone SDK->crosoft Pocket PC 2003 SDK->Windows Mobile 2003 Second Edition Emulator Images for Pocket PC - CHS;   &nbs ...…

查看全部问答>

RNDIS问题

我将usb设备口切换到rndis功能下。 更新了同步软件后系统自动安装了驱动。 但是,每次wince重启PC才能发现wince,通过插拔usb线没有效果。 另外,驱动有问题,启动不了,错误码(10)。 更新驱动发现同步软件的目录下没有*.sys文件,只有inf文 ...…

查看全部问答>

请问wince 扫描仪驱动的一些问题

   最近需要开发一个扫描仪在wince下的驱动程序,但是没有一点头绪,希望做过的兄弟帮忙给点提示。 我用的板子是2440+wince5.0,扫描仪还没确定。    要做这样一个驱动需要做些什么准备?怎么开始?如果有具体流程就更好了, ...…

查看全部问答>

如何测试storage驱动?

ddk里面有些例子,但是不知道如何测试,我改如何调试呢?thx…

查看全部问答>

关于CCS安装的问题,小女子急!没分了,真抱歉啊,5555~

CCS 2.2版本,同一个软件我在公司的机子上安装没有出现任何问题,在自己的机子上安装,装了好几次都出现同样的问题,每次open一个新的工程,就出现no build tools were found.两台机子都同是xp的系统. 请高手指点,拜托了!…

查看全部问答>

想开始学学430,不知道选什么小项目开始玩起

想开始学学430,不知道选什么小项目开始玩起,手上有lauchpad. 大家给给意见…

查看全部问答>

模电中的二级放大电路的动态交流分析

请问这个电路的交流等效电路中,T2管子的电流怎样流?一般来说不是都是由基极b流向射极e,由受控电流源上的电流由集电极c流向射极e,但是为什么答案的电流是由e流向b,受控电流源的电流是由e流向c的呢第二个问题,第二级的输入电阻是不是就是第一级 ...…

查看全部问答>

招兼职DSP相关讲师

招兼职DSP相关讲师,周期短,可周末,如您想挣点外块,积累资源,充实生活,请联系我,要求有实际项目经历,两年以上项目经历,表达能力较好,有意者请联系QQ:2294693830,邮件soft@info-soft.cn。…

查看全部问答>