找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波模块测距+1602显示

[复制链接]
ID:87624 发表于 2015-8-8 07:21 | 显示全部楼层 |阅读模式
超声波模块测距+1602显示.,,,基于此程+轴流风机已完美做出风洞

0.png

单片机源程序:
  1. #include<reg52.h>

  2. #include <intrins.h>

  3. #define uint unsigned int

  4. #define uchar unsigned char


  5. sbit in=P3^3;          //超声波接收口
  6. sbit out=P3^4;          //超声波发射口


  7. //LCD1602端口定义

  8. sbit RS=P2^6;          //寄存器选择位,将RS位定义为P2.0引脚           //1602引脚定义
  9. sbit RW=P2^5;          //读写选择位,将RW位定义为P2.1引脚
  10. sbit E=P2^7;           //使能信号位,将E位定义为P2.2引脚
  11.          
  12. #define LCD1602data P0 //1602数据口接单片机P1口


  13. uint time;
  14. unsigned long s=0;
  15. bit flag; //超声波超出测量范围标志位
  16. uint s1,s2,s3;



  17. /*****************************************************
  18. 以下为1602模块语句
  19. ***************************************************/


  20. /*****************************************************
  21. 函数功能:延时1ms
  22. ***************************************************/
  23. void delay1ms()
  24. {
  25.            unsigned char i,j;       
  26.         for(i=0;i<10;i++)
  27.         for(j=0;j<33;j++);                 
  28. }
  29. /*****************************************************
  30. 函数功能:延时若干毫秒
  31. 入口参数:n
  32. ***************************************************/
  33. void delay(unsigned int n)
  34. {
  35.            unsigned int i;
  36.         for(i=0;i<n;i++)
  37.         delay1ms();
  38. }
  39. /*****************************************************
  40. 函数功能:判断液晶模块的忙碌状态
  41. 返回值:result。result=1,忙碌;result=0,不忙
  42. ***************************************************/
  43. bit BusyTest(void)
  44.   {
  45.             bit result;
  46.         RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
  47.             RW=1;
  48.             E=1;        //E=1,才允许读写
  49.             _nop_();   //空操作
  50.             _nop_();
  51.             _nop_();
  52.            _nop_();   //空操作四个机器周期,给硬件反应时间       

  53.         E=0;
  54.             return result;
  55.   }
  56. /*****************************************************
  57. 函数功能:将模式设置指令或显示地址写入液晶模块
  58. 入口参数:dictate
  59. ***************************************************/
  60. void Write_com (unsigned char dictate)
  61. {   
  62.     while(BusyTest()==1); //如果忙就等待
  63.          RS=0;            //根据规定,RS和R/W同时为低电平时,可以写入指令
  64.          RW=0;   
  65.          E=0;             //E置低电平(写指令时,
  66.                           // 就是让E从0到1发生正跳变,所以应先置"0"
  67.          _nop_();
  68.          _nop_();         //空操作两个机器周期,给硬件反应时间
  69.          LCD1602data=dictate;//将数据送入P0口,即写入指令或地址
  70.          _nop_();
  71.          _nop_();
  72.          _nop_();
  73.          _nop_();         //空操作四个机器周期,给硬件反应时间
  74.          E=1;             //E置高电平
  75.          _nop_();
  76.          _nop_();
  77.          _nop_();
  78.          _nop_();         //空操作四个机器周期,给硬件反应时间
  79.           E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
  80. }
  81. /*****************************************************
  82. 函数功能:指定字符显示的实际地址
  83. 入口参数:x
  84. ***************************************************/
  85. void WriteAddress(unsigned char x)
  86. {
  87.      Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"       
  88. }
  89. /*****************************************************
  90. 函数功能:将数据(字符的标准ASCII码)写入液晶模块
  91. 入口参数:y(为字符常量)
  92. ***************************************************/
  93. void WriteData(unsigned char y)
  94. {
  95.     while(BusyTest()==1);  
  96.           RS=1;           //RS为高电平,RW为低电平时,可以写入数据
  97.           RW=0;
  98.           E=0;            //E置低电平(写指令时,,
  99.                        // 就是让E从0到1发生正跳变,所以应先置"0"
  100.           LCD1602data=y;  //将数据送入P0口,即将数据写入液晶模块
  101.           _nop_();
  102.           _nop_();
  103.           _nop_();
  104.               _nop_();       //空操作四个机器周期,给硬件反应时间
  105.           E=1;          //E置高电平
  106.           _nop_();
  107.           _nop_();
  108.           _nop_();
  109.           _nop_();        //空操作四个机器周期,给硬件反应时间
  110.           E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
  111. }
  112. /*****************************************************
  113. 函数功能:对LCD的显示模式进行初始化设置
  114. ***************************************************/
  115. void LcdInt(void)
  116. {
  117.            delay(15);      //延时15ms,首次写指令时应给LCD一段较长的反应时间
  118.            Write_com(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
  119.         delay(5);   //延时5ms 
  120.         Write_com(0x38);
  121.         delay(5);
  122.         Write_com(0x38); //3次写 设置模式
  123.         delay(5);
  124. //        Write_com(0x0F);  //显示模式设置:显示开,有光标,光标闪烁
  125. //        delay(5);

  126.         Write_com(0x0c);  //显示模式设置:显示开,不显示光标
  127.         delay(5);

  128.         Write_com(0x06);  //显示模式设置:光标右移,字符不移
  129.         delay(5);                                                                                          
  130.         Write_com(0x01);  //清屏幕指令,将以前的显示内容清除
  131.         delay(5);
  132. }

  133. //add为显示字符的位置(在第二行显示)//x为显示的字符
  134. //调用此函数请注意:此函数是为显示数字的,display(10,9);display(10,a);
  135. //分别表示第二行第十位显示数字9和a代表的数字
  136. //如果想把此函数改写成显示字母的,
  137. //只需把最后WriteData(0x30+x);中的
  138. // 0x30+ 去掉即可,调用时注意格式  display(10,'a');
  139. display(unsigned char add,unsigned char x)            
  140. {                                         
  141.                        

  142.                  WriteAddress(0x00);
  143.                                                                                                                                                                                
  144.                  delay(5);

  145.                  Write_com(0x80+0x40+add);

  146.                  WriteData(0x30+x);
  147. }



  148. LCD1602()//1602初显示
  149. {
  150.        

  151.               LcdInt();         //调用LCD初始化函数  
  152.           delay(10);
  153.               Write_com(0x01);                //清屏

  154.                   delay(5);

  155.                   WriteAddress(0x00);
  156. //设置显示位置为第一行第一个字,这条语句可以不用写,因为默认是从第一行第一个字显示                                                                                                                                                                               
  157.                   delay(5);
  158. //第一行显示 DISTANCE:   
  159.                   WriteData('D');
  160.               WriteData('I');
  161.                   WriteData('S');
  162.                   WriteData('T');
  163.                   WriteData('A');       
  164.                   WriteData('N');       
  165.                   WriteData('C');       
  166.                   WriteData('E');       
  167.                   WriteData(':');
  168. }



  169. /*****************************************************
  170. 以上为1602模块语句
  171. ***************************************************/


  172. void  FS()                          //发射超声波
  173.   {
  174.           out=1;                                      
  175.           _nop_();
  176.           _nop_();
  177.           _nop_();
  178.           _nop_();
  179.           _nop_();
  180.           _nop_();
  181.           _nop_();
  182.           _nop_();
  183.           _nop_();
  184.           _nop_();
  185.           _nop_();
  186.           _nop_();
  187.           _nop_();
  188.           _nop_();
  189.           _nop_();
  190.           _nop_();
  191.           _nop_();
  192.           _nop_();
  193.           _nop_();
  194.           _nop_();
  195.           _nop_();
  196.           out=0;
  197.   }

  198. void conut(void) //计算并显示超声波测到的距离
  199. {
  200.          time=TH0*256+TL0;
  201.          TH0=0;
  202.          TL0=0;
  203.        
  204.          s=(time*1.7)/100;     //算出来单位是CM

  205.          if((s>=700)||flag==1) //超出测量范围显示"ERROR"
  206.          {         
  207.           flag=0;
  208.          
  209.           Write_com(0x80+0x40+11);
  210.           WriteData('E');        delay(5);
  211.       WriteData('R');        delay(5);
  212.           WriteData('R');        delay(5);
  213.           WriteData('O');        delay(5);
  214.           WriteData('R');        delay(5);
  215.          }
  216.          else
  217.          {
  218.           s1=s%1000/100;
  219.           s2=s%1000%100/10;
  220.           s3=s%1000%10 %10;
  221.           display(11,s1);
  222.           WriteData('.');
  223.           display(13,s2);       
  224.           display(14,s3);
  225.           WriteData('m');
  226.          }


  227. }
  228. /********************************************************/
  229. void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  230. {
  231.    

  232. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
超声波模块测距 1602显示.zip (44.62 KB, 下载次数: 83)
回复

使用道具 举报

ID:96386 发表于 2015-11-19 18:17 | 显示全部楼层
没有电路图
回复

使用道具 举报

ID:61326 发表于 2016-3-10 11:42 | 显示全部楼层
謝謝!
回复

使用道具 举报

ID:191372 发表于 2017-4-19 20:44 | 显示全部楼层
多谢楼主了
回复

使用道具 举报

ID:191836 发表于 2017-4-21 18:39 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:203888 发表于 2017-6-22 15:00 | 显示全部楼层
求带报警电路的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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