新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機驅動超聲波測距模塊C51程序

        51單片機驅動超聲波測距模塊C51程序

        作者: 時間:2016-11-30 來源:網絡 收藏
        #include
        #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;  //關外部中斷0TH1=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;  } } 


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 朝阳区| 子长县| 兰考县| 仁布县| 舒兰市| 冕宁县| 乌拉特后旗| 博乐市| 宁陵县| 马边| 淮北市| 张家界市| 连州市| 隆安县| 广饶县| 增城市| 简阳市| 广东省| 桐梓县| 盐津县| 盐亭县| 弋阳县| 吴川市| 曲阳县| 和硕县| 宝丰县| 奇台县| 霍邱县| 元阳县| 曲阳县| 南雄市| 军事| 苍山县| 承德县| 宁津县| 平阴县| 江安县| 南江县| 南开区| 景东| 房山区|