代码不错,值得学习借鉴
#include <reg52.h>
#include <intrins.H>
#include "LCD1602.H"
#define uint unsigned int
#define uchar unsigned char
sbit KEY1=P2^4;
sbit KEY2=P2^5;
sbit KEY3=P2^6;
sbit BEEP=P1^0;
sbit Trig=P3^3;
sbit Echo=P3^2;
float distance;
uint R_distance;
uint time;
uint SetH;
uint SetL;
uint temp_DATA[5];
uchar flag_yichu;
code uchar tab_A[]={'0','1','2','3','4','5','6','7','8','9',' ',};
unsigned char Dist_data[4]={' ',' ',' ',};
unsigned char SetHL[]={'L',':',' ',' ',' ','C','M',' ',' ','H',':',' ',' ',' ','C','M',};
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
distance=time*0.017; //算出来是CM
R_distance=distance;
}
/***********************启动超声波*********************************/
void StartModule() //
{
Trig=1; //超声波触发端每次触发高电平持续时间大于10us
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
Trig=0;
}
/*定时器0中断子程序*/
void tm0_isr() interrupt 1 using 1
{
flag_yichu=1;
}
void SetH_count(void)
{
BEEP=0;
if(SetH>=100)
{
SetHL[11]=tab_A[SetH/100];
SetHL[12]=tab_A[(SetH/10)%10];
SetHL[13]=tab_A[SetH%10];
}
else if((SetH>=10)&&(SetH<100))
{
SetHL[11]=tab_A[10];
SetHL[12]=tab_A[(SetH/10)%10];
SetHL[13]=tab_A[SetH%10];
}
else if(SetH<10)
{
SetHL[11]=tab_A[10];
SetHL[12]=tab_A[10];
SetHL[13]=tab_A[SetH%10];
}
LCD1602_PutStr(0,1,SetHL);
halMcuWaitUs(2000);
BEEP=1;
}
void SetL_count(void)
{
BEEP=0;
if(SetL>=100)
{
SetHL[2]=tab_A[SetL/100];
SetHL[3]=tab_A[(SetL/10)%10];
SetHL[4]=tab_A[SetL%10];
}
else if((SetL>=10)&&(SetL<100))
{
SetHL[2]=tab_A[10];
SetHL[3]=tab_A[(SetL/10)%10];
SetHL[4]=tab_A[SetL%10];
}
else if(SetL<10)
{
SetHL[2]=tab_A[10];
SetHL[3]=tab_A[10];
SetHL[4]=tab_A[SetL%10];
}
LCD1602_PutStr(0,1,SetHL);
halMcuWaitUs(2000);
BEEP=1;
}
void Dist_data_count(void)
{
if(R_distance>=100)
{
Dist_data[0]=tab_A[(R_distance/100)%10];
Dist_data[1]=tab_A[(R_distance/10)%10];
Dist_data[2]=tab_A[R_distance%10];
}
else if((R_distance>=10)&&(R_distance<100))
{
Dist_data[0]=tab_A[10];
Dist_data[1]=tab_A[(R_distance/10)%10];
Dist_data[2]=tab_A[R_distance%10];
}
else if(R_distance<10)
{
Dist_data[0]=tab_A[10];
Dist_data[1]=tab_A[10];
Dist_data[2]=tab_A[R_distance%10];
}
LCD1602_PutStr(8,0,Dist_data);
halMcuWaitUs(2000);
}
void main(void)
{
uint i,k;
uchar flag;
flag=1;
SetH=200;
SetL=10;
BEEP=0;
//while(1);
halMcuWaitUs(5000);
BEEP=1;
P1=0Xff;
P2=0Xff;
TMOD = 0x01; //定时器0设置为16为手动赋值模式
TL0 = 0; //初始化定时器0初值低八位
TH0 = 0; //初始化定时器0高八位
TR0 = 0; //关闭定时器0
ET0 = 1; //允许定时器0产生中断
EA = 1; //开启全局中断
//count = 0; //初始化计数器
LCD1602_Init(); //初始化LCD1602
LCD1602_PutStr(0,0," Dista: CM ");
LCD1602_PutStr(0,1,"L: H: ");
halMcuWaitUs(1000);
SetL_count();
SetH_count();
while(1)
{
StartModule();
while(!Echo); //当Echo为零时等待
TR0=1; //开启计时
while(Echo); //当Echo为高电平计数并等待
TR0=0; //关闭计时
Conut(); //计算距离
halMcuWaitUs(50);
Dist_data_count();
for(k=0;k<20;k++)
{
if(distance>SetH)
{
BEEP=0;
}
else if(distance<SetL)
{
BEEP=0;
}
else
{
BEEP=1;
}
if(KEY1==0)
{
halMcuWaitUs(50);
if(KEY1==0)
{
flag=~flag;
BEEP=0;
halMcuWaitUs(2000);
BEEP=1;
}
while(KEY1==0);
}
if(flag>10)
{
if(KEY2==0)
{
halMcuWaitUs(50);
if(KEY2==0)
{
if(SetH<900) SetH++;
else SetH=900;
SetH_count();
}
i=0;
do
{
i++;
halMcuWaitUs(2000);
if(i>50)
{
if(SetH<900) SetH++;
else SetH=900;
SetH_count();
}
}
while(KEY2==0);
while(KEY2==0);
}
else if(KEY3==0)
{
halMcuWaitUs(50);
if(KEY3==0)
{
if(SetH>0) SetH--;
else SetH=0 ;
SetH_count();
}
i=0;
do
{
i++;
halMcuWaitUs(2000);
if(i>50)
{
if(SetH>0) SetH--;
else SetH=0 ;
SetH_count();
}
}
while(KEY3==0);
while(KEY3==0);
}
}
else
{
if(KEY2==0)
{
halMcuWaitUs(50);
if(KEY2==0)
{
if(SetL<900) SetL++;
else SetL=900;
SetL_count();
}
i=0;
do
{
i++;
halMcuWaitUs(2000);
if(i>50)
{
i=51;
if(SetL<900) SetL++;
else SetL=900;
SetL_count();
}
}
while(KEY2==0);
while(KEY2==0);
}
else if(KEY3==0)
{
halMcuWaitUs(50);
if(KEY3==0)
{
if(SetL>0) SetL--;
else SetL=0 ;
SetL_count();
}
i=0;
do
{
i++;
halMcuWaitUs(2000);
if(i>50)
{
i=51;
if(SetL>0) SetL--;
else SetL=0 ;
BEEP=0;
SetL_count();
}
}
while(KEY3==0);
while(KEY3==0);
}
}
}
}
}
来源:http://dayatubbs.com/thread-13938-1-1.html
如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!
txttool.com 说一段 esp56物联 查询128 IP查询