#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; } }