找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机超声波测距加LCD12864显示程序

[复制链接]
跳转到指定楼层
楼主
ID:458339 发表于 2018-12-29 21:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AT89S52  超声波测距    LCD12864串行显示   程序 有详细注释

单片机源程序如下:
  1. #include   <reg52.h>
  2. #include   <intrins.h>
  3.        
  4. /************引脚定义**************/

  5.     sbit     RX    =  P3 ^ 1; //ECH0
  6.     sbit     TX    =  P3 ^ 2;//TRIG
  7.     sbit     CS    =  P3 ^ 3;       
  8.     sbit     SID   =  P3 ^ 4;        //RW   数据
  9.     sbit     SCLK  =  P3 ^ 5;        //E    时钟

  10. /*************函数声明**************/

  11. void Lcd_init(void);
  12. void Write_char(bit start, unsigned char ddata);
  13. void Send_byte(unsigned char bbyte);
  14. void Delaynms(unsigned int di);
  15. void Clr_Scr(void);
  16. void LCD_set_xy( unsigned char x, unsigned char y );
  17. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
  18. void LCD_Write_number(unsigned char s);
  19. void Lcd_Mark2(void);
  20. void Conut(void);
  21. void delayms(unsigned int ms);
  22. void  StartModule();


  23. unsigned char code num[]={"0123456789 :.-"};

  24. unsigned char code Q[] ={"前:"};
  25. unsigned char code CM[] =  {"m"};
  26. unsigned int  time=0;
  27.          long S=0;
  28.          bit  flag =0;
  29. unsigned char disbuff[4]           ={ 0,0,0,0,};

  30. /**************************************************************/
  31. void Lcd_init(void)        //初始化LCD
  32. {
  33.         Delaynms(10); //启动等待,等LCM讲入工作状态
  34.           CS=1;
  35.           Write_char(0,0x30);  //8 位介面,基本指令集
  36.           Write_char(0,0x0c);  //显示打开,光标关,反白关
  37.           Write_char(0,0x01);  //清屏,将DDRAM的地址计数器归零  
  38. }

  39. /***************************************************************/
  40. void Write_char(bit start, unsigned char ddata) //写指令或数据
  41. {
  42.         unsigned char start_data,Hdata,Ldata;
  43.           if(start==0)
  44.                 start_data=0xf8;         //写指令
  45.     else   
  46.             start_data=0xfa;  //写数据
  47.   
  48.           Hdata=ddata&0xf0;                  //取高四位
  49.           Ldata=(ddata<<4)&0xf0;  //取低四位
  50.           Send_byte(start_data);          //发送起始信号
  51.           Delaynms(5); //延时是必须的
  52.           Send_byte(Hdata);              //发送高四位
  53.           Delaynms(1);  //延时是必须的
  54.           Send_byte(Ldata);                  //发送低四位
  55.           Delaynms(1);  //延时是必须的
  56. }

  57. /***************************************************************/
  58. void Send_byte(unsigned char bbyte) //发送一个字节
  59. {
  60.         unsigned char i;
  61.         for(i=0;i<8;i++)
  62.            {
  63.                    SID=bbyte&0x80; //取出最高位
  64.                 SCLK=1;
  65.                    SCLK=0;
  66.                    bbyte<<=1; //左移
  67.            }  
  68. }

  69. /***************************************************************/
  70. void Delaynms(unsigned int di) //延时
  71. {
  72.         unsigned int da,db;
  73.         for(da=0;da<di;da++)
  74.                    for(db=0;db<10;db++);
  75. }

  76. /***************************************************************/


  77. void Clr_Scr(void)//清屏函数
  78. {
  79.         Write_char(0,0x01);
  80. }

  81. /****************************************************************/
  82. void LCD_set_xy( unsigned char x, unsigned char y )
  83. {        //设置LCD显示的起始位置,X为行,Y为列
  84.     unsigned char address;
  85.         switch(x)
  86.         {
  87.                 case 0: address = 0x80 + y; break;   
  88.             case 1: address = 0x80 + y; break;
  89.                 case 2: address = 0x90 + y; break;
  90.                     case 3: address = 0x88 + y; break;
  91.                 case 4: address = 0x98 + y; break;
  92.                 default:address = 0x80 + y; break;
  93.         }
  94.     Write_char(0, address);
  95. }

  96. /*****************************************************************/
  97. void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
  98. {        //        中英文字符串显示函数
  99.         LCD_set_xy( X, Y );
  100.    
  101.     while (*s)
  102.     {
  103.                 Write_char( 1, *s );
  104.             s ++;
  105.                 Delaynms(1);
  106.         }
  107. }

  108. /******************************************************************/
  109. void LCD_Write_number(unsigned char s)//        数字显示函数
  110. {       
  111.         Write_char(1,num[s]);
  112.         Delaynms(1);
  113. }
  114. /******************************************************************/
  115. void Lcd_Mark2(void)
  116. {
  117.         Clr_Scr();//清屏
  118.         LCD_Write_string(1,2,Q);//
  119.                
  120.         LCD_Write_string(1,6,CM);//       
  121. }
  122. /*************************************************************************************/
  123. /*************************************************************************************/
  124.     void Conut(void)
  125.         {
  126.            time=TH0*256+TL0;
  127.            TH0=0;
  128.            TL0=0;
  129.            S=time*1.87/100;       //算出来是CM          11。0592M晶振
  130.            if(flag==1)                      //超出测量
  131.           {         
  132.            flag=0;
  133.            LCD_set_xy( 1, 4 );
  134.            LCD_Write_number(13);
  135.            LCD_Write_number(12);
  136.            LCD_set_xy( 1, 5 );
  137.            LCD_Write_number(13);
  138.            LCD_Write_number(13);
  139.           
  140.            }
  141.          else
  142.           {
  143.            disbuff[1]=S%1000/100;
  144.            disbuff[2]=S%1000%100/10;
  145.            disbuff[3]=S%1000%10 %10;
  146.            LCD_set_xy( 1, 4 );
  147.            LCD_Write_number(disbuff[1]);
  148.            LCD_Write_number(12);
  149.            LCD_set_xy( 1, 5 );
  150.            LCD_Write_number(disbuff[2]);
  151.            LCD_Write_number(disbuff[3]);
  152.           }
  153.         }
  154. /********************************************************/
  155. void delayms(unsigned int ms)
  156. {
  157.         unsigned char i=100,j;
  158.         for(;ms;ms--)
  159.         {
  160.                 while(--i)
  161.                 {
  162.                         j=10;
  163.                         while(--j);
  164.                 }
  165.         }
  166. }
  167. /********************************************************/
  168.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  169.   {
  170.     flag=1;                                                         //中断溢出标志
  171.   }
  172. /********************************************************/
  173.    void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  174.   {
  175.           TX=1;                                         //800MS  启动一次模块
  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 main(void)
  201. {  
  202.     TMOD=0x01;                   //设T0为方式1,GATE=1
  203.         TH0=0;
  204.         TL0=0;
  205.         TR0=1;

  206.         Lcd_init();       //设置液晶显示器
  207.         Clr_Scr();        //清屏       
  208.        


  209.     Lcd_Mark2();


  210.         while(1)
  211.         {
  212.          StartModule();         
  213.                                          //计算
  214.          while(!RX);                //当RX为零时等待
  215.          TR0=1;                            //开启计数
  216.          while(RX);                        //当RX为1计数并等待
  217.          TR0=0;                                //关闭计数
  218.          Conut();
  219.          delayms(80);                //80MS

  220.         }

  221. }              
复制代码

所有资料51hei提供下载:
main.zip (1.92 KB, 下载次数: 32)


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

使用道具 举报

沙发
ID:1 发表于 2018-12-30 14:42 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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