资讯详情

51单片机驱动超声波测距模块C51程序

#include<reg52.h>#define  uchar unsigned char#define  uint  unsigned int#define  ulong unsigned long //******************* 函数声明************************** void init_Total(); //总初始化 void init_T0();    //初始化定时器T0 void init_T1();    //初始化定时器T1 void init_inter0();//初始化外部中断1 void send_T(); void delay(uint z);//延时一段时间 void delay_300us();//延时300us void delay_100us();//延时100us  //********************************************************  sbit  lcdrs=P1^7;sbit  lcdrw=P3^1;sbit  lcden=P1^5;//1602液晶控制端sbit  send=P1^0;//sbit BEEP=P2^5;sbit wei=P2^6;sbit duan=P2^7;volatile uchar Count_TH ,Count_TL;//分别读计数器T1的高位TH1,低位TL1  uchar t0,flag;uint time;uchar code table1[]=" distance       ";uchar code table2[]="                ";//初始化显示 void write_com(uchar com)//1602写指令 函数{    lcdrs=0;    P0=com;    delay(5);    lcden=1;    delay(5);    lcden=0;        }void write_data(uchar datb)//1602写数据 函数{    lcdrs=1;    P0=datb;    delay(1);    lcden=1;    delay(1);    lcden=0;        }  void distance(uchar addr,uint datb)     {    uchar bai,shi,ge ;        bai=datb/100;        shi=datb%100/10;        ge=datb%10;     write_com(0x80+0x40+addr);    write_data(0x30+bai);       write_data(0x30+shi);       write_data(0x30+ge);}  /************************************************************************************** * 名        称 :void init_Total() * 功        能 :总初始化 * 入 口 参  数 :NULL * 全 局 变  量 :NULL   * 返   回   值 :NULL **************************************************************************************/ void init_Total() {     init_T0();    //初始化定时器T0为工作方式2     init_T1();   //初始化定时器T1为工作方式1     init_inter0();//初始化外部中断1     EA=1;   //开总中断 } /************************************************************************************** * 名        称 :void init_T0() * 功        能 :初始化定时器T0为工作方式2 * 入 口 参  数 :NULL * 全 局 变  量 :NULL   * 返   回   值 :NULL **************************************************************************************/void init_T0() {     TMOD=0X12;     TH0=0XE7;     TL0=0XE7;     EA=0;     ET0=1;     TR0=1; } /************************************************************************************** * 名        称 :void init_T1() * 功        能 :初始化定时器T1为工作方式1 * 入 口 参  数 :NULL * 全 局 变  量 :NULL   * 返   回   值 :NULL **************************************************************************************/ void init_T1() {     TMOD=0X12;     TH1=0;     TL1=0;     EA=0;     ET1=1;     TR1=1; } /************************************************************************************** * 名        称 :void init_inter1() * 功        能 :初始化外部中断1为低电平触发方式 * 入 口 参  数 :NULL * 全 局 变  量 :NULL   * 返   回   值 :NULL **************************************************************************************/void init_inter0() {     IT0=0; //低电平触发     EA=0;     EX0=0;      //关外部中断1   } /************************************************************************************** * 名        称 :void inter_T0() interrupt 1 * 功        能 :定时器T0中断函数产生40KHZ的方波 * 入 口 参  数 :NULL * 全 局 变  量 :NULL   * 返   回   值 :NULL **************************************************************************************/void inter_T0() interrupt 1 {     send=~send; }  /************************************************************************************** * 名        称 :void inter_T1() interrupt 3 * 功        能 :定时器T1中断函数 * 入 口 参  数 :NULL * 全 局 变  量 :NULL   * 返   回   值 :NULL **************************************************************************************/void inter_T1() interrupt 3 {     TR1=0;     EX0=0;  //关外部中断0     TH1=0;     TL1=0;     flag=2; } /************************************************************************************** * 名        称 :void inter1() interrupt 2 * 功        能 :外部中断1函数 * 入 口 参  数 :NULL * 全 局 变  量 :Count_TH,Count_TL   * 返   回   值 :NULL **************************************************************************************/void inter0() interrupt 0{     TR1=0;     EX0=0;     flag=1;      } /************************************************************************************** * 名        称 :void send_T()  * 功        能 :发送10个超声波脉冲 * 入 口 参  数 :NULL * 全 局 变  量 :Count * 返   回   值 :NULL **************************************************************************************/void send_T()     {     delay_100us();//发送100us的方波     TR0=0;//关定时器T0 }  /************************************************************************************** * 名        称 :void delay(uint z) * 功        能 :延时一段时间 * 入 口 参  数 :z * 全 局 变  量 :NULL * 返   回   值 :NULL **************************************************************************************/ void delay(uint z) {     uint x,y;     for(x=z;x>0;x--)     for(y=1000;y>0;y--); }  /************************************************************************************** * 名        称 :void delay_300us() * 功        能 :延时300us * 入 口 参  数 :NULL * 全 局 变  量 :NULL * 返   回   值 :NULL **************************************************************************************/void delay_300us() {     uint x;     for(x=75;x>0;x--); }  /************************************************************************************** * 名        称 :void delay_100us() * 功        能 :延时100us * 入 口 参  数 :NULL * 全 局 变  量 :NULL * 返   回   值 :NULL **************************************************************************************/void delay_100us() {     uint x;     for(x=24;x>0;x--); }     //*************************************************************************************** void main()  {    uint t,s;   init_Total();//总初始化    while(1)   {       TR1=1;//启动定时器1     TR0=1;//启动定时器0      send_T();     //发送100us超声波脉冲     delay_300us();//延时300us跳过盲区      EX1=1;        //开外部中断1     while(!flag); //等待回波或定时器T1溢出     if(flag==1)   //回波     {         Count_TH=TH1;//读计数器T1的高位TH1         Count_TL=TL1;//读计数器T1的低位TL1          t=Count_TH*256+Count_TL;         s=(33140*t)/400000;          distance(4,s);//液晶1602显示距离     }             /*    else   //定时器T1溢出     {         Count_TH=0XFE;         Count_TL=0X7F;         // P2=Count_TH;         P2=Count_TL;      }     */    delay(150);      flag=0;//标志位清0     TH1=0; //T1清0重新计时     TL1=0;    } } 
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台