#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;
}
}
评论0