一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 7084|回复: 7

[其他综合] US-100超声波模块串口测距

[复制链接]
发表于 2012-3-3 18:18 | 显示全部楼层 |阅读模式
CIMG0070.JPG CIMG0071.JPG CIMG0072.JPG CIMG0074.JPG CIMG0075.JPG
/*******************************************************************************************
        US-100超声波模块串口测距
模式选择跳线的间距为2.54mm,当插上跳线帽时为UART(串口)模式只需要在Trig/TX=p3.1 管脚输入0X55
(波特率9600),系统便启动对当前距离进行测量,然后将距离值通过Echo/RX=p3.0 管脚输出测量输出的
距离值共两个字节,第一个字节是距离的高8位(HDate),第二个字节为距离的低8位(LData),单位为
毫米。即距离值为 (HData*256 +LData)mm。      如果大于4.5米,显示 "-"
cpu 89c52    11.0592MHZ            3-3-2012
*******************************************************************************************/
#include "REG52.h"
#define uchar unsigned  char
#define uint  unsigned   int  
void UART_ISR(void);
void UARTSnd(unsigned char dat);
void UART_init();
void MeterTempByUART();
/*******************************************************************************************/
sbit  dula  = P2^6;   //显示段选锁存控制端
sbit  wela  = P2^7;   //显示位选锁存控制端
sbit  led0 = P1^0;  //接收指示灯
sbit  led1 = P1^7;  //发送指示灯
uchar  dispbuf[4];   //显示缓冲区
uchar idata GLengthLoh[2]; //接收缓冲区
/************************共阳数码管显示位码+数码管0-9段码**********************************
uchar code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//共阳极数码管显示位码
/************************************数码管0-9段码****************************************
uchar code SEG7[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf};//共阳极数码管0-9 -
/*******************************************************************************************/
/************************共阴数码管显示位码+数码管0-9段码**********************************/
uchar code dispbit[]={/* 0xfe,0xfd,0xfb,0xf7, */0xef,0xdf,0xbf,0x7f};//共阴极数码管显示位码
/************************************数码管0-9段码****************************************/
uchar code SEG7[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//共阴极数码管0-9 -
/*******************************************************************************************/
void UART_ISR(void) interrupt 4
{
uchar temp ,k;
ES = 0;         //  关中断         
if(RI)
{
  RI = 0;         // 清接收标志
  temp = SBUF;
  GLengthLoh[k] = temp;
  k++;
  if(k == 2) //  k = 数据长度
  k = 0;
  led0 = ~led0;
}
ES = 1;      //开中
}
/*******************************************************************************************/
void UARTSnd(unsigned char dat)//向串口发送一个字符
{
TI = 0;   // 清发送标志
SBUF = dat;  //如果TI为0等待
while (!TI); // wait until sent
led1 = ~led1;
}
/*******************************************************************************************/
void UART_init()
{
TH1 = 0xFD;
TL1 = 0xFD;
TMOD = 0x21;   //设置定时器1为模式2;定时器0为模式1   
TH0 =(65536-2500)/256; //约2.50MS定时器初值
TL0 =(65536-2500)%256; //约2.50MS定时器初值
    ET0 = 1;
TR0 = 1;    //启动定时器
TR1 = 1;    //启动定时器  SM0  SM1
SM0 = 0;    //串口通信模式设置  0   0 = 0
SM1 = 1;        //  0   1 = 1
           //  1   0 = 2
           //   1    1 = 3
REN = 1;  //串口允许接收数据
  ES = 1;  //开串中断
EA = 1;
}
/*******************************************************************************************/
//定时器0中断,用做显示
timer0() interrupt 1  // 定时器0中断是1号
{
uchar dispcount;  //自定义寄存器
static unsigned char count=0;
TH0 =(65536-2500)/256; //约2.50MS定时器初值
TL0 =(65536-2500)%256; //约2.50MS定时器初值 TH0 = 0xef; TL0 = 0x94; //写入定时器0初始值
dula = 0; dula = 1;
P0 = SEG7[dispbuf[dispcount]]; //根据dispcount当前计算值到dispbuf
         //显示缓冲存储区取待显示值作为参数到
         //SEG7段码存储区取显示段码赋给P0口
dula = 0; wela = 0; wela = 1;
P0 = dispbit[dispcount]; //根据dispcount当前计算值到dispbit位选存储区
        //取显示位码赋给P0口
wela = 0;
dispcount++;
if(dispcount == 4)   //共4位显示位
{
  dispcount = 0;
}
count++;
if(count == 100)  //约25MS读取一次
{
  count = 0;
  MeterTempByUART();
}  
}
/*******************************************************************************************/
void DisplayLength(unsigned long number)
{
if(number > 4500)  //如果大于4.5米,显示 "-"
{
  dispbuf[0] = 10; //显示 "-"
  dispbuf[1] = 10; //显示 "-"
  dispbuf[2] = 10; //显示 "-"
  dispbuf[3] = 10; //显示 "-"
}
else if(number < 4500)
{
  dispbuf[0] = number / 1000;
  dispbuf[1] = number % 1000 / 100;
  dispbuf[2] = number % 100 / 10;
  dispbuf[3] = number % 10;
}

}
/*******************************************************************************************/
void MeterTempByUART()
{
UARTSnd(0X55);
}
/*******************************************************************************************/
void main(void)
{
unsigned long PreLength = 0;
UART_init();
while(1)
{  
  PreLength = GLengthLoh[0] * 256 + GLengthLoh[1];
  DisplayLength(PreLength);
  //DisplayLength(1234);
}
}
/*******************************************************************************************/
US100产品介绍V2.01.doc (1.26 MB, 下载次数: 704)

评分

参与人数 1一乐金币 +8 收起 理由
a60885262 + 8 1

查看全部评分

发表于 2012-3-3 19:45 | 显示全部楼层
本帖最后由 356053261 于 2012-3-3 19:56 编辑

好东西,有空了做一个便携的玩玩。
回复

使用道具 举报

发表于 2012-3-3 21:13 | 显示全部楼层
和倒车雷达一个原理吧
回复

使用道具 举报

发表于 2012-3-3 21:20 | 显示全部楼层
我也刚买了一个
回复

使用道具 举报

发表于 2012-3-3 21:28 | 显示全部楼层
这个能用来干什么呢?只是玩玩吧。不过看精度还挺高的。
回复

使用道具 举报

 楼主| 发表于 2012-3-3 21:56 | 显示全部楼层
当时异想天开,想做个防盗报警器之类的东东,拿回来才觉得只能玩玩没有实际用处,不防雨也不防灰尘
回复

使用道具 举报

发表于 2012-3-4 10:12 | 显示全部楼层
看了一下,距离太短,放弃这个念头了,
回复

使用道具 举报

发表于 2012-3-7 22:45 | 显示全部楼层
学习了。。。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-4 14:57 , Processed in 0.038769 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表