标题:
基于51单片机的超声波测距设计程序+Proteus仿真图
[打印本页]
作者:
hei0
时间:
2018-7-3 17:57
标题:
基于51单片机的超声波测距设计程序+Proteus仿真图
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
(96.68 KB, 下载次数: 57)
下载附件
2022-3-23 22:08 上传
单片机源程序如下:
#include<reg52.h>
#include<intrins.h> //声明void _nop_(void);
#defineuint unsigned int
#defineuchar unsigned char
#defineNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit PL=P1^0;
//------LCD引脚-----
sbit LCD_RS=P2^6; //将P2.6引脚定义为LCD寄存器选择
sbitLCD_RW=P2^5; //将P2.5引脚定义为LCD读写信号线
sbitLCD_EN=P2^7; //将P2.7引脚定义为LCD使能端
//------超声波引脚-------
sbitTx=P3^3; //触发控制信号输入
sbit Rx=P3^2; //回响信号输出
ucharcode table[]={"Distance Test:"}; //LCD第一行显示
uchartemp_dis[]= {"000.0 cm"}; //LCD第二行
longint t,distance;
ucharcache[4]={0,0,0,0};
//--------延时-------
voiddelay(uint ms)
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
//-------读LCD状态-------
ucharread_lcd_state()
{
uchar state;
LCD_RS=0; //LCD选择指令寄存器
LCD_RW=1; //LCD进行读操作
LCD_EN=1; //LCD使能端为高电平
_nop_(); // 产生一条NOP指令
state=P0;
LCD_EN=0; //LCD使能端为低电平
_nop_();
returnstate; //返回函数
}
//-------忙等待------
voidlcd_busy_wait()
{
while((read_lcd_state() &0x80)==0x80);
NOP();
}
//----------LCD写指令----------
voidlcd_write_com(uchar com)
{
lcd_busy_wait();
LCD_RS=0; //RS为0时,写指令,RS为1时,写数据
LCD_RW=0; //LCD进行写操作
P0=com; //把命令字送入P0
NOP(); //延时一个机器周期1us
LCD_EN=1;
NOP();
LCD_EN=0;
}
//----------LCD写数据----------
voidlcd_write_data(uchar dat)
{
lcd_busy_wait();
LCD_RS=1;
LCD_RW=0;
P0=dat; //把要显示的数据送入P0
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
}
//-------LCD初始化-------
voidlcd_init()
{
LCD_EN=0;
lcd_write_com(0x38); //LCD显示模式设置
lcd_write_com(0x0c); //LCD显示开/关及光标设置
lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1
lcd_write_com(0x01); //显示清屏
}
//---------设置液晶显示位置-----------
voidset_lcd_pos(uchar p)
{
lcd_write_com(p|0x80);
}
//---------液晶显示程序----------
voidlcd_print(uchar p,uchar *s,uint low)
{
uint num;
set_lcd_pos(p);
for(num=0;num<low;num++)
{
lcd_write_data(s[num]);
delay(1);
}
}
voidHC05_Init()
{
Tx=1; //触发脉冲
NOP();NOP();NOP();NOP();
Tx=0;
distance=0.1725*t; //距离计算
}
voiddistance_convert(long int dat)
{
cache[0]=dat/1000;
cache[1]=dat/100%10;
cache[2]=dat/10%10;
cache[3]=dat%10;
temp_dis[0]=cache[0]+'0';
temp_dis[1]=cache[1]+'0';
temp_dis[2]=cache[2]+'0';
temp_dis[4]=cache[3]+'0';
}
//------------主程序-----------
voidmain()
{
PL=1;
delay(20);
PL=1;
delay(1000);
PL=0;
lcd_init();
delay(5);
TMOD=0x19;
EA=1; //开总中断
TR0=1; //启动定时器
EX0=1; //开外部中断
IT0=1; //设置为下降沿中断方式
while(1)
{
HC05_Init();
distance_convert(distance);
lcd_print(0x01,table,14);
lcd_print(0x44,temp_dis,8);
}
}
//外部中断0
voidint0() interrupt 0
{
t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
TH0=0;
TL0=0;
}
复制代码
51hei.png
(13.39 KB, 下载次数: 58)
下载附件
2022-3-23 22:08 上传
Keil代码与Proteus仿真下载:
基于单片机超声波测距系统 语音提示 程序hex 原理图.zip
(60.45 KB, 下载次数: 163)
2018-7-3 17:57 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
qazedctgb
时间:
2022-3-23 15:30
作者你好图呢
作者:
dududula
时间:
2022-4-3 15:19
你好,请教一下,这个可以通过修改程序,连接两个超声波传感器测两个距离,然后用垂直距离比上两个水平距离之差,从而求出坡度吗? 坡度也在1602上显示出来
作者:
dududula
时间:
2022-4-3 16:09
请问36行的返回函数是没有的吗?为什么编译程序一直出错呢?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1