找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3980|回复: 0
收起左侧

STC89C51最小系统+HC-SR04+LCD12864(超声波测距仪)源码

[复制链接]
ID:368523 发表于 2018-7-13 16:12 | 显示全部楼层 |阅读模式
QQ图片20180713160516.jpg
单片机源程序如下:
  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[]={"  榆林学院      "};
  16. uchar code sj3[]={"测量范围5cm-2m  "};
  17. uchar code sj4[]={"当前距离:"};
  18. uchar code sj5[]={"错误 "};
  19. //超声波引脚定义                                                
  20. sbit Trig =P1^1;          //定义引脚        
  21. sbit Echo =P3^2;
  22. //12864液晶引脚定义
  23. sbit lcdrs=P3^5;          //命令数据
  24. sbit lcdrw=P3^6;          //读写
  25. sbit lcde =P3^4;
  26. sbit LCD_PSB=P3^7;
  27. //时钟调整按键引脚定义
  28. sbit rad=P2^4;
  29. sbit rsu=P2^5;
  30. sbit mad=P2^6;
  31. sbit msu=P2^7;

  32. sbit rst=P3^1;            //DS1302复位端,低电平关闭  
  33. //延时函数
  34. void delay(uint z)
  35. {
  36.         uint x,y;
  37.         for(x=z;x>0;x--)
  38.                 for(y=110;y>0;y--);
  39. }
  40. void delay_20us()
  41. {
  42.         uchar a;
  43.         for(a=0;a<100;a++);
  44. }
  45. //2864液晶写命令函数
  46. void xmn(unsigned char com)
  47. {
  48.         lcdrs=0;
  49.         P0=com;
  50.         delay(5);
  51.         lcde=1;
  52.         delay(5);
  53.         lcde=0;
  54. }
  55. //2864液晶写数据函数
  56. void xsj(unsigned char zifu)
  57. {
  58.         lcdrs=1;
  59.         P0=zifu;
  60.         delay(5);
  61.         lcde=1;
  62.         delay(5);
  63.         lcde=0;
  64. }
  65. //2864液晶显示函数1
  66. void xs1()
  67. {
  68.         uchar i;
  69.         xmn(0x80);
  70.         for(i=0;i<16;i++)
  71.         {
  72.                 xsj(sj1[i]);
  73.         }
  74.         xmn(0x90);
  75.         for(i=0;i<16;i++)
  76.         {
  77.                 xsj(sj2[i]);
  78.         }
  79.         xmn(0x88);
  80.         for(i=0;i<16;i++)
  81.         {
  82.                 xsj(sj3[i]);
  83.         }
  84.         xmn(0x98);
  85.         for(i=0;i<16;i++)
  86.         {
  87.                 xsj(sj4[i]);
  88.         }
  89. }
  90. //2864液晶显示函数2
  91. void xs2(uint t_emp)
  92. {
  93.         uchar qian,bai,shi,ge;
  94.         qian=t_emp/1000;
  95.         bai=(t_emp%1000)/100;
  96.         shi=(t_emp%100)/10;
  97.         ge=t_emp%10;

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

  187.         P0=0X00;

  188.         
  189.         P0=0X00;


  190.         delay(500);    //启动等待,等LCM讲入工作状态
  191.         lcdrw=0;
  192.         init();        //LCM初始化
  193.         delay(500);    //延时片刻(可不要)
  194.         while(1)
  195.         {
  196.                 TMOD=0x11; //设T0为方式1,GATE=1;
  197.                 TH0=0;
  198.                 TL0=0;
  199.                 ET0=1;     //允许T0中断
  200.                 ET1=1;
  201.                 TR1=1;
  202.                 EA=1;      //开启总中断

  203.                 xs1();

  204.                 Trig=0;
  205.                 Echo=0;
  206.                 while(1)
  207.                 {
  208.                         StartModule();
  209.                         flag=1;
  210.                         //while(!Echo);      //当echo为零时等待
  211.                         while((!Echo)&&flag);//当echo为零时等待,中断flag跳出等待
  212.                         TR0=1;               //开启计数
  213.                         while(Echo&&flag);   //当echo为1计数并等待
  214.                         TR0=0;               //关闭计数
  215.                         Count();             //计算
  216.                         delay(120);          //80MS
  217.                 }
  218.         }
  219. }
复制代码

所有资料51hei提供下载:
51单片机控制超声波测距.zip (62.84 KB, 下载次数: 112)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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