找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5190|回复: 6
收起左侧

单片机超声波测距Proteus仿真代码,LCD1602显示

  [复制链接]
ID:893682 发表于 2021-5-6 20:16 | 显示全部楼层 |阅读模式
超声波测距仿真,LCD1602显示带程序

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真图.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint  unsigned int
  4. #define uchar unsigned char
  5. #define NOP() {_nop_();_nop_();_nop_();_nop_();}
  6. //------LCD引脚-----
  7. sbit lcd_rs=P0^6;

  8. sbit lcd_en=P0^7;
  9. //------超声波引脚-------
  10. sbit Tx=P3^3;                //触发控制信号输入
  11. sbit Rx=P3^2;                //回响信号输出
  12. uchar xuehao[]={"   17110201138  "};
  13. uchar xingming[]={"NAME:zhaolongda"};
  14. uchar code table[]={" Distance Test:"};                //LCD第一行显示
  15. uchar temp_dis[]= {"    000.0 cm"};                                //LCD第二行
  16. long int t,distance;
  17. uchar cache[4]={0,0,0,0};
  18. //--------延时-------
  19. void delay(uint ms)
  20. {
  21.         uint t;
  22.         while(ms--)
  23.                 for(t=0;t<30;t++);
  24. }
  25. void write_com(uchar com);//init_lcd()函数需要用到,所以先提前声明
  26. //************LCD1602初始化函数************************
  27. void init_lcd()
  28. {
  29.         write_com(0x38);           //设置16*2显示,5*7点阵,8位数据接口
  30.         write_com(0x08);           //写一个字符后地址指针加1
  31.         write_com(0x01);           //显示清零,数据指针清零
  32.         write_com(0x06);           //写一个字符后地址指针加1
  33.         write_com(0x0c);           //关显示,光标不显示不闪烁
  34. }


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


  47. //************LCD1602写数据函数************************
  48. void write_data(uchar date)//lcd1602写数据:rs高电平,rw低电平,en从高电平变低电平
  49. {
  50.         delay(5);
  51.         lcd_rs = 1;                           // 选择写数据
  52.         lcd_en = 0;                           // 将使能端置0
  53.         P2 = date;                           // 将要写的数据送到数据总线上
  54.         delay(5);                           // 延时5ms,待数据稳定
  55.         lcd_en = 1;                           // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,
  56.         delay(5);                           // 延时5ms,待数据稳定
  57.         lcd_en = 0;                           // 将使能端置0以完成脉冲
  58. }

  59. //************LCD1602显示函数******************
  60. void lcd1602_display(uchar *q,uchar *p)//*通过指针p和q分别指向两个数组的第一个数,然后进行数组扫描显示,一次性显示两行字符
  61. {
  62.         write_com(0x80);             // 现将数据指针定位到第一行第一个字处
  63.         while(*q!='\0')
  64.         {
  65.                 write_data(*q);
  66.                 q++;
  67.                 delay(1);       
  68.         }
  69.         write_com(0xc0);           // 现将数据指针定位到第二行第一个字处
  70.         while(*p!='\0')
  71.         {
  72.                 write_data(*p);
  73.                 p++;
  74.                 delay(1);       
  75.         }
  76. }

  77. //************LCD1602显示欢迎函数******************
  78. void welcome()        //扫描显示学号加姓名,几秒延时后结束
  79. {       
  80.         init_lcd();
  81.         lcd1602_display(xuehao,xingming);
  82.         delay(200);          

  83. }
  84. void HC05_Init()                          //超声波模块初始化函数
  85. {
  86.         Tx=1;                                                //触发脉冲
  87.         NOP();NOP();NOP();NOP();
  88.         Tx=0;
  89.         distance=0.1725*t;                        //距离计算
  90. }
  91. void distance_convert(long int dat)             //距离计算函数
  92. {
  93.         cache[0]=dat/1000;
  94.         cache[1]=dat/100%10;
  95.         cache[2]=dat/10%10;
  96.         cache[3]=dat%10;
  97.         temp_dis[4]=cache[0]+'0';
  98.         temp_dis[5]=cache[1]+'0';
  99.         temp_dis[6]=cache[2]+'0';
  100.         temp_dis[8]=cache[3]+'0';
  101. }
  102. //------------主程序-----------
  103. void main()
  104. {
  105.        
  106.       
  107.         welcome();
  108.         
  109.         init_lcd();
  110.         delay(5);
  111.         TMOD=0x09;        //定时器T0工作方式1  GATE0=1
  112.         EA=1;                        //开总中断
  113.         TR0=1;                        //启动定时器
  114.         EX0=1;                        //开外部中断
  115.         IT0=1;                        //设置为下降沿中断方式
  116.         while(1)
  117.         {
  118.                 HC05_Init();
  119.                 distance_convert(distance);
  120.                 lcd1602_display(table,temp_dis);  
  121.                
  122.         }
  123. }
  124. //外部中断0
  125. void int0() interrupt 0
  126. {
  127.         t=(TH0*256+TL0);        //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
  128.         TH0=0;
  129.         TL0=0;
  130. }
复制代码
51hei.png
所有资料51hei提供下载:
超声波测距仿真.zip (90.57 KB, 下载次数: 420)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:922968 发表于 2021-5-18 13:10 | 显示全部楼层
程序有误,1602读写命令错了
回复

使用道具 举报

ID:112693 发表于 2021-10-2 18:07 | 显示全部楼层
下载程序中,仿真报错啊
回复

使用道具 举报

ID:262 发表于 2021-10-3 02:13 | 显示全部楼层
dragon19790000 发表于 2021-10-2 18:07
下载程序中,仿真报错啊

我用Proteus8.8打开,双击单片机重新选择hex文件,可以运行呢
51hei.png
回复

使用道具 举报

ID:838572 发表于 2021-11-29 16:55 | 显示全部楼层
很好的资源,准备去试一试。
回复

使用道具 举报

ID:1027882 发表于 2022-5-22 01:19 | 显示全部楼层
刚下载,明天好好研究
回复

使用道具 举报

ID:1058494 发表于 2022-12-20 21:16 | 显示全部楼层
刚下载准备试试看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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