找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波传感器和stc89c51单片机的c语言代码

[复制链接]
跳转到指定楼层
楼主
C:
SMC1602A(16*2)模拟口线接线方式
连接线图:   
       ---------------------------------------------------
       |LCM-----51   |    LCM-----51   |    LCM------51      |
       --------------------------------------------------|
       |DB0-----P2.0 |    DB4-----P2.4 |    RW-------P0.6    |
       |DB1-----P2.1 |    DB5-----P2.5 |    RS-------P0.7    |
       |DB2-----P2.2 |    DB6-----P2.6 |    E--------P0.5    |
       |DB3-----P2.3 |    DB7-----P2.7 |    VLCD接1K电阻到GND|
       ---------------------------------------------------
接线:模块TRIG接 P1.2  ECH0 接P1.1

本程序源码只供学习参考,不得应用于商业用途,如有需要请联系作者。

[注:AT89x51使用12M或11.0592M晶振,实测使用11.0592M]
=============================================================*/


单片机源程序如下:
  1. #include <AT89x51.H>        //器件配置文件
  2. #include <intrins.h>
  3. #define  RX  P1_1
  4. #define  TX  P1_2

  5. #define LCM_RW  P0_6 //定义LCD引脚
  6. #define LCM_RS  P0_7
  7. #define LCM_E   P0_5
  8. #define LCM_Data  P2


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

  10. void LCMInit(void);
  11. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  12. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  13. void Delay5Ms(void);
  14. void Delay400Ms(void);
  15. void Decode(unsigned char ScanCode);
  16. void WriteDataLCM(unsigned char WDLCM);
  17. void WriteCommandLCM(unsigned char WCLCM,BuysC);

  18. unsigned char ReadDataLCM(void);
  19. unsigned char ReadStatusLCM(void);
  20. unsigned char code mcustudio[] ={" WWW*QXMCU*COM  "};
  21. unsigned char code email[] =    {"863888999@QQ.COM"};
  22. unsigned char code Cls[] =      {"                "};
  23. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  24. static unsigned char DisNum = 0; //显示用指针                  
  25.        unsigned int  time=0;
  26.        unsigned long S=0;
  27.        bit      flag =0;
  28.        unsigned char disbuff[4]       ={ 0,0,0,0,};


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

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

  51. //读数据
  52. unsigned char ReadDataLCM(void)
  53. {
  54.     LCM_RS = 1;
  55.     LCM_RW = 1;
  56.     LCM_E = 0;
  57.     LCM_E = 0;
  58.     LCM_E = 1;
  59.     return(LCM_Data);
  60. }

  61. //读状态
  62. unsigned char ReadStatusLCM(void)
  63. {
  64.     LCM_Data = 0xFF;
  65.     LCM_RS = 0;
  66.     LCM_RW = 1;
  67.     LCM_E = 0;
  68.     LCM_E = 0;
  69.     LCM_E = 1;
  70.     while (LCM_Data & Busy); //检测忙信号
  71.     return(LCM_Data);
  72. }

  73. void LCMInit(void) //LCM初始化
  74. {
  75.     LCM_Data = 0;
  76.     WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
  77.     Delay5Ms();
  78.     WriteCommandLCM(0x38,0);
  79.     Delay5Ms();
  80.     WriteCommandLCM(0x38,0);
  81.     Delay5Ms();

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

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

  98. //按指定位置显示一串字符
  99. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  100. {
  101.     unsigned char ListLength;

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

  115. //5ms延时
  116. void Delay5Ms(void)
  117. {
  118.     unsigned int TempCyc = 5552;
  119.     while(TempCyc--);
  120. }

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

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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