打印

STC12C5A60S2超声波测距(测试过,很好用)

[复制链接]
9358|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoliping1945|  楼主 | 2013-8-22 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiaoliping1945 于 2013-8-22 10:10 编辑

#include<stc12c5a60s2.h>
#include<intrins.h>
#include"HC_SR04.h"
#include"lcd_1602.h"

#define first 0x00                //LCD显示第1行
#define second  0x40        //LCD显示第2行

unsigned int distance=0;
/**********单片机串行输出,用74HC595串转并即刻并行进入LCD1602显示 *****************/
unsigned char juli[]="000.0cm";
void Delay500ms()                //@12.000MHz
{
        unsigned char i, j, k;

        i = 23;
        j = 205;
        k = 120;
        do
        {
                do
                {
                  while (--k);
                } while (--j);
        } while (--i);
}

void main()
{
           init_SR04();        //初始化超声波
           init_lcd();            //初始化液晶1602
           write_com(0x01);       //清屏
           delayus(100;         
           while(1)
                        {                                            
                         distance=sonic();        //获取距离
                         chuli(distance,juli);         //数据处理为lcd要显示的内容
                         lcd_1602(first,0,juli); //显示                        
                         Delay500ms();            //0.5秒测一次,也可用定时器                                      
                       }
}
/***********************************串行lcd1602头文件***********************************/
#ifndef __lcd_1602_H__
#define __lcd_1602_H__

#define uint unsigned int
#define uchar unsigned char

sbit rs=P2^2;
//rw=0;   只往lcd写入,不读出,故rw=0;
sbit en=P2^1;

sbit sclk=P2^2;           //移位时钟
sbit ds=P2^0;           //数据线
sbit rclk=P2^1  ;                 //锁存输出时钟

uchar num;
void delay(uint z)
{         
    uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void delayus(uint i)
{
   while(i--);
}
void write_595(uchar date)
{
        uchar i;
        for(i=0;i<8;i++)
         {
          sclk=0;
          ds=date&0x80;
          delay(2);
          sclk=1;
          date<<=1;                 //sclk给一个上升沿脉冲即可读走一位
         }
}

void write_com(uchar com) //写指令
{
   write_595(com);
   rs=0;
   delay(1);
   //rw=0;
   rclk=1;
   delay(1);
   rclk=0;                  //令595输出,并用en输出一个高脉冲
}
void write_data(uchar date )        //写数据
{
   write_595(date);                //写入数据
  rs=1;
   delay(5);
   rclk=1;
   delayus(10);
   rclk=0;                                //令595输出,并用en输出一个高脉冲
}
void init_lcd()                                                                //初始化LCD
{   
    write_com(0x38);
        delayus(50);
    write_com(0x0c);
        delayus(50);
    write_com(0x06);
        delayus(50);
   // write_com(0x01);                        //  暂时不用清屏,在显示前可清次屏,可自行加入或屏蔽这句。
        //delayus(50);
}
void lcd_1602(uchar x,uchar y,uchar *s)         //第X行,第y例开始显示
{
         init_lcd();
         write_com(0x80+x+y);
         while(*s!='\0')
            {
                        write_data(*s++);
                        delay(5);               
                }
}

#endif



/***********************HC-SR04头文件*************************************/
#ifndef __HC_SR04_H_
#define __HC_SR04_H_

sbit RX=P3^7;         //echo        接收端
sbit TX=P1^0;         //trig         发送端
/*********LCD显示字符转换表*************/
unsigned char  code  table[]="0123456789";
/**********函数声明*************/
void    init_SR04(void);           //  初始化
void    Delay20us();   //        延时
void    Clr_timer();   //        定时器清零
void    send();                   //        发送10US以上高电平
unsigned int   sonic();//   测距
void    chuli(unsigned int range,unsigned char *s); //        数据处理
void init_SR04(void)
{        
     TMOD = 0x01;         // 超声用定时器0
     EA = 1;                    //开总中断
     ET0= 1;                 
         TR0=0;
         TF0=0;
         RX=1;                 //置1,作为输入端查询,(51单片机特性,可查阅相关资料
                                    //若输入电平为1则1&1=1,若输入0则0&1=0,
                                     //如果RX=0:则无论引脚输入是1还是0,与原先置为0的RX脚&  
                                    //则得到的总是0,也就无法检测后面输入RX的电平)
         TX=0;
}
void send()                     //发送端TRI发送20us高电平
{
    TX = 0;
        Delay20us();
    TX=1;
        Delay20us();
        TX=0;
}
void Clr_timer()        //定时器清零
{
    TH0=0;
        TL0=0;
    TF0=0;
}
unsigned int  sonic()        //超声波测距
{
                unsigned int ceju1,time;
                 Clr_timer();
                 Delay20us();
                 send();                             
                 while(!RX) ;   //等待接收端变为高电平
                 TR0=1;           //启动计数
             while(RX);   //等待接收端变为低电平
                     TR0=0;           //停止计数
             if(TF0)
                ceju1=9999;
                 else
            {
                       time=TH0*256+TL0;    //得到距离所用时间   
                       ceju1=time*0.172+0.5; //放大10倍,取一位小数,此处已转化为cm单位,
                                                              //无需再转换,只是放大了10倍,四舍五入取位小数而已
                     //计算公式distance=time*344/2/1000000=time*0.0172  单位为cm,若为英尺好像是有个58什么来着来着,忘记了,自己百度吧
            }
             if(ceju1>5000)                       //大于5米,超出测距范围,置为无效数据
                           ceju1=9999;  
        return   ceju1;
}

void chuli(unsigned int range,unsigned char *s)          //带参数——>距离rangge,数据处理装载->*s
{
    s[0]=table[range/1000];
    s[1]=table[range%1000/100];
        s[2]=table[range%100/10];
        s[4]=table[range%10];         
}
void Delay20us()                //@12.000MHz
{
        unsigned char i;

        i = 57;
        while (--i);
}

#endif
评分
参与人数 1威望 +2 收起 理由
地瓜patch + 2 赞一个!

相关帖子

沙发
地瓜patch| | 2013-8-22 09:56 | 只看该作者
不错,顶一个

使用特权

评论回复
板凳
xt3203| | 2013-8-22 19:58 | 只看该作者
不错,谢谢.

使用特权

评论回复
地板
xiaoliping1945|  楼主 | 2013-8-22 20:33 | 只看该作者
xt3203 发表于 2013-8-22 19:58
不错,谢谢.

常来逛,有空就有上传。

使用特权

评论回复
5
yiwang1011| | 2013-8-27 14:51 | 只看该作者
楼主能贴个原理图么?

使用特权

评论回复
6
stardustxcx| | 2013-10-26 18:39 | 只看该作者

使用特权

评论回复
7
cys754346957| | 2013-10-31 22:20 | 只看该作者
谢谢 分享

使用特权

评论回复
8
vistayi| | 2013-11-1 22:55 | 只看该作者
好东西 ,,,,,,

使用特权

评论回复
9
zequan| | 2013-11-3 12:04 | 只看该作者
学习下

使用特权

评论回复
10
jobo007| | 2013-11-5 15:00 | 只看该作者
谢谢楼主,非常精练!顶1个

使用特权

评论回复
11
269837846| | 2013-11-6 09:35 | 只看该作者
挺好的

使用特权

评论回复
12
tech0013| | 2014-3-29 17:24 | 只看该作者

好东西,
学习下

使用特权

评论回复
13
kj715| | 2014-3-29 22:21 | 只看该作者
不错,很实用!

使用特权

评论回复
14
mingwp| | 2014-5-18 00:36 | 只看该作者
求楼主发一个原理图!mingwp@live.com
麻烦楼主了...

使用特权

评论回复
15
loliweive| | 2014-5-18 12:05 | 只看该作者
mingwp 发表于 2014-5-18 00:36
求楼主发一个原理图!
麻烦楼主了...

原理很简单,用单片机两个IO口与集成的超声波模块的发送和接受口连上即可。百度下应该会有这样的图片

使用特权

评论回复
16
chebei402| | 2014-5-18 13:38 | 只看该作者
不错,顶一个!

使用特权

评论回复
17
zgj224| | 2014-5-19 11:20 | 只看该作者
还不错。。。

使用特权

评论回复
18
hwcqcc| | 2014-7-28 15:48 | 只看该作者
谢谢楼主发扬共享精神,赞一个。

使用特权

评论回复
19
dp30737| | 2014-7-28 17:21 | 只看该作者
谢谢楼主分享

使用特权

评论回复
20
LSS9310| | 2014-8-28 17:19 | 只看该作者
不错

使用特权

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

本版积分规则

11

主题

74

帖子

3

粉丝