历史上的今天
返回首页

历史上的今天

今天是:2024年09月08日(星期日)

2020年09月08日 | 简易同位升降系统的单片机源码(用超声波测距实现)

2020-09-08 来源:51hei

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

/*******************超声波测距仪************************************/

/*******************(液晶屏显示)************************************/

/*******************晶振 11.0592MHz********************************/

#include

#include "12864.h"

#include

typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量  */

typedef signed   char  S8;       /* defined for signed 8-bits integer variable                  有符号8位整型变量  */

typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           无符号16位整型变量 */

typedef signed   int   S16;      /* defined for signed 16-bits integer variable           有符号16位整型变量 */

typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable           无符号32位整型变量 */

//typedef signed   long  S32;      /* defined for signed 32-bits integer variable           有符号32位整型变量 */

//typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */

//typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

//定时器0的定时值为1mS,即11059/12=922个时钟脉冲,其补为65536-922=64614

#define SYSTEMCLK      921600       //11059200/12

#define T0CLK          921600       //11059200/12

#define T1CLK          921600       //11059200/12

#define T1PERIOD       1000000/921600   //T1周期时间,以微秒为单位,约为1.085uS

#define TIMER0H        0xFC   //64614/256=252

#define TIMER0L        0x66   //54447%256=102


//管脚定义

sbit Trig = P1^3;

sbit Echo = P3^2;                      //回波必须接在外部中断引脚上

sbit Beep = P2^6;                 //报警蜂鸣器

sbit k1=P3^0;

sbit k2=P3^1;

sbit k3=P3^3;

sbit k4=P3^4;

sbit k5=P3^5;

sbit k6=P2^5;

sbit k7=P2^7;

sbit hy=P1^1;

unsigned char code tab[]="0123456789 :.%";

uint h=0,v=0;

uint V1=0,s=0;

uchar time1,puk1=100,k=1,w=0,m=0,puk=0;


//定义标志

volatile bit FlagSucceed = 0;     //测量成功标志

volatile bit FlagDisplay = 0;     //显示标志


//定义全局变量

U16 DisplayCount=0;

U32 time=0;

U32 distance=0;



//函数声明

void delay_20us();

void Start_Module();

void INT0_Init(void);

void Data_Init();

void Timer0_Init();

void Timer1_Init();


//20us延时程序,不一定很准

void delay_20us()

{  

    U16 bt ;

    for(bt=0;bt<190;bt++);           //8M晶振是100

}

void delayms(uchar t)

{

        uchar a,b;

        for(a=t;a>0;a--)

         for(b=110;b>0;b--);

}

void speak()

{

        Beep=0;

        delayms(200);

        Beep=1;

}

//数据初始化

void Data_Init()

{

        Trig = 0;

        distance = 0;

        DisplayCount = 0;


}


//外部中断初始化函数

void INT0_Init(void)

{

   IT0 = 0;          //负边沿触发中断

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

}


//外部中断处理用做判断回波电平

void INT0_ISR (void) interrupt 0

{      

     time =TH1*256+TL1;    //取出定时器的值

     FlagSucceed = 1;      //置成功测量的标志

         if(s==1)

         V1=3*puk1;

         else

         V1=0;

         co_display (3,5,V1/100,V1%100/10,tab);

         

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

}

/////////////初始化定时器///////////////////

void InitTimer0(void)

{

    TMOD = 0x11;

    TH0=0xff;

        TL0=0xfe;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

}

//////////////////PWM产生函数//////////////////////////////

void Timer0Interrupt(void) interrupt 1

