用Keil5软件生成一个用C52单片机,超声波测距,要求:(1)测量距离范围0-3米,液晶显示距离信息(厘米),测量误差小于5%;(2)液晶显示内容及形式可以自定,但必须包括测量距离信息,设置警戒距离;动态更新测量结果,更新时间小于0.5秒; (3)通过按键设定警戒距离,当距离小于设定值,蜂鸣器报警;oled屏幕,鸣蜂器管脚:feng=p2^0;k1=p2^7;k2=p2^6;k3=p2^5;
时间: 2023-05-29 21:04:04 浏览: 91
基于51单片机设计的超声波测距keil软件源码+说明文档
5星 · 资源好评率100%
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit feng=P2^0; //蜂鸣器管脚
sbit k1=P2^7; //按键1管脚
sbit k2=P2^6; //按键2管脚
sbit k3=P2^5; //按键3管脚
uchar code table[]={"Distance(cm):"}; //液晶显示内容
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //写命令函数
{
P0=com;
RS=0;
RW=0;
EN=1;
delay(5);
EN=0;
}
void write_data(uchar date) //写数据函数
{
P0=date;
RS=1;
RW=0;
EN=1;
delay(5);
EN=0;
}
void init() //初始化函数
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
delay(5);
}
void display(uchar addr,uchar *str) //显示函数
{
write_com(addr);
while(*str!='\0')
{
write_data(*str++);
}
}
void delayus(uint z) //微秒级延时函数
{
while(z--);
}
uint distance() //测距函数
{
uint dis;
uchar i;
for(i=0;i<8;i++) //先发送8个脉冲
{
P1=0x55;
delayus(10);
P1=0;
delayus(10);
}
while(!P1); //等待Echo高电平
TH0=0;
TL0=0;
while(P1); //等待Echo低电平
dis=TH0*256+TL0;
return dis/58; //计算距离
}
void main()
{
uint dis;
uchar s[16];
TMOD=0x09; //定时器0工作方式1
TH0=0;
TL0=0;
ET0=1; //开定时器0中断
EA=1; //开总中断
TR0=1; //启动定时器0
init(); //初始化液晶
display(0x80,table); //显示距离信息
while(1)
{
dis=distance(); //测距
if(dis<300) //判断是否超出测量范围
{
display(0x8f,sprintf(s,"%d",dis)); //显示距离
if(dis<k1) //判断是否小于警戒距离
{
feng=1; //蜂鸣器报警
}
else
{
feng=0;
}
}
delay(100); //延时100ms后再次测距
}
}
void timer0() interrupt 1 //定时器0中断函数
{
TH0=0;
TL0=0;
}
阅读全文