C51超声波测距试验
来源:互联网 发布:c语言迷宫算法 编辑:程序博客网 时间:2024/04/29 05:04
代码Ultrasonic.c文件如下:
/******************************************************************************** 标题: US100测距试验 ** 1.通过本例程了解测试US100模块的性能 ,并用串口打印距离(单位m) 2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机来接收单片机串口所发的信息。 观察串口调试助手接收窗口 *接线方法: VCC接电源,GND接地,Trig/Tx接P1.0,Echo/Rx接P1.1 * *********************************************************************************/#include <REG52.H>#include <stdio.h>void delay(unsigned int i); //函数声明void delay_10us(unsigned int i);//long Distance_calculate(long plu);void Handle_display(unsigned long plus);char code MESSAGE[]= "Distance: ";char value_distance[] = "888888"; //该数组存放距离的Acall值 //其中数组value_distance[0-8],value_distance[0-1]是十位和个位,value_distance[2]是小数点存放位置 //value_distance[3-6]是4位小数位存放位置,value_distance[7]是换行符存放位置unsigned char a;sbit Trig = P1^0; //触发引脚,给出10US的脉冲触发US100模块sbit Echo = P1^1; //接受计时引脚,通过判断该引脚高电平时间,计算距离unsigned long plu; //定时器0计数值//long distance; //距离值void main (void) {/*******************初始化*************************/ SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2 TMOD|= 0x20; //定时器工作方式2 /*******************************************************/TMOD|= 0x09; //定时器0工作方式1 ET0 = 1; //定时器0中断允许// EX0 = 0; // 关闭INT0中/*GATE——门控制。●GATE=1时,“与门”的输出信号K由INTx输入电平和TRx位的状态一起决定(即此时K=TRx·INTx),当且仅当TRx=1,INTx=1(高电平)时,计数启动;否则,计数停止。当INT0引脚为高电平时且TR0置位,TR0=1;启动定时器T0;当INT1引脚为高电平时且TR1置位,TR1=1;启动定时器T1。●GATE=0时,“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。当TR0=1,启动定时器T0。当TR1=1,启动定时器T1。*/ PCON |= 0x80; //波特率提高一倍 //TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592) TH1 = 0xF3;// //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M) TL1 = 0xF3; TR1 = 1; //开启定时器1 ES = 1; //开串口中断 EA = 1; // 开总中断 // IE = 0x0; TR0=0; //T0停止计数 Trig = 0; //拉低 触发信号 Echo = 0; //拉低 计时信号/*******************初始化END*************************/while(1) { TH0=0x00; //计数器高8 TL0=0x00; //计数器低8 TF0=0; //计数器0溢出标志置0 a=0; Trig = 1; //给 触发信号 delay_10us(1); //触发拉高10us Trig = 0; /******************************************************/ while(Echo==0); //等待P1.1变高 TR0=1; //由INT0启动计数器 while(Echo==1); //等待P1.1变低 TR0=0; //T0停止计数 plu=TH0*256+TL0; //计数值/*******距离计算处理程序**********/ // Distance_calculate(plu);//plu = 551212;Handle_display(plu);/*******距离计算处理程序END**********/ /******************************************************//**************串口打印信息distance***************************/ while(MESSAGE[a] != '\0') {SBUF = MESSAGE[a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器) while(!TI);// 等特数据传送(TI发送中断标志) TI = 0;// 清除数据传送标志a++; // 下一个字符 } /**************串口打印信息distance*END**************************/ a = 0; while(value_distance[a] != '\0') {SBUF = value_distance[a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器) while(!TI);// 等特数据传送(TI发送中断标志) TI = 0;// 清除数据传送标志a++; // 下一个字符 } delay(1000); } } /***************************************************函数名: Distance_calculate *功能: 距离计算 *输入参数:plu(16位计数器计数值)*返回参数:distance 测量距离(单位m/10^(-6)),精确到小数点后几位*距离公式:distance = plu*340/2 **************************************************//*long Distance_calculate(long plu){ distance = plu * 170 / 100 ;return distance; }*/ /***************************************************函数名: Handle_display *功能: 距离值转换成Ascall码 *输入参数:distance(十进制距离值)*返回参数:数组value_distance[0-8],value_distance[0-1]是十位和个位,value_distance[2]是小数点存放位置*value_distance[3-6]是4位小数位存放位置 **************************************************/void Handle_display(unsigned long plus){int i;long distance;distance = plus * 170 / 100 ;//dis = dis / 100; for(i=0;i<4;i++){value_distance[6-i] = distance % 10 + '0';distance = distance / 10;}value_distance[2] = 0x2E; //0x2e是小数点的Acall码for(i=0;i<2;i++){value_distance[1-i] = distance % 10 + '0';distance = distance / 10;}value_distance[7] = 'm'; //'m'的Acall码value_distance[8] = 0x0a; //换行符的Acall码value_distance[9] = '\0'; //换行符的Acall码 } /***************************************************函数名: Handle_display *功能: 打印计数值 *输入参数:plu(计数器计数值)*返回参数: **************************************************//*void Handle_display(unsigned long plus){int i; for(i=0;i<6;i++){value_distance[5-i] = plus % 10 + '0';plus = plus / 10;}value_distance[6] = 0x0a; //换行符的Acall码value_distance[7] = '\0'; //换行符的Acall码 } */ /************************************************** 延时处理程序 **************************************************/ void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 200; j > 0; j--) ;} /************************************************** 10us延时处理程序 **************************************************/ void delay_10us(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 2; j > 0; j--) ;}
测试结果如下:
0 0
- C51超声波测距试验
- 超声波测距
- 超声波测距
- 超声波测距
- 基于89C51单片机的超声波测距系统设计与制作
- MC9S12XS128实现超声波测距
- 超声波测距程序
- 超声波测距传感器
- 超声波测距程序
- 树莓派超声波测距实验
- 树莓派与超声波测距
- Arduino - 超声波测距
- HY-SRF05超声波测距
- arduino 超声波测距
- 超声波测距简介
- 超声波测距实验
- STM32超声波测距程序
- 超声波测距驱动
- jqgrid合并单元格
- 黑马程序员—反射与泛型
- 【b2c】商品自定义模型的研究就部分实现二
- basic exception handling
- 使用MongoDB作为Salt Pillar后端存储数据
- C51超声波测距试验
- As with almost
- cs229 斯坦福机器学习笔记(一)-- 入门与LR模型
- 一个事半功倍的c#方法 动态注册按钮事件
- freemarker写select组件报错总结(六)
- Google Protocol Buffer 的使用和原理
- Window8.1 64位无法使用Debug命令的解决方法[附牛人代码]
- jsp 自定义标签
- CentOS下安装Eclipse C++环境