码迷,mamicode.com
首页 > 其他好文 > 详细

超声波测距,串口显示

时间:2017-09-27 10:00:57      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:printf   定义   pre   中断   lag   float   行数据   模块   UI   

 #include   <reg51.H>
 #include   <intrins.h>   //使用空指令_nop_()
 #include   <STDIO.H>

 #define uchar unsigned  char
 #define uint  unsigned   int  
 sbit RX=P2^0;       //接收
 sbit TX=P2^1;       //发射            位操作,没有用宏定义
  

    unsigned int  time=0;
    unsigned int  timer=0;
    float         S=0;
   bit           flag =0;     //标志位
    

/********************************************************/
    void Conut(void)
    {
     time=TH0*256+TL0;     //高8位换算成十进制加上低8位
     TH0=0;             //...
     TL0=0;            //重置定时器0上的数据
     S=(time*1.87)/100;     //算出来是CM,机器周期为T1=1/11.0592*12 //us=1.08us,实际时间为t=time*1.08,该时间为声波往返时间,需除以2,声速346m/s,//S=v*t=346*time*T1/2/1000000m=1.868*time1/100cm得S≈time*1.87/100 cm

 if(flag==1)            //超出测量
     {
      flag=0;
      printf("---\n"); 
     }

      printf("S=%fcm\n",S); 
    }
/********************************************************/ 
void delayms(unsigned int ms)
{
    unsigned char i=100,j;
    for(;ms;ms--)
    {
        while(--i)
        {
            j=10;
            while(--j);
        }
    }
}
/********************************************************/
     void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                             //中断溢出标志
  }
/********************************************************/
   void  StartModule()                  //T1中断用来扫描数码管和计800MS启动模块
  {
      TX=1;                             //800MS,启动一次模块,开始发射信号
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_();
      _nop_(); 
      _nop_(); 
      _nop_();             //发射大于10us的脉冲触发信号
      _nop_();
      TX=0;                //关闭信号发射
  }
/********************************************************/
void main(void)
{  
    TMOD=0x21;   //定时器1工作在方式2,方式2为8位自动重装初值计数或定时方式,加入进位和flag;定时器0工作在方式1,方式1为16位计数或定时方式。
    SCON=0x50;   //01010000,串行口控制器,后两位为TI,RI
    TH1=0xFD;    //...
    TL1=0xFD;    //做波特率发生器使用,波特率9600
    TH0=0;          
    TL0=0;          
    TR0=1;         //开启定时器0  
    ET0=1;       //允许T0中断
    TR1=1;         //开启定时器1
    TI=1;         //串口发送中断请求标志位置,表示发送完一帧串行数据后,硬件置“1”,需要软件清0
    EA=1;         //开启总中断


    while(1)
    {
     StartModule();
     while(!RX);        //当RX为零时等待,即开始运行后没有接收到信号时
     TR0=1;                //定时器0开始计时
     while(RX);            //当RX为1计数并等待,即接收到信号时
     TR0=0;                //关闭计数
     Conut();            //计算
     delayms(100);        //100MS

    }
}                

 

超声波测距,串口显示

标签:printf   定义   pre   中断   lag   float   行数据   模块   UI   

原文地址:http://www.cnblogs.com/Dark-Ages/p/7599733.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!