找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1652|回复: 0
打印 上一主题 下一主题
收起左侧

单片机超声波测距LCD显示

[复制链接]
跳转到指定楼层
楼主
采用了HC-SR04模块和LCD1602模块
自己画的电路板
仅测量一次,不是动态测量。采用数组动态显示的方法显示数据
电路原理图如下:

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define Addr 0
  6. uchar ge,shi,num_1 = 0,flag =0,S2= 0;
  7. long time = 0,S = 0;
  8. float S1 = 0;
  9. char table []={"   . cm!         "};
  10. uchar code table1[]={"ce liang zhong! "};
  11. uchar table2 [] = {"distance        "};
  12. void        lcd_w_com(uchar com);
  13. sbit Echo = P2^1 ;
  14. sbit Trig = P2^2 ;
  15. sbit lcden = P2^5;
  16. sbit lcdrw = P2^6;
  17. sbit lcdrs = P2^7;
  18. void count()                                                                                //测量函数
  19. {
  20.         while(!Echo);                                                                        //当Echo为1,开始计时
  21.   TR0=1;
  22.   while(Echo);                                                                        //当Echo为0,关闭计时
  23.   TR0=0;
  24.   time=TH0*256+TL0;
  25.   TH0=0;
  26.   TL0=0;
  27.   S=(time*1.7)/100;                                                        //计算个十百位
  28.   S1=(time*1.7)/100;
  29.         S2 = (S1-S)*10;                                                         //浮点型减整型得到小数点后一位
  30. }        
  31. void delayms(xms)
  32. {
  33.         uint i,j;
  34.         for (i = xms; i > 0;i--)
  35.         for (j = 110; j > 0; j--);
  36. }

  37. void check()                                                                        //发射超声波
  38. {
  39.         Trig = 0;
  40.         Trig = 1;
  41.     _nop_();_nop_();_nop_();_nop_();_nop_();
  42.     _nop_();_nop_();_nop_();_nop_();_nop_();
  43.     _nop_();_nop_();_nop_();_nop_();_nop_();
  44.     _nop_();_nop_();_nop_();_nop_();_nop_();                                                                //延时20微秒
  45.         Trig = 0;
  46. }
  47. void Timer0_int()                                                                                                        //定时器初始化                                                         
  48. {
  49.         TMOD = 0x01;
  50.         TH0 = 0;
  51.         TL0 = 0;
  52.         TF0 = 0;                                                                                                        //中断溢出标志位
  53.         EA  = 1;                                                                                                        //中断总开关
  54.         ET0 = 1;
  55. }
  56. void lcd_init()                                                        //LCD初始化
  57. {
  58.         lcd_w_com(0x38);               
  59.         lcd_w_com(0x0c);
  60.         lcd_w_com(0x06);
  61.         lcd_w_com(0x01);
  62. }
  63. void lcd_w_com(uchar com)                                        //LCD写入命令
  64. {
  65.         lcdrs = 0;                                                //指令寄存
  66.         lcdrw = 0;                                                 //选择写
  67.         P0 = com;
  68.         delayms(5);
  69.         lcden = 1;
  70.         lcden = 0;
  71. }
  72. void lcd_w_date(uchar date)                                                //LCD写入数据
  73. {
  74.         lcdrs = 1;
  75.         lcdrw = 0;
  76.         P0 = date;
  77.         delayms(5);
  78.         lcden = 1;
  79.         lcden = 0;
  80. }
  81. void timer0() interrupt 1                                                        //中断函数,防止超时
  82. {
  83.         flag = 1;
  84. }
  85. void main()
  86. {
  87.                         uchar n,m;
  88.                         lcd_init();
  89.                         Timer0_int();
  90.                         Trig = 0;
  91.                         flag = 0;
  92.                         check();
  93.                         count();
  94.                         table[Addr] = S/100+0x30;
  95.                         table[Addr+1] = S/10%10+0x30;
  96.                         table[Addr+2] = S%10+0x30;
  97.                         table[Addr+4] = S2+0x30;
  98.                         lcd_w_com(0x80);                                                        //显示第一行
  99.                         for(n = 0;n < 16;n++)
  100.                         {
  101.                         lcd_w_date(table1[n]);
  102.                         delayms(100);
  103.                         }        
  104.                         lcd_w_com(0x80+0x40);                                //显示第二行
  105.                         for(m = 0;m < 16;m++)
  106.                         {
  107.                                 lcd_w_date(table[m]);
  108.                                 delayms(100);
  109.                         }
  110.                         lcd_w_com(0x80);
  111.                         for(n=0;n<16;n++)
  112.                         {
  113.                                 lcd_w_date(table2[n]);
  114.                                 delayms(100);
  115.                         }
  116.                         while(1);
  117. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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