打印

51单片机 超声波测距

[复制链接]
1336|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蔚蓝柳叶|  楼主 | 2014-7-28 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 蔚蓝柳叶 于 2014-7-28 22:06 编辑

#include<reg51.h>
#include <intrins.H>
#define uchar unsigned char
#define uint unsigned int
uchar distance_H,distance_L;
                //特殊寄存器定义
sfr CLK_DIV =0x97;
               //STC MCU IO register define total way
sfr P1M1= 0x91;
sfr P1M0= 0x92;

sfr P3M1= 0xB1;
sfr P3M0= 0xB2;
              //IO口引脚说明
sbit Trig =P1^0;
sbit Echo =P3^2;

sbit led1_5 =P1^1;  
sbit led5_10 =P1^2;
sbit led10_15 =P1^3;
sbit led15_20 =P1^4;

void IO_inint(void);
void sys_inint(void);
void delay_nop(uint timer);
void led_out(void);
                   //IO口初始化
void IO_inint(void)
{
   CLK_DIV=0x02;//系统时钟四分之一分频
   P1M1= 0x00;   //0000 0000   
   P1M0= 0x1e;   //0001 1110
   P1=0x00;      //0000 0000  
   P3M1= 0x04;   //0000 0100
   P3M0= 0x00;   //0000 0000
}
//定时中断初始化设定
void sys_inint(void)
{
   TMOD=0x01;  //0 0 方式0 13位计数器 TMOD=0x00  //1 0 方式2 自动重装8位计数器 TMOD=0x02
   TH0=0;      //0 1 方式1 16位计数器 TMOD=0x01  //1 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器 TMOD=0x03
   TL0=0;      //TH0 TL0计数初值
   TR0=0;      //关定时器0
   IT0=0;     //上升沿触发
   EX0=0;    //禁用外部中断
   EA=1;     //中断总允许位
}
                //NOP延时
void delay_nop(uint timer)
{
   while(timer--){_nop_();}
}
                  //外部中断0,用做判断回波电平           
void int0_routine(void)  interrupt 0     
{   
     distance_H =TH0;    //取出定时器0的值         
     distance_L =TL0;    //取出定时器0的值            
     EX0=0;            //关闭外部中断   
}
//LED输出控制
void led_out(void)
{
     uint distance;
     distance=distance_H;             //测量结果的高8位
     distance<<=8;                   //放入16位的高8位
     distance=distance|distance_L;   //与低8位合并成为16位结果数据
     distance*=12;                   //因为定时器默认为12分 频
     distance/=58;                   //一厘米就是58us

    if(distance>2&&distance<50)//测量距离在2到50厘米时,led1_5灯亮
    {
      led1_5=1;
    }
    else
    {
      led1_5=0;
    }
    if(distance>50&&distance<100)//测量距离在50到100厘米时,led5_10灯亮
    {
      led5_10=1;
    }
    else
    {
      led5_10=0;
    }
    if(distance>100&&distance<150)//测量距离在100到150厘米时,led10_15灯亮
    {
      led10_15=1;
    }
    else
    {
      led10_15=0;
    }
    if(distance>150&&distance<200)//测量距离在150到200厘米时,led15_20灯亮
    {
      led15_20=1;
    }
    else
    {
      led15_20=0;
    }        
}
//系统主程序
void main(void)
{
   IO_inint();
   sys_inint();
   while(1)
   {
      Trig=1;        
      delay_nop(20);
      Trig=0;
      while(!Echo);   
      TR0=1;                                       
      EX0=1;         
      while(TH0<40);
      TR0=0;          //关闭定时器0
      TH0=0;          //定时器0清零         
      TL0=0;          //定时器0清零
      led_out();      
   }
}
这是XKC-007Y-PWM超声波模块的例程,麻烦分析 main 程序的意思。  while(TH0<40);是什么意思?什么时候会用到中断  void int0_routine(void)  interrupt 0 ?超声波什么时候发出(哪个语句),什么时候接收到?main函数各语句麻烦注释下,尽量详细!!!谢谢!


相关帖子

沙发
蔚蓝柳叶|  楼主 | 2014-7-28 22:37 | 只看该作者
松山归人 发表于 2014-7-28 22:13
推荐你学习“张飞电子工程师速成视频”,讲解实战经验,模电技术直接得到提升并运用到工作中。
第一部免费 ...

谢谢,我看看

使用特权

评论回复
板凳
dirtwillfly| | 2014-7-28 22:55 | 只看该作者
蔚蓝柳叶 发表于 2014-7-28 22:37
谢谢,我看看

他发的链接是广告,已处理

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
蔚蓝柳叶 + 1
地板
蔚蓝柳叶|  楼主 | 2014-7-29 18:01 | 只看该作者
本帖最后由 蔚蓝柳叶 于 2014-7-29 18:03 编辑

各位大神,求教!
void int0_routine(void)  interrupt 0     
{   
     distance_H =TH0;    //取出定时器0的值         
     distance_L =TL0;    //取出定时器0的值            
     EX0=0;            //关闭外部中断   
}
它在哪里指明是Echo (P3^2)有下降沿就触发中断?还是说无论哪个引脚有下降沿或低电平就触发中断?

使用特权

评论回复
5
dirtwillfly| | 2014-7-29 19:32 | 只看该作者
我看你前面程序注释里是上升沿触发,就在那里,你查下资料看看。我用手机上网,不方便查

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
蔚蓝柳叶 + 1 赞一个!
6
roykin| | 2014-7-29 20:24 | 只看该作者
while(TH0<40);当THO大于40跳出死循环
TH0属于单片机特殊功能寄存器里边的一个,具体的一般是用来设置定时器0八位的时间初值

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
蔚蓝柳叶 + 1 赞一个!
7
courage苏| | 2014-7-31 10:46 | 只看该作者
灰版貌似有发过,你可以去找找,论坛有资料下。具体哪忘了,我有下载保存。

使用特权

评论回复
8
蔚蓝柳叶|  楼主 | 2014-7-31 15:50 | 只看该作者
灰版 在哪的?论坛没找到!你有下载,发我一份吧!谢谢!!!

使用特权

评论回复
9
大沙发的| | 2014-8-7 10:09 | 只看该作者
先搞清楚模块的使用说明。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:柳桥静观峰岳时,杏香轻抚白云笑。

10

主题

81

帖子

1

粉丝