找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机扩展超声波模块测距1602显示程序

[复制链接]
跳转到指定楼层
楼主

超声波.rar

2.16 MB, 下载次数: 17, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:146711 发表于 2016-11-7 21:35 | 只看该作者
很好很强大
  1. /*=============================================================
  2. 安装HC SR04请参照该文件夹下的图片01



  3. =============================================================*/
  4. #include <AT89x51.H>                //器件配置文件
  5. #include <intrins.h>
  6. #define  RX  P1_6
  7. #define  TX  P1_7

  8. #define LCM_RW  P3_6 //定义LCD引脚
  9. #define LCM_RS  P3_5
  10. #define LCM_E   P3_4
  11. #define LCM_Data  P0
  12. #define Key_Data P3_0 //定义Keyboard引脚
  13. #define Key_CLK  P3_2

  14. #define Busy    0x80 //用于检测LCM状态字中的Busy标识

  15. void LCMInit(void);
  16. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  17. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  18. void Delay5Ms(void);
  19. void Delay400Ms(void);
  20. void Decode(unsigned char ScanCode);
  21. void WriteDataLCM(unsigned char WDLCM);
  22. void WriteCommandLCM(unsigned char WCLCM,BuysC);

  23. unsigned char ReadDataLCM(void);
  24. unsigned char ReadStatusLCM(void);
  25. unsigned char code mcustudio[] ={"qx-muc.taobao.co"};
  26. unsigned char code email[] =    {"fhwxaoo@163.com "};
  27. unsigned char code Cls[] =      {"                "};
  28. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  29. static unsigned char DisNum = 0; //显示用指针                                  
  30.        unsigned int  time=0;
  31.            unsigned long S=0;
  32.            bit      flag =0;
  33.            unsigned char disbuff[4]           ={ 0,0,0,0,};


  34. //写数据
  35. void WriteDataLCM(unsigned char WDLCM)
  36. {
  37.         ReadStatusLCM(); //检测忙
  38.         LCM_Data = WDLCM;
  39.         LCM_RS = 1;
  40.         LCM_RW = 0;
  41.         LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  42.         LCM_E = 0; //延时
  43.         LCM_E = 1;
  44. }

  45. //写指令
  46. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
  47. {
  48.         if (BuysC) ReadStatusLCM(); //根据需要检测忙
  49.         LCM_Data = WCLCM;
  50.         LCM_RS = 0;
  51.         LCM_RW = 0;       
  52.         LCM_E = 0;
  53.         LCM_E = 0;
  54.         LCM_E = 1;       
  55. }

  56. //读数据
  57. unsigned char ReadDataLCM(void)
  58. {
  59.         LCM_RS = 1;
  60.         LCM_RW = 1;
  61.         LCM_E = 0;
  62.         LCM_E = 0;
  63.         LCM_E = 1;
  64.         return(LCM_Data);
  65. }

  66. //读状态
  67. unsigned char ReadStatusLCM(void)
  68. {
  69.         LCM_Data = 0xFF;
  70.         LCM_RS = 0;
  71.         LCM_RW = 1;
  72.         LCM_E = 0;
  73.         LCM_E = 0;
  74.         LCM_E = 1;
  75.         while (LCM_Data & Busy); //检测忙信号
  76.         return(LCM_Data);
  77. }

  78. void LCMInit(void) //LCM初始化
  79. {
  80.         LCM_Data = 0;
  81.         WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
  82.         Delay5Ms();
  83.         WriteCommandLCM(0x38,0);
  84.         Delay5Ms();
  85.         WriteCommandLCM(0x38,0);
  86.         Delay5Ms();

  87.         WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
  88.         WriteCommandLCM(0x08,1); //关闭显示
  89.         WriteCommandLCM(0x01,1); //显示清屏
  90.         WriteCommandLCM(0x06,1); // 显示光标移动设置
  91.         WriteCommandLCM(0x0F,1); // 显示开及光标设置
  92. }

  93. //按指定位置显示一个字符
  94. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  95. {
  96.         Y &= 0x1;
  97.         X &= 0xF; //限制X不能大于15,Y不能大于1
  98.         if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
  99.         X |= 0x80; //算出指令码
  100.         WriteCommandLCM(X, 1); //发命令字
  101.         WriteDataLCM(DData); //发数据
  102. }

  103. //按指定位置显示一串字符
  104. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  105. {
  106.         unsigned char ListLength;

  107.   ListLength = 0;
  108.         Y &= 0x1;
  109.         X &= 0xF; //限制X不能大于15,Y不能大于1
  110.         while (DData[ListLength]>0x19) //若到达字串尾则退出
  111.                 {
  112.                         if (X <= 0xF) //X坐标应小于0xF
  113.                                 {
  114.                                         DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
  115.                                         ListLength++;
  116.                                         X++;
  117.                                 }
  118.                 }
  119. }

  120. //5ms延时
  121. void Delay5Ms(void)
  122. {
  123.         unsigned int TempCyc = 5552;
  124.         while(TempCyc--);
  125. }

  126. //400ms延时
  127. void Delay400Ms(void)
  128. {
  129.         unsigned char TempCycA = 5;
  130.         unsigned int TempCycB;
  131.         while(TempCycA--)
  132.                 {
  133.                         TempCycB=7269;
  134.                         while(TempCycB--);
  135.                 };
  136. }
  137. /********************************************************/
  138.     void Conut(void)
  139.         {
  140.          time=TH0*256+TL0;
  141.          TH0=0;
  142.          TL0=0;
  143.        
  144.          S=(time*1.7)/100;     //算出来是CM
  145.          if((S>=700)||flag==1) //超出测量范围显示“-”
  146.          {         
  147.           flag=0;
  148.          
  149.           DisplayOneChar(0, 1, ASCII[11]);
  150.           DisplayOneChar(1, 1, ASCII[10]);        //显示点
  151.           DisplayOneChar(2, 1, ASCII[11]);
  152.           DisplayOneChar(3, 1, ASCII[11]);
  153.           DisplayOneChar(4, 1, ASCII[12]);        //显示M
  154.          }
  155.          else
  156.          {
  157.           disbuff[0]=S%1000/100;
  158.           disbuff[1]=S%1000%100/10;
  159.           disbuff[2]=S%1000%10 %10;
  160.           DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  161.           DisplayOneChar(1, 1, ASCII[10]);        //显示点
  162.           DisplayOneChar(2, 1, ASCII[disbuff[1]]);
  163.           DisplayOneChar(3, 1, ASCII[disbuff[2]]);
  164.           DisplayOneChar(4, 1, ASCII[12]);        //显示M
  165.          }
  166.         }
  167. /********************************************************/
  168.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  169.   {
  170.     flag=1;                                                         //中断溢出标志
  171.   }
  172. /********************************************************/
  173.      void  StartModule()                          //启动模块
  174.   {
  175.           TX=1;                                             //启动一次模块
  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.           _nop_();
  197.           TX=0;
  198.   }
  199. /********************************************************/
  200. void delayms(unsigned int ms)
  201. {
  202.         unsigned char i=100,j;
  203.         for(;ms;ms--)
  204.         {
  205.                 while(--i)
  206.                 {
  207.                         j=10;
  208.                         while(--j);
  209.                 }
  210.         }
  211. }
  212. /*********************************************************/
  213. void main(void)
  214. {
  215.         unsigned char TempCyc;
  216.         Delay400Ms(); //启动等待,等LCM讲入工作状态
  217.         LCMInit(); //LCM初始化
  218.         Delay5Ms(); //延时片刻(可不要)
  219.         DisplayListChar(0, 0, mcustudio);
  220.         DisplayListChar(0, 1, email);
  221.         ReadDataLCM();//测试用句无意义
  222.         for (TempCyc=0; TempCyc<10; TempCyc++)
  223.         Delay400Ms(); //延时
  224.         DisplayListChar(0, 1, Cls);       
  225.         while(1)
  226.         {
  227.          TMOD=0x01;                   //设T0为方式1,GATE=1;
  228.          TH0=0;
  229.          TL0=0;         
  230.          ET0=1;             //允许T0中断
  231.          EA=1;                           //开启总中断                       
  232.        
  233.         while(1)
  234.           {
  235.              StartModule();
  236.                 // DisplayOneChar(0, 1, ASCII[0]);
  237.              while(!RX);                //当RX为零时等待
  238.              TR0=1;                            //开启计数
  239.              while(RX);                        //当RX为1计数并等待
  240.              TR0=0;                                //关闭计数
  241.          Conut();                        //计算
  242.                  delayms(80);                //80MS
  243.                  
  244.           }
  245.         }
  246. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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