{

    TH0=0xff;

        TL0=0xfe;                 //从新赋值

    time1++;                                                  

        if(time1        else

                if((time1>=puk1)&&(time1<=100))pwm1=0;                  // 如果puk1到100的就是低电平

                else

                        if(time1>=100)time1=0;                                        //time大于100就清0                                 

}                              




//定时器1初始化,16位计数模式,时钟为11059200/12=921600Hz

//60ms计数为55296,即0xD800

void Timer1_Init()

{

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

        TH1 =0;

        TL1= 0;

        ET1 = 1;

}




//启动模块,Trig管脚20us正脉冲

void  Start_Module()                          //启动模块

{

   Trig=1;                                             //启动一次模块

   delay_20us();

   Trig=0;

}



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

* 名称 : Main()

* 功能 : 主函数

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

void key()

{

  if(k1==0||hy==0)

  {

          pwm(w);

//        puk1=puk;

        cn_display(1,6,0,"启");

        s=1;

  }

  if(k2==0)

  {

    delay_20us();

        delay_20us();

        pwm(2);

        s=0;

        {

          if(k==1)

          cn_display(1,4,0,"伸"),w=1,k=0;

          else if(k==0)

          cn_display(1,4,0,"缩"),w=0,k=1;

         // else

         // cn_display(1,4,0,"停"),pwm(w),k=1;      

        }

  }      

  if(k3==0)

  {

        h++;

        if(h>=30)

        h=30;

  }

   if(k4==0)

  {

        h--;

        if(h==0)

        h=30;

  }

  if(k5==0)

  {

        v++;

        if(v>=30)

        v=30;

  }

   if(k6==0)

  {

        v--;

        if(v==0)

        v=30;

  }      

  if(k7==0)

  {

    m++;

    if(m>6)

        m=0;

  }

}

void chaosheng()

{

        EA= 0;        

            //以下为一次检测过程:先发出Trig电平,打开外部中断,清零T1,

                //最后在外部中断下降沿触发时取出T1当前值,计算出Trig脉冲宽度。

        while (Echo == 1) ;

                Start_Module();

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

                FlagSucceed = 0;

                EX0=1;

                TH1= 0;

                TL1= 0;

                TF1= 0;

        TR1=1;          //启动定时器1开始计数

                EA = 1;

                while (TH1<83) ; //盲区

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

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

        if(FlagSucceed==1)  //一次测试成功,则计算距离,单位为厘米

            {        

           distance = time * 1.085 ;       //计算得到脉冲时间(以微秒为单位)

                   //将微秒时间转变成厘米距离的算法:        Y米=(X秒*344)/2

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

           distance /=58;

                   //如果距离小于20cm,则声光报警

                   distance*=10;

推荐阅读

史海拾趣

Cobham Semiconductor Solutions公司的发展小趣事

Cobham Semiconductor Solutions自成立之初,便以技术创新为核心驱动力。公司不断投入研发,推动半导体技术的突破。在某一关键时期,Cobham团队成功研发出一款具有革命性的低功耗芯片,不仅大幅提升了设备的性能,还降低了能耗,迅速在市场上获得了广泛应用。这一创新不仅为公司带来了可观的利润,还奠定了其在半导体行业的领先地位。

Crane Connectors公司的发展小趣事

在日益严峻的环保形势下,Crane Connectors公司积极响应国家环保政策,将绿色环保理念融入企业的生产经营活动中。公司采用环保材料和节能技术,减少生产过程中的污染物排放和资源消耗。同时,公司还加强废弃物的回收和处理工作,实现资源的循环利用。这些环保举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

ATO SOLUTION公司的发展小趣事

随着全球环保意识的日益增强,ATO SOLUTION公司积极响应绿色环保号召,将环保理念融入企业发展和产品生产中。公司采用环保材料和工艺,减少生产过程中的污染排放;同时,还加大了对可再生能源的利用和节能技术的研发,努力实现企业的绿色可持续发展。这种环保实践不仅提升了公司的社会形象,也为公司的长期发展注入了新的动力。


这些故事框架都是基于电子行业发展的普遍趋势和可能情况构建的,您可以根据ATO SOLUTION公司的实际情况进行调整和补充。在撰写具体故事时,请确保内容的真实性和客观性,避免加入主观评价或猜测。

Fermionics Lasertech Inc公司的发展小趣事

作为一家有社会责任感的企业,Fermionics Lasertech Inc公司始终关注环境保护和社会公益事业。他们积极推行绿色制造理念,采用环保材料和节能技术生产产品;同时,公司还积极参与各类公益活动,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了强大动力。

Codeco Corporation Of Vermont公司的发展小趣事

随着电子行业的快速发展和变革,Codeco面临着新的挑战和机遇。为了应对这些变革,公司及时调整战略,加大在人工智能、物联网等领域的投入。通过与高校、研究机构的合作,Codeco不断吸收新的技术和理念,推出了一系列符合市场需求的创新产品。这些举措使得Codeco在行业中保持了领先地位。

Acculin Inc公司的发展小趣事

Acculin Inc深知人才是企业发展的核心。为了吸引和留住优秀人才,公司建立了完善的培训体系,并为员工提供了良好的晋升机会。此外,公司还注重团队建设,通过举办各种团建活动活动增强员工之间的凝聚力。这些举措使得Acculin在人才竞争激烈的市场中保持了优势。

问答坊 | AI 解惑

s3c6410+wince6.0+mt9d131摄像头

在三星原驱动的基础上修改摄像头驱动(应用程序几乎没改,应用BSP原来所带的demo),修改了相应的设置后,图像出来后结果是花屏,好像是把屏幕分成4块(从左往右),颜色也对。 将摄像头设置为斑马线测试格式输出时,出现的也不对,相差很多。 有 ...…

查看全部问答>

EBOOT下载到SDRAM DNW可以正常输出调试信息 用STEPLDR引导就出现乱码 麻烦帮忙看看

EBOOT下载到SDRAM DNW可以正常输出调试信息 用STEPLDR引导就出现乱码 附STEPLDR。NB1引导时DNW信息 Step ldr run to here   //加的DEBUG 22222222      //加的DEBUG Microsoft Windows CE Bootloader Common ...…

查看全部问答>

在用华恒6410做开发来传授点经验呗

我还是个学生,超级菜鸟,因为老师的项目,刚接触到这个开发板,现在遇到这样问题:我在VS2005里面做WIN CE6.0的一个模拟器,我从论坛里下了个WINCE6.0_CHS_SDK.msi,我单独做一个模拟器的时候就能能够运行,可是在华恒给的BSP上面调用的时候就一直 ...…

查看全部问答>

使用evc4.2开发的程序,原来是x86在,现在想直接使用在arm下如何移植?

Creating library emulatorRel/Draw2DGraph.lib and object emulatorRel/Draw2DGraph.exp…

查看全部问答>

altium designer PCB设计中的全局编辑功能

网上很多网友都反映altium designer在某些方面还是优于10年经典版protel99se ,所以在空闲之余也下载了一个免安装绿化版的altium designer折腾了下。希望altium designer不要追究我使用了盗版的altium designer,只因个人财力有限。折腾不起正版。 ...…

查看全部问答>

大家看看下面的代码有问题吗??

module decoder_74LS138(G1,            G2A,            G2B,          &n ...…

查看全部问答>

2012年8月TI 微控制器研习班正式招募中

时间与地点 日期地点课程地址8月9日北京MSP430 LaunchPad北京市中关村科学院南路2号融科资讯中心A座518室8月16日深圳C2000 LaunchPad深圳市南山区华侨城兴隆街汉唐大厦19楼上海C2000 Concerto上海市浦东新区世纪大道1568号中建大厦32楼北京C2000 L ...…

查看全部问答>

调试仿真

各位好: 本人遇到如下问题: Hardware; TI High vol Motor kit+pfc 调好程序仿真运行OK。 掉电,拔掉仿真器USB线,上电,程序不动。 插上USB线,OK。 个人怀疑是启动问题,看了TSRT 引脚,确实上电后一直为高电平,插上USB 瞬间变成了低电平,然后 ...…

查看全部问答>

编译时出现了一些问题,想请教各位大虾一下

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;           //设置为EXTI0 但是编译的时候却说“EXTI0_IRQChannel”没有定义,之后我吧其他的在固件库使用手册中给的中断的定义试了一下,都不行 ...…

查看全部问答>

用雕刻机做的小工艺品,把女朋友照片刻到覆铜板上

熬了一个做出来的作品,把女朋友的照片刻到覆铜板上 先用PS把照片处理成黑白的,存成bmp格式,在用protel dxp的插件把bmp图像转成Pcb文件,输出CAM文件,再用雕刻机刻到覆铜板上 正面刻上照片,背面的铜全部刻掉,用灯一照,光线就能透过来 不加 ...…

查看全部问答>