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
原创粉丝点击