找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7882|回复: 9
收起左侧

超声波测距+LCD1602/LCD12864显示

  [复制链接]
ID:202326 发表于 2017-5-18 20:40 | 显示全部楼层 |阅读模式
很久以前测试过的超声波测距,并用51单片机+超声波测距+LCD1602/LCD12864显示
0.png

12864液晶显示的程序版本:
  1. /////////////////////////////////////////////////////////////////
  2. /***********************超声波模块程序**************************/
  3. /////////////////////////////////////////////////////////////////
  4. #include <reg52.h>
  5. #include <intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. //全局变量定义
  9. unsigned int time;
  10. unsigned int S,s_false;
  11. unsigned long num1;
  12. bit flag;
  13. //12864液晶显示定义
  14. uchar code sj1[]={"<<超声波测距仪>>"};
  15. uchar code sj2[]={"“TI”杯电子大赛"};
  16. uchar code sj3[]={"当前状态:前进  "};
  17. uchar code sj4[]={"当前距离:"};
  18. uchar code sj5[]={"错误 "};
  19. //超声波引脚定义                                                 
  20. sbit Trig =P3^1;          //定义引脚       
  21. sbit Echo =P3^2;
  22. //12864液晶引脚定义
  23. sbit lcdrs=P1^5;          //命令数据
  24. sbit lcdrw=P1^6;          //读写
  25. sbit lcde =P1^7;
  26. //时钟调整按键引脚定义
  27. sbit rad=P2^4;
  28. sbit rsu=P2^5;
  29. sbit mad=P2^6;
  30. sbit msu=P2^7;
  31. //需关闭的板上资源
  32. sbit duan=P1^0;                  //数码管段控制
  33. sbit wei=P1^1;                  //数码管位控制
  34. sbit LeDen=P1^2;              //LED灯控制端
  35. sbit Line=P1^3;                  //点阵行控制端
  36. sbit rst=P3^4;            //DS1302复位端,低电平关闭  
  37. //延时函数
  38. void delay(uint z)
  39. {
  40.         uint x,y;
  41.         for(x=z;x>0;x--)
  42.                 for(y=110;y>0;y--);
  43. }
  44. void delay_20us()
  45. {
  46.         uchar a;
  47.         for(a=0;a<100;a++);
  48. }
  49. //2864液晶写命令函数
  50. void xmn(unsigned char com)
  51. {
  52.         lcdrs=0;
  53.         P0=com;
  54.         delay(5);
  55.         lcde=1;
  56.         delay(5);
  57.         lcde=0;
  58. }
  59. //2864液晶写数据函数
  60. void xsj(unsigned char zifu)
  61. {
  62.         lcdrs=1;
  63.         P0=zifu;
  64.         delay(5);
  65.         lcde=1;
  66.         delay(5);
  67.         lcde=0;
  68. }
  69. //2864液晶显示函数1
  70. void xs1()
  71. {
  72.         uchar i;
  73.         xmn(0x80);
  74.         for(i=0;i<16;i++)
  75.         {
  76.                 xsj(sj1[i]);
  77.         }
  78.         xmn(0x90);
  79.         for(i=0;i<16;i++)
  80.         {
  81.                 xsj(sj2[i]);
  82.         }
  83.         xmn(0x88);
  84.         for(i=0;i<16;i++)
  85.         {
  86.                 xsj(sj3[i]);
  87.         }
  88.         xmn(0x98);
  89.         for(i=0;i<16;i++)
  90.         {
  91.                 xsj(sj4[i]);
  92.         }
  93. }
  94. //2864液晶显示函数2
  95. void xs2(uint t_emp)
  96. {
  97.         uchar qian,bai,shi,ge;
  98.         qian=t_emp/1000;
  99.         bai=(t_emp%1000)/100;
  100.         shi=(t_emp%100)/10;
  101.         ge=t_emp%10;

  102.         xmn(0x9d);
  103.         xsj(0x30+qian);
  104.         delay(1);
  105.         xsj(0x30+bai);
  106.         delay(1);
  107.         xsj(0x30+shi);
  108.         delay(1);
  109.         xsj(0x30+ge);
  110.         delay(1);
  111.         xsj('c');
  112.         delay(1);
  113.         xsj('m');
  114.         delay(100);
  115. }
  116. //超声波计数函数
  117. void T0_time() interrupt 1  //T0中断用来计数器溢出,超过测距范围
  118. {
  119.         flag=0;                  //中断溢出标志,失败
  120.         TH0=0;
  121.         TL0=0;
  122.         TR0=0;                   //关闭计数
  123. }
  124. //中断定时函数
  125. void T1_timer() interrupt 3 //中断
  126. {
  127.         TH1=(65536-50000)/256;
  128.         TL1=(65536-50000)%256;
  129.         num1++;
  130. }
  131. //超声波模块启动函数
  132. void StartModule()          //启动模块
  133. {
  134.         Trig=1;                 //启动一次模块
  135.         _nop_();_nop_();_nop_();_nop_();_nop_();
  136.         _nop_();_nop_();_nop_();_nop_();_nop_();
  137.         _nop_();_nop_();_nop_();_nop_();_nop_();
  138.         _nop_();_nop_();_nop_();_nop_();_nop_();
  139.         _nop_();
  140.         Trig=0;
  141. }
  142. //超声波测试距离计算函数
  143. void Count(void)
  144. {
  145.         uchar i;
  146.         time=TH0*256+TL0;
  147.         TH0=0;
  148.         TL0=0;
  149.         S=(time*1.7)/100;               //算出来是CM
  150.         if(((S<5)||(S>=600))||flag==0)  //超出测量范围显示“-”失败
  151.         {
  152.                 //flag=1;
  153.                 s_false=1000;
  154.                 xmn(0x9d);
  155.                 for(i=0;i<6;i++)
  156.                 {
  157.                         xsj(sj5[i]);
  158.                 }
  159.                 //xs(s_false);
  160.         }
  161.         else
  162.         {
  163.                 xs2(S);
  164.         }
  165. }
  166. //12864液晶初始化函数
  167. void init()
  168. {
  169.         delay(100);
  170.         xmn(0x30);
  171.         delay_20us();
  172.         xmn(0x30);
  173.         delay_20us();
  174.         xmn(0x0c);
  175.         delay_20us();
  176.         xmn(0x01);
  177.         delay_20us();
  178.         xmn(0x06);
  179.         delay_20us();
  180. }
  181. //主函数
  182. void main()
  183. {
  184.         //unsigned char TempCyc;
  185.         rst=0;           //关闭板上DS1302
  186.         LeDen=1;
  187.         P0=0XFF;
  188.         LeDen=0;            //关闭板上LED灯
  189.        
  190.         P0=0XFF;
  191.         wei=0;
  192.         P0=0X00;
  193.         duan=0;        //关闭板上数码管
  194.        
  195.         P0=0X00;
  196.         Line=0;        //关闭板上点阵

  197.         delay(500);    //启动等待,等LCM讲入工作状态
  198.         lcdrw=0;
  199.         init();        //LCM初始化
  200.         delay(500);    //延时片刻(可不要)
  201.         while(1)
  202.         {
  203.                 TMOD=0x11; //设T0为方式1,GATE=1;
  204. ……………………

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


1602液晶版本:
单片机源程序如下:
  1. //超声波模块程序
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. unsigned int time;
  7. unsigned int S,s_false;
  8. unsigned long num1;
  9. uchar code xs[]={"ERROR "};
  10. uchar code disp[]={"Measuring Range:"};
  11. bit flag;

  12. sbit Trig =P3^1; //定义引脚       
  13. sbit Echo =P3^2;

  14. sbit lcdrs=P1^5;//命令数据
  15. sbit lcdrw=P1^6;//读写
  16. sbit lcde =P1^7;

  17. sbit duan=P1^0;        //        数码管段控制
  18. sbit wei=P1^1;        //        数码管位控制
  19. sbit LeDen=P1^2;        //        LED灯控制端
  20. sbit Line=P1^3;        //        点阵行控制端
  21. sbit rst=P3^4;//DS1302复位端,低电平关闭  

  22. void delay(uint z)
  23. {
  24.         uint x,y;
  25.         for(x=z;x>0;x--)
  26.                 for(y=110;y>0;y--);
  27. }

  28. void write_com(unsigned char com)
  29. {
  30.         lcdrs=0;
  31.         P0=com;
  32.         delay(5);
  33.         lcde=1;
  34.         delay(5);
  35.         lcde=0;
  36. }

  37. void write_data(unsigned char zifu)
  38. {
  39.         lcdrs=1;
  40.         P0=zifu;
  41.         delay(5);
  42.         lcde=1;
  43.         delay(5);
  44.         lcde=0;
  45. }

  46. void write_temp(uint t_emp)
  47. {
  48.         uchar qian,bai,shi,ge,i;
  49.         qian=t_emp/1000;
  50.         bai=(t_emp%1000)/100;
  51.         shi=(t_emp%100)/10;
  52.         ge=t_emp%10;

  53.         write_com(0x80);
  54.         for(i=0;i<16;i++)
  55.         {
  56.                 write_data(disp[i]);
  57.         }
  58.         delay(1);
  59.         write_com(0x80+0x40);
  60.         delay(1);
  61.         write_data(0x30+qian);
  62.         delay(1);
  63.         write_data(0x30+bai);
  64.         delay(1);
  65.         write_data(0x30+shi);
  66.         delay(1);
  67.         write_data(0x30+ge);
  68.         delay(1);
  69.         write_data('c');
  70.         delay(1);
  71.         write_data('m');
  72.         delay(1);
  73.         write_data('-');
  74.         delay(1);
  75.         write_data('-');
  76.         delay(1);
  77.         write_data('L');
  78.         delay(1);
  79.         write_data('u');
  80.         delay(1);
  81.         write_data('Z');
  82.         delay(1);
  83.         write_data('e');
  84.         delay(1);
  85.         write_data('H');
  86.         delay(1);
  87.         write_data('o');
  88.         delay(1);
  89.         write_data('n');
  90.         delay(1);
  91.         write_data('g');
  92.         delay(1);
  93.         delay(100);
  94. }

  95. void T0_time() interrupt 1 //T0中断用来计数器溢出,超过测距范围
  96. {
  97.         flag=0; //中断溢出标志,失败
  98.         TH0=0;
  99.         TL0=0;
  100.         TR0=0;//关闭计数
  101. }

  102. void T1_timer() interrupt 3 //中断
  103. {
  104.         TH1=(65536-50000)/256;
  105.         TL1=(65536-50000)%256;
  106.         num1++;
  107. }

  108. void StartModule()//启动模块
  109. {
  110.         Trig=1;//启动一次模块
  111.         _nop_();_nop_();_nop_();_nop_();_nop_();
  112.         _nop_();_nop_();_nop_();_nop_();_nop_();
  113.         _nop_();_nop_();_nop_();_nop_();_nop_();
  114.         _nop_();_nop_();_nop_();_nop_();_nop_();
  115.         _nop_();
  116.         Trig=0;
  117. }

  118. void Count(void)
  119. {
  120.         uchar i;
  121.         time=TH0*256+TL0;
  122.         TH0=0;
  123.         TL0=0;
  124.         S=(time*1.7)/100;//算出来是CM
  125.         if(((S<5)||(S>=450))||flag==0) //超出测量范围显示“-”失败
  126.         {
  127.                 //flag=1;
  128.                 s_false=1000;
  129.                 write_com(0x80+0x40);
  130.                 for(i=0;i<6;i++)
  131.                 {
  132.                         write_data(xs[i]);
  133.                 }
  134.         }
  135.         else
  136.         {
  137.                 write_temp(S);
  138.         }
  139. }

  140. void init()
  141. {
  142.         lcde=0;
  143.         write_com(0x38);
  144.         write_com(0x0c);
  145.         write_com(0x06);
  146.         write_com(0x01);
  147.         lcdrw=0;
  148. }

  149. void main()
  150. {
  151.         //unsigned char TempCyc;

  152.         rst=0;//关闭DS1302
  153.         LeDen=1;
  154.         P0=0XFF;
  155.         LeDen=0;        //关闭LED灯
  156.        
  157.         P0=0XFF;
  158.         wei=0;
  159.         P0=0X00;
  160.         duan=0;  //关闭数码管
  161.        
  162.         P0=0X00;
  163.         Line=0; //关闭点阵

  164.         delay(500);    //启动等待,等LCM讲入工作状态
  165.         lcdrw=0;
  166.         init();        //LCM初始化
  167.         delay(500);    //延时片刻(可不要)
  168.         while(1)
  169.         {
  170. ……………………

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

所有资料51hei提供下载:
51 超声波.rar (72.98 KB, 下载次数: 274)



评分

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

查看全部评分

回复

使用道具 举报

ID:140358 发表于 2017-6-5 15:58 | 显示全部楼层
解析得挺好的,下载来学习了再来评论
回复

使用道具 举报

ID:307925 发表于 2018-4-19 10:20 | 显示全部楼层
这里12864引脚不用定义?
回复

使用道具 举报

ID:400007 发表于 2018-10-8 20:09 | 显示全部楼层
看看~
回复

使用道具 举报

ID:395866 发表于 2019-4-27 20:25 | 显示全部楼层
引脚定义能说明下吗
回复

使用道具 举报

ID:375715 发表于 2019-4-28 11:54 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:1010439 发表于 2022-3-14 22:07 | 显示全部楼层
不错啊,挺好的东西
回复

使用道具 举报

ID:1010443 发表于 2022-3-14 22:13 来自手机 | 显示全部楼层
yjs 发表于 2017-6-5 15:58
解析得挺好的,下载来学习了再来评论

厉害啊,我都看不懂
回复

使用道具 举报

ID:1010443 发表于 2022-3-16 23:25 来自手机 | 显示全部楼层
已优化好,效果满意
回复

使用道具 举报

ID:1063683 发表于 2023-2-22 09:05 | 显示全部楼层
对于一个初学者来说,简直是学习模板
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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