找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5047|回复: 5
收起左侧

超声波测距Proteus仿真,带lcd显示,功能简单,单片机程序也简单

  [复制链接]
ID:362094 发表于 2019-7-2 09:53 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
捕获.PNG 51hei.gif

单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uint  unsigned int
#define uchar unsigned char
#define NOP() {_nop_();_nop_();_nop_();_nop_();}
//------LCD引脚-----
sbit lcd_rs=P0^6;
sbit lcd_en=P0^7;
//------超声波引脚-------
sbit Tx=P3^3;  //触发控制信号输入
sbit Rx=P3^2;  //回响信号输出
uchar xuehao[]={"ID:1606050220"};
uchar xingming[]={"NAME:zhoujikai"};
uchar code table[]={" Distance Test:"};  //LCD第一行显示
uchar temp_dis[]= {"    000.0 cm"};    //LCD第二行
long int t,distance;
uchar cache[4]={0,0,0,0};
//--------延时-------
void delay(uint ms)
{
uint t;
while(ms--)
  for(t=0;t<120;t++);
}
void write_com(uchar com);//init_lcd()函数需要用到,所以先提前声明
//************LCD1602初始化函数************************
void init_lcd()
{
write_com(0x38);    //设置16*2显示,5*7点阵,8位数据接口
write_com(0x08);    //写一个字符后地址指针加1
write_com(0x01);    //显示清零,数据指针清零
write_com(0x06);    //写一个字符后地址指针加1
write_com(0x0c);    //关显示,光标不显示不闪烁
}

//************LCD1602写指令函数************************
void write_com(uchar com)   //lcd1602写指令:rs低电平,rw低电平,en从高电平变为低电平
{
delay(5);
lcd_rs = 0;      // 选择写指令
lcd_en = 0;      // 将使能端置0
P2 = com;      // 将要写的命令送到数据总线上
delay(5);      // 延时5ms,待数据稳定
lcd_en = 1;      // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,
delay(5);      // 延时5ms,待数据稳定
lcd_en = 0;      // 将使能端置0以完成脉冲
}

//************LCD1602写数据函数************************
void write_data(uchar date)//lcd1602写数据:rs高电平,rw低电平,en从高电平变低电平
{
delay(5);
lcd_rs = 1;      // 选择写数据
lcd_en = 0;      // 将使能端置0
P2 = date;      // 将要写的数据送到数据总线上
delay(5);      // 延时5ms,待数据稳定
lcd_en = 1;      // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,
delay(5);      // 延时5ms,待数据稳定
lcd_en = 0;      // 将使能端置0以完成脉冲
}
//************LCD1602显示函数******************
void lcd1602_display(uchar *q,uchar *p)//*通过指针p和q分别指向两个数组的第一个数,然后进行数组扫描显示,一次性显示两行字符
{
write_com(0x80);      // 现将数据指针定位到第一行第一个字处
while(*q!='\0')
{
  write_data(*q);
  q++;
  delay(1);
}
write_com(0xc0);    // 现将数据指针定位到第二行第一个字处
while(*p!='\0')
{
  write_data(*p);
  p++;
  delay(1);
}
}
//************LCD1602显示欢迎函数******************
void welcome()        //扫描显示学号加姓名,几秒延时后结束
{
init_lcd();
lcd1602_display(xuehao,xingming);
delay(2000);   
}
void HC05_Init()                          //超声波模块初始化函数
{
Tx=1;      //触发脉冲
NOP();NOP();NOP();NOP();
Tx=0;
distance=0.172*t;   //距离计算
}
void distance_convert(long int dat)             //距离计算函数
{
cache[0]=dat/1000;
cache[1]=dat/100%10;
cache[2]=dat/10%10;
cache[3]=dat%10;
temp_dis[4]=cache[0]+'0';
temp_dis[5]=cache[1]+'0';
temp_dis[6]=cache[2]+'0';
temp_dis[8]=cache[3]+'0';
}
//------------主程序-----------
void main()
{

      
        welcome();
        
        init_lcd();
        delay(5);
TMOD=0x09;        //定时器T0工作方式1  GATE0=1
EA=1;   //开总中断
TR0=1;   //启动定时器
EX0=1;   //开外部中断
IT0=1;   //设置为下降沿中断方式
while(1)
{
  HC05_Init();
  distance_convert(distance);
  lcd1602_display(table,temp_dis);  
  
}
}
//外部中断0
void int0() interrupt 0
{
t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
TH0=0;
TL0=0;
}

0.png
代码很简单,lcd显示屏直接修改程序就能显示

全部资料51hei下载地址:
超声波测距二代2.rar (31.12 KB, 下载次数: 205)
回复

使用道具 举报

ID:243394 发表于 2019-7-12 12:31 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:328380 发表于 2020-6-27 21:54 | 显示全部楼层
楼主,你这个protues是哪个版本的?
回复

使用道具 举报

ID:794020 发表于 2020-6-30 17:17 来自手机 | 显示全部楼层
博主,为什么在proteus里找不到SR04
回复

使用道具 举报

ID:912079 发表于 2021-4-29 18:13 来自手机 | 显示全部楼层
楼主牛逼,竟然仿真出来了
回复

使用道具 举报

ID:971249 发表于 2022-4-10 14:44 | 显示全部楼层
Proteus仿真需要用8.8版本来打开,里面有程序,如图2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表