全部评论(1条)
-
- gy19881025 2015-04-12 00:00:00
- //Trig = P1^0
//Echo = P3^2
#include <reg52.h> //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
//***********************************************
sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频
//为STC单片机的IO口设置地址定义
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
//***********************************************
sbit Trig = P1^0; //产生脉冲引脚
sbit Echo = P3^2; //回波引脚
sbit test = P1^1; //测SY引脚
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
bit succeed_flag; //测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
//void pai_xu();
void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)
P0M1 = 0; //将io口设置为推挽输出
P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
flag=0;
test =0;
Trig=0; //首先拉低脉冲输入引脚
TMOD=0x11; //定时器0,定时器1,16位工作方式
TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
ET0=1; //打开定时器0中断
//ET1=1; //打开定时器1中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0
while(1) //程序循环
{
EA=0;
Trig=1;
delay_20us();
Trig=0; //产生一个20us的脉冲,在Trig引脚
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EX0=1; //打开外部中断
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //
TR1=1; //启动定时器1
EA=1;
while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断
if(succeed_flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //没有回波则清零
test = !test; //测试灯变化
}
/// distance[i]=distance_data; //将测量结果的数据放入缓冲区
/// i++;
/// if(i==3)
/// {
/// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
/// pai_xu();
/// distance_data=distance[1];
a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
/// i=0;
/// }
}
}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd; //写入定时器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0xfd;flag++;break;
case 0x01:P0=shi;P2=0xfe;flag++;break;
case 0x02:P0=bai;P2=0xfb;flag=0;break;
} } //***************************************************************** /* //定时器1中断,用做超声波测距计时 timer1() interrupt 3 // 定时器0中断是1号 { TH1=0; TL1=0; } */ //****************************************************************** //显示数据转换程序 void conversion(uint temp_data) { uchar ge_data,shi_data,bai_data ; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余运算 shi_data=temp_data/10 ; temp_data=temp_data%10; //取余运算 ge_data=temp_data; bai_data=SEG7[bai_data]; shi_data=SEG7[shi_data]; ge_data =SEG7[ge_data]; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; } //****************************************************************** void delay_20us() { uchar bt ; for(bt=0;bt<100;bt++); } /* void pai_xu() { uint t; if (distance[0]>distance[1]) {t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值 if(distance[0]>distance[2]) {t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值 if(distance[1]>distance[2]) {t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值 } */ -
赞(16)
回复(0)
热门问答
- 求基于STC89c52单片机做超声波测距仪程序
2015-04-11 11:12:58
359
1
- 基于单片机STC89C52的数字测温仪程序
- 基于单片机STC89C52的数字测温仪程序,用三位数码管显示。要求:1、单点温度测试;2、测温范围:-10℃~50℃;3、分辨率:0~1℃;4、温度输出显示:3 位; 5、能超过上、下限自动报警。
2013-10-19 19:16:38
375
1
- STC89C52单片机程序下载不了。
- Chinese:正在尝试与 MCU/单片机 握手连接 ... MCU Type is: STC89C/LE52RC MCU Firmware Version: 3.2C Chinese:MCU 固件版本号: 3.2C Double speed (6 clock) / 双倍速: No OSCDN (OSC Control) / 振荡器控制: full gain 下载时 P1.0, ... Chinese:正在尝试与 MCU/单片机 握手连接 ... MCU Type is: STC89C/LE52RC MCU Firmware Version: 3.2C Chinese:MCU 固件版本号: 3.2C Double speed (6 clock) / 双倍速: No OSCDN (OSC Control) / 振荡器控制: full gain 下载时 P1.0, P1.1 须短路到地: No 擦除 AP 区时一并擦除 data flash 区: No 允许访问内部扩展RAM(MCU 新版本C版有效) 用户软件启动看门狗后, 复位关看门狗(单片机新版本C版有效) We are trying to run more rapid ... Chinese:正在尝SY更高的波特率连接 ... Handshake is failed. / 握手失败 (End: 10:11:18) 展开
2010-03-01 02:12:33
554
5
- 求一份如图 基于单片机超声波倒车测距的程序
2016-08-01 00:14:58
559
1
- 基于单片机AT89C52频率计,求程序,求助
2017-06-22 09:26:53
352
1
- 基于51单片机,ADC0804,光敏电阻,湿度传感器,求程序!!!!
- 我用的51单片机,采集光强度和空气湿度,利用了两个ADC0804进行转换(光敏电阻和电阻式湿度传感器),但是没有相应程序,哪位大哥能帮忙弄一个程序啊?如果是可行的程序,我账号里剩下... 我用的51单片机,采集光强度和空气湿度,利用了两个ADC0804进行转换(光敏电阻和电阻式湿度传感器),但是没有相应程序,哪位大哥能帮忙弄一个程序啊?如果是可行的程序,我账号里剩下的分全给你,虽然不多... 展开
2011-06-01 01:20:26
252
4
- 基于89C52单片机的HC-SR04超声波测距系统程序
2018-12-09 01:37:42
286
0
- 求基于单片机的低频信号发生器的原理图和程序
- 需要的是4*4键盘DAC0832滤波电路放大电路AT89C51液晶显示... 需要的是4*4键盘 DAC0832 滤波电路 放大电路 AT89C51 液晶显示 展开
2015-04-15 00:58:46
206
2
- 求一篇基于单片机的超声波测距仪的硬件设计的论文和开题报告
- 有的话麻烦发到jianpeiyong@163.com谢谢!!!
2010-12-22 06:27:18
309
2
- 求US-100(模块)超声波测距的C语言程序,基于51单片机的,3Q哦~
- 求基于51单片机的US-100超声波测距C语言程序。需要详细点的具体设计程序,O(∩_∩)O~ US-100模块参考资料:http://wenku.baidu.com/view/65e63e35a32d7375a41780ce.html 性能要求:实现2--150cm的测距,测得结果保留4位有效数字(取整数),单位:mm。 哪... 求基于51单片机的US-100超声波测距C语言程序。需要详细点的具体设计程序,O(∩_∩)O~ US-100模块参考资料:http://wenku.baidu.com/view/65e63e35a32d7375a41780ce.html 性能要求:实现2--150cm的测距,测得结果保留4位有效数字(取整数),单位:mm。 哪位大神帮帮忙喽,急啊!!!真心谢谢大神了~ 展开
2017-05-17 15:16:00
512
1
- 不用单片机怎么做超声波测距仪
2017-06-10 07:54:42
273
1
- 求大神,水流量传感器程序,在stc89c52实现测量水流量
2018-11-14 01:52:45
281
0
- 求个51单片机超声波测距(距离+报警)的c程序
- 求个51单片机超声波测距(距离+报警)的c程序
2017-05-19 03:18:16
371
1
- 求一个正确的基于51单片机的函数信号发生器的C程序
- 要自己调试成功的,不要在网上找的,波形产生是用DAC0832,频率显示用数码管也行,LCD1602也行,多谢大神帮忙,小弟不胜感激... 要自己调试成功的,不要在网上找的,波形产生是用DAC0832,频率显示用数码管也行,LCD1602也行,多谢大神帮忙,小弟不胜感激 展开
2014-05-13 10:50:43
414
3
- 单片机控制直流电机调速,求程序!!
- 硬件电路已经搭好了,就差程序了,哪位高手指导一下程序,或者提供一下程序,不胜感激!... 硬件电路已经搭好了,就差程序了,哪位高手指导一下程序,或者提供一下程序,不胜感激! 展开
2013-12-23 01:22:36
283
1
- 求AT89C51单片机程序 做自行车测速仪 有具体方案和参考C程序
2010-11-14 01:20:21
335
3
- 为什么做的基于单片机的超声波测距传感器测量距离短
2017-03-24 04:05:28
310
3
- 基于51单片机用LCD1602液晶显示的频率计程序
- 求程序——————
2013-04-23 19:11:42
305
1
- 基于单片机数字频率计设计汇编语言程序的设计思路
- 一、 设计目的 ——掌握数字量数据采集系统的设计方法。 二、技术指标 1.测量范围:0~200K 2.测量信号:方波 3.测量信号电压:3~5V 4.闸门时间:10mS、0.1S、1S 5.显示位数:6位 三、设计方案 根据技术要求,可确定出该数字频率计应由测量电路... 一、 设计目的 ——掌握数字量数据采集系统的设计方法。 二、技术指标 1.测量范围:0~200K 2.测量信号:方波 3.测量信号电压:3~5V 4.闸门时间:10mS、0.1S、1S 5.显示位数:6位 三、设计方案 根据技术要求,可确定出该数字频率计应由测量电路(包括量程标定电路和ADC)、单片机、键盘及显示电路几个组成部分,各部分采用的电路形式及主要器件确定如下: (1)单片机部分 选用89C51单片机作为主机,同时要设计89C51单片机的晶振电路和复位电路,具体电路略。 (2)测量电路部分 直接利用单片机内部的定时/计数器实现频率的测量。 (3)键盘、显示部分 本机需配置具有3个按键的键盘和6位数字LED的显示器。具体电路参见实验箱电路图4、5。 测量频率范围:1-1000HZ 闸门时间1S,单位(HZ) 1K-10K 闸门时间0.1S (计数值×10),单位(KHZ) 10k-200k 闸门时间10mS(计数值×100)单位(KHZ) 用按键选择测量范围。 图4 显示器电路连接图 图5 键盘电路连接图 图6 等精度测量数字频率计电路图 展开
2014-06-06 05:07:53
262
1
- 急求 基于51单片机 yl69土壤湿度传感器 lcd1602显示湿度c语言程序
2016-11-10 05:49:23
395
2
9月突出贡献榜
- 单位预算忏悔
- 饿啊地方
- 空中有牛
- 依然相信你会
- 本生(天津)健康科技有限公司
- 猫合宝
- 上海一科仪器有限公司
- 广东皓天检测仪器有限公司
- 武汉安德信检测设备有限公司
- 东莞市皓天试验设备有限公司
- futu888
- 牛牛麻麻2
推荐主页
最新话题
参与评论
登录后参与评论