找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DIY相位激光测距仪(详细讲解)

  [复制链接]
跳转到指定楼层
楼主
下面开始搞,搞一个相位激光测距仪

源码下载: 完整代码 备份 15-7-13.zip (398.12 KB, 下载次数: 306)
全部的软件代码都在这里了

5厘米到40米量程
精度1毫米
然后做了个视频演示

还写了一个上位机 远距离测试

然后又写了个上位机 近距离测试



其实也不算是自己动手做因为本来就是成品模块

好吧看来大家更关注模块哪儿买的,那我把模块的链接放在上面来吧
模块从淘宝就找到了两家,一家是550 一家是260
550元的激光测距模块
260元的国产测距模块 40米 150Mhz我买的是260的量程40米,
550的量程30米,精度高0.5mm而已,另外也就多了个读id什么的,反正测距只要知道多少长度就够了,没必要多花那么多钱
借用卖家的图片

使用串口通信发指令就行了
测量量程: 5厘米到40米
精度检测: 1毫米错误检测: 无返回信号错误, 距离太近错误

玩了一天玩透了,先上几张图大家批评批评,

用黑色的卷尺挡住激光接收口.不让模块收到激光,提示没信号



测量结果没错误的界面

正确的测量结果

既然不是技术贴,那也别装那个技术范儿,扯扯淡,大家就会玩了,
这个模块不便宜,话说为何要买这个模块,其实也是闲的蛋疼,
我的目的是从头到尾做一个激光测距仪,
不过经过查阅资料,发现这个东西是双光路,不太明白什么叫双光路,所以花钱买一个拆拆看吧,
不得不吐槽的是: 模块260,一个山寨激光测距仪才150
有没有坛友牺牲一下买个淘宝上的150元激光测距仪,拆开看看内部什么样?
不过这个模块的做工确实很渣渣,双光路就是俩塑料导光片,
从坛子里看有拆的什么徕的激光测距仪,做工真是秒杀


---------------------------------------------------------------------------------------------
这个模块卖家也除了提供一份指令表,什么也没有,真是蛋疼,那怕是给个单片机例子呢
无奈了,既然是串口,那就上串口助手吧
然后我发现rxd会重复出现主机发来的指令,比较蛋疼,

然后借助示波器查看数据出现的先后顺序,才发现,原来是模块 是根据不同的指令返回应答
有的指令返回应答后还会重复一次指令表示收到(猜测的)
然后有的指令是直接返回一个应答就完了

然后把卖家给的指令表我又重新扩充了一下,并截取了一些数据,然后根据表现我给他定义了三个模式


模式1 打开激光 瞄准后在测距 28字节数据包

$00023335&$0003260130&$00023335&$0006210000008613& 表示0.086米
模式2 单词测量  28字节数据包
$00023335&$0006210000006390& 表示0.063米
模式3测100次  38*100字节的数据包
$001624999900000106000001180000004711& 表示0.04711米



这样的话,内存占用很大, 单片机选用了 60s2,128的ram然后又1024的xdata区,
这个xdata之前是放置的5110液晶屏显存(为了显示4行12x12)的字符
其实控制这个模块是很简单的,往里面丢ascii就可以了,像什么呢?对就是gsm和gprs模块
模块有错误检测功能,距离太近和收不到激光,卖家的文档里有好多种错误代码,但是实际上我只遇见了2种错误,
可能还要继续玩玩才能知道

晚整理一下把代码发上来



源码在这里,硬件连接很简单了,从代码里一看就知道
main.c
  1. #include <reg51.h>
  2. #include"Nokia5110lcd.h"





  3. //有兴趣可以加qq924958394一起交流




  4. #define  uchar unsigned char
  5. #define  uint unsigned int

  6. sbit led=P1^7; //ok


  7. sbit k2=P2^5;
  8. sbit k3=P2^6;
  9. sbit k4=P2^7;
  10. uint Sysec;
  11. uchar ErrorCode;
  12. uchar stringLenth;//串口收到的字符串长度,单次测量收到28字节  连续测量38个字节
  13. #define  maxSbufLenth 38  //根据测量模式设置缓存大小
  14. uchar aciiCount; //收到的字符数计算
  15. uchar multipleTestShift; //连续测量要减去一个偏移量10字节
  16. uchar  uartSbuf[38]={"$00023335&$0006210000000000&"};//第20位是距离的十位数  21是个位数,后面是小数
  17. uchar xdata laserOn[12]      ={"$0003260130&"};
  18. uchar xdata singleTest[10]   ={"$00022123&"};
  19. uchar xdata multipleTest[10] ={"$00022426&"};
  20. void Timer0Init(void)                //50毫秒@6.000MHz
  21. {
  22.         AUXR &= 0x7F;                //定时器时钟12T模式
  23.         TMOD &= 0xF0;                //设置定时器模式
  24.         TMOD |= 0x01;                //设置定时器模式
  25.         TL0 = 0x58;                //设置定时初值
  26.         TH0 = 0x9E;                //设置定时初值
  27.         TF0 = 0;                //清除TF0标志
  28.         //TR0 = 1;                //定时器0开始计时
  29.         ET0=0;
  30.         EA=1;
  31. }
  32. void UartInit(void)                //115200bps@11.0592MHz
  33. {
  34.         PCON &= 0x7F;                //波特率不倍速
  35.         SCON = 0x50;                //8位数据,可变波特率
  36.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  37.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  38.         TMOD &= 0x0F;                //清除定时器1模式位
  39.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  40.         TL1 = 0xFD;                //设定定时初值
  41.         TH1 = 0xFD;                //设定定时器重装值
  42.         ET1 = 0;                //禁止定时器1中断
  43.         TR1 = 1;                //启动定时器1
  44.         ES=1;
  45.         EA=1;
  46. }

  47. /*********** ***发送字符(ASCII)函数*** **********/
  48. void sendAscii(uchar *b)
  49. {
  50.         ES = 0;                  //关串口中断
  51.         for (b; *b!='\0';b++)
  52.         {
  53.                 SBUF = *b;
  54.                 while (TI!=1);   //等待发送完成
  55.                 TI = 0;          //清除发送中断标志位
  56.         }
  57.         ES = 1;                  //开串口中断
  58. }
  59. void clearUartSbuf()
  60. {
  61.         uchar i;
  62.         for (i=0;i<aciiCount;i++)
  63.         {
  64.                 uartSbuf[i]='0';
  65.         }
  66. }
  67. uchar checkError()
  68. {
  69.         uchar  dat;
  70.         if (uartSbuf[20]=='0' && uartSbuf[21]=='0' && uartSbuf[22]=='0' && uartSbuf[23]== '1' ){
  71.                 if ( uartSbuf[24]=='5')dat=15; //距离太近1542                       
  72.                 if (uartSbuf[24]=='6')dat=16;//收不到信号1643
  73.                                
  74.        
  75.                
  76.         }
  77.         else dat=0;
  78.         return dat;
  79. }

  80. void main()
  81. {
  82.         uchar test;
  83.         UartInit();
  84.         Lcd5110Init();  //初始化LCD模块
  85.         Lcd5110Clear(); //清屏幕

  86.         while (1)
  87.         {
  88.                 if (k4==0)
  89.                 {
  90.                         while (k4==0);
  91.                         sendAscii("$0003260130&");//打开激光
  92.                 }
  93.                 if (k3==0){
  94.                         while (k3==0);
  95.                         ErrorCode=0;
  96.                         stringLenth=28;
  97.                         aciiCount=0;//接收38个字符串就够了

  98.                         sendAscii("$00022123&");//单次测量  或者 关闭连续测量

  99.                 }
  100.                 if (k2==0){
  101.                         while (k2==0);
  102.                         stringLenth=38;
  103.                         aciiCount=0;//接收28个字符串就够了

  104.                         sendAscii("$00022426&");//开始连续测量

  105.                 }
  106.                 // Lcd5110String8x12(1,0,"1");
  107.                 // Lcd5110String8x12(0,0,"0");
  108.                 // Lcd5110String8x12(2,0,"2");
  109.                 // Lcd5110String8x12(3,0,"3");
  110.                 // Lcd5110String8x12(1,9,"3");
  111.                 // Lcd5110String6x8(1,28,"15-12-5");
  112.                 //Lcd5110String8x12(0,30,"06-27");
  113.                 //Lcd5110ShowHZ12X12(1,0,1);  //
  114.                 //Lcd5110String(1,54,"12:30");
  115.                 // Lcd5110String(2,0,"QQ:924958394");

  116.                 //Lcd5110show8x16AscAtAddr(0,17,'8');
  117.                 //Lcd5110show8x16AscAtAddr(3,17,'8');
  118. // Lcd5110DispHundredIn12x12(0,28,test);
  119. // Lcd5110show6x8AscWithNoAddr(32+16+1); // 要显示数字 32是之前指针减去的 ,+16是数字区的偏移量
  120. // Lcd5110show6x8AscWithNoAddr(48+2);

  121. // Lcd5110DispHundredIn6x8(2,28,test);
  122. // Lcd5110String6x8(2,50,"48");

  123. //Lcd5110DisplayAscii8x12AtAddr(0,25,94+32+2);
  124.                 Lcd5110ChineseString16x16(0,0,"激光测距仪");
  125.                 Lcd5110String6x8(2,0,"15-7-12 17:35");
  126.                 Lcd5110ShowHZ12X12(2,0,0); // 距
  127.                 Lcd5110ShowHZ12X12(2,12,1);  //离
  128.                 //Lcd5110String8x12(2,24,"00.125");
  129.                 Lcd5110ShowHZ12X12(2,72,9);   // 米
  130.                 ErrorCode=checkError();

  131.                 if (ErrorCode==0)
  132.                 {

  133.                         Lcd5110String8x12(3,0,"OK ");
  134.                         Lcd5110ShowHZ12X12(3,25,0);   // 距离无误
  135.                         Lcd5110ShowHZ12X12(3,37,1);   //
  136.                         Lcd5110ShowHZ12X12(3,49,4);   //
  137.                         Lcd5110ShowHZ12X12(3,61,3);   //

  138.                 }
  139.                 if (ErrorCode==15)
  140.                 {
  141.                         //clearUartSbuf();
  142.                         Lcd5110String8x12(3,0,"Err");

  143.                         Lcd5110ShowHZ12X12(3,25,0);   // 距离太近
  144.                         Lcd5110ShowHZ12X12(3,37,1);   //
  145.                         Lcd5110ShowHZ12X12(3,49,7);   //
  146.                         Lcd5110ShowHZ12X12(3,61,8);   //

  147.                 }
  148.                 if (ErrorCode==16)
  149.                 {
  150.                         //clearUartSbuf();
  151.                         Lcd5110String8x12(3,0,"Err");

  152.                         Lcd5110ShowHZ12X12(3,25,4);   // 距离太近
  153.                         Lcd5110ShowHZ12X12(3,37,5);   //
  154.                         Lcd5110ShowHZ12X12(3,49,6);   //
  155.                         Lcd5110ShowHZ12X12(3,61,15);   //

  156.                 }
  157.                 Lcd5110SetXY(24,3);
  158.                 Lcd5110show6x8AscWithNoAddr(uartSbuf[20]);
  159.                 Lcd5110show6x8AscWithNoAddr(uartSbuf[21]);
  160.                 Lcd5110show6x8AscWithNoAddr('.');
  161.                 Lcd5110show6x8AscWithNoAddr(uartSbuf[22]);
  162.                 Lcd5110show6x8AscWithNoAddr(uartSbuf[23]);
  163.                 Lcd5110show6x8AscWithNoAddr(uartSbuf[24]);
  164.                 Lcd5110show6x8AscWithNoAddr(uartSbuf[25]);
  165.                 Lcd5110show6x8AscWithNoAddr(uartSbuf[26]);

  166.                 //Lcd5110String8x12(3,0,"12345");

  167.         }

  168. }
  169. void uartRec()interrupt 4{
  170.         ES=0;//关闭中断

  171.         if (RI)
  172.         {
  173.                 RI=0;
  174.                 uartSbuf[aciiCount]=SBUF;
  175.                 aciiCount++;
  176.                 if (aciiCount>stringLenth) //根据各个模式截取合适长度的字符串
  177.                 {
  178.                         aciiCount=0;
  179.                 }
  180.         }
  181.         if (TI)
  182.         {
  183.                 TI=0;
  184.         }
  185.         ES=1;
  186. }
  187. void t0() interrupt 1
  188. {
  189.         static char i;
  190.         TL0 = 0x58;                //设置定时初值
  191.         TH0 = 0x9E;                //设置定时初值
  192.         i++;
  193.         if (i==20)
  194.         {
  195.                 i=0;
  196.                 Sysec++;

  197.         }
  198. }
复制代码

nokia5110lcd.c
  1. /*
  2. 1把控制器的 8位一个地址共6地址的方式,使用软件的方式重新划分为12位一个地址共4地址的方式进行12x12汉字显示目前只能能第0行往第3行显示

  3. 任意顺序的显示部分还没做
  4. 2只能上下对齐显示 这样只需要占用48byte的内存,如果任意地址错行显示,那就得需要168byte ,需要用iic存储器或者内置存eeprom,速度又太慢
  5. 3实现任意位置显示12高字体的显示,原理是从程序中分配一块内存 84*4字节, 分别用来存储四个半高数据,在初始化的时候把336个字节初始化位0即可

  6. */

  7. #include <reg51.h>
  8. #include"Nokia5110Lcd.h"
  9. #include "lcd5110font.c"

  10. #include<intrins.h>
  11. #define   nop() _nop_()
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14. sbit    res = P2^4;  //复位,0复位
  15. sbit    sce = P2^3;  //片选
  16. sbit    dc  = P2^2;  //1写数据,0写指令
  17. sbit    sdin = P2^1;  //数据
  18. sbit    sclk = P2^0;  //时钟
  19. uchar xdata Y0Ram[84]; //第0行汉字的临时缓存
  20. uchar xdata Y1Ram[84];
  21. uchar xdata Y2Ram[84];
  22. uchar xdata Y3Ram[84];
  23. void delay(int t)
  24. {
  25.         uchar i;
  26.         while(t--)
  27.         {
  28.                 for(i=0;i<125;i++)
  29.                 {}
  30.         }
  31. }
  32. void Lcd5110WriteDta(uchar dat)
  33. {
  34.         unsigned char i;
  35.         sce=0;       
  36.         dc=1;       
  37.         for(i=0;i<8;i++)
  38.         {
  39.                 if(dat&0x80)
  40.                         sdin=1;
  41.                 else
  42.                         sdin=0;
  43.                 dat=dat<<1;               
  44.                 sclk=0;
  45.                 nop();
  46.                 sclk=1;  
  47.         }       
  48.         dc=1;       
  49.         sce=1;       
  50.         sdin=1;
  51. }
  52. void Lcd5110WriteCMD(uchar dat)
  53. {
  54.                 unsigned char i;
  55.         sce=0;       
  56.         dc=0;       
  57.         for(i=0;i<8;i++)
  58.         {
  59.                 if(dat&0x80)
  60.                         sdin=1;
  61.                 else
  62.                         sdin=0;
  63.                 dat=dat<<1;               
  64.                 sclk=0;        
  65.                 nop();
  66.                 sclk=1;
  67.                  
  68.         }       
  69.         dc=1;       
  70.         sce=1;       
  71.         sdin=1;
  72. }
  73. /*---------------------------------------
  74. LCD_init: 3310LCD初始化
  75. 编写日期:20080918
  76. -----------------------------------------  */
  77. void Lcd5110Init(void)
  78. {
  79.         char i;
  80.         // res=0;
  81.         // delay(10);
  82.         // res=1; //以上三句 不用也行
  83.         Lcd5110WriteCMD(0x21 );//初始化Lcd,功能设定使用扩充指令
  84.         Lcd5110WriteCMD(0x9c );//设定液晶偏置电压
  85.         //Lcd5110WriteCMD(0xc0);//设定液晶偏置电压 //调试用 显示全黑
  86.         Lcd5110WriteCMD(0x02 );//温度校正
  87.           Lcd5110WriteCMD(0x13 );//1:48
  88.         Lcd5110WriteCMD(0x20 );//使用基本指令
  89.         Lcd5110WriteCMD(0x0C );//设定显示模式,正常显示
  90.         for(i=0;i<84;i++)
  91.         {
  92.                 Y0Ram[i]=Y1Ram[i]=Y2Ram[i]=Y3Ram[i]=0;
  93.         }
  94. }
  95. /*-------------------------------------------
  96. LCD_set_XY: 设置LCD坐标函数
  97. 输入参数:X:0-83  Y:0-5
  98. 编写日期:20080918
  99. ---------------------------------------------*/
  100. void Lcd5110SetXY(uchar X,Y)
  101. {
  102.         Lcd5110WriteCMD(0x40 | Y  );// 垂直方向 0-5
  103.         Lcd5110WriteCMD(0x80 | X  );// 水平方向0-83
  104. }
  105. /*------------------------------------------
  106. LCD_clear: LCD清屏函数
  107. 编写日期:20080918
  108. --------------------------------------------*/
  109. void Lcd5110Clear(void)
  110. {
  111.         unsigned char t;
  112.         unsigned char k;
  113.         Lcd5110SetXY(0,0);
  114.         for(t=0;t<6;t++)
  115.         {
  116.                 for(k=0;k<84;k++)
  117.                         Lcd5110WriteDta(0x00);
  118.         }
  119. }
  120. /*---------------------------------------------
  121. LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类

  122. addr:写入地址
  123. hang: 第几行 对于6*8点阵 实际5*7留有空边,字高8个点, 屏幕一共6行  竖着48个点
  124. dd:字符
  125. -----------------------------------------------*/
  126. void Lcd5110Write6x8AtAddr(uchar hang, addr, dat)
  127. {
  128.         unsigned char i;         
  129.        
  130.         dat=dat-32; //ascii转换为字库偏移地址
  131.         Lcd5110SetXY(addr, hang-1);// 某行的某个地址 行1-6地址0-83
  132.         for(i=0; i<6;i++)
  133.         {
  134.                 Lcd5110WriteDta(Ascii6x8[dat*6+i]);
  135.         }
  136.        
  137. }
  138. void Lcd5110show6x8AscWithNoAddr(uchar  dat)//显示一个6*8点阵
  139. {
  140.         uchar i;
  141.         dat-=32;
  142.         for(i=0; i<6;i++)
  143.                 Lcd5110WriteDta(Ascii6x8[dat*6+i]);
  144. }


  145. void Lcd5110String6x8(uchar hang , addr, uchar *p)
  146. {

  147.         Lcd5110SetXY(addr, hang);// 列,页
  148.        
  149.         while(*p!='\0')
  150.         {
  151.                 Lcd5110show6x8AscWithNoAddr(*p++);       
  152.         }

  153. }
  154. void Lcd5110show8x16AscAtAddr(uchar hang,addr,  dat)
  155. {
  156.         uchar i ;
  157.         dat-=32;
  158.         Lcd5110SetXY(addr,hang);
  159.         for(i=0; i<8;i++)
  160.                 Lcd5110WriteDta(Ascii8x16[dat*16+i]);
  161.         Lcd5110SetXY(addr,hang+1);
  162.          for(i=8; i<16;i++)
  163.                  Lcd5110WriteDta(Ascii8x16[dat*16+i]);
  164. }


  165. /*
  166. 行 范围 1-6一共6行,但在行=6的时候会显示不全
  167. */
  168. void Lcd5110String8x16(uchar hang , addr, uchar *p)
  169. {
  170.         //不再用8*16的ascii了,直接屏蔽掉,想用的时候在解除屏蔽即可
  171.         uchar dat;
  172.         while(*p!='\0')
  173.         {
  174.                 dat =*p;       
  175.                 Lcd5110show8x16AscAtAddr(hang-1 ,addr, dat);
  176.                 *p++;  
  177.                 addr+=8;
  178.         }
  179. }
  180. /*---------------------------------------------
  181. 显示一个16*16的汉字
  182. hang: 1-6行
  183. addr:这一行的第几个像素
  184. dat,要显示 字库中第几个数
  185. -----------------------------------------------*/
  186. void Lcd5110ShowHZ16X16(uchar hang,addr, dat)
  187. {
  188. //        现在不用16的汉字,都用12的,直接屏蔽掉,
  189.         unsigned char i;         
  190.        
  191.         Lcd5110SetXY(addr, hang);// 列,页
  192.         for(i=0; i<16;i++)  
  193.         {
  194.                 Lcd5110WriteDta(CH16x16[dat*32+i]);
  195.         }
  196.        
  197.     Lcd5110SetXY(addr, hang+1);// 列,页
  198.         for(i=16; i<32;i++)
  199.         {
  200.                 Lcd5110WriteDta(CH16x16[dat*32+i]);
  201.         }       
  202. }

  203. void Lcd5110DisplayAscii8x12AtAddr(uchar hang,addr, dat)
  204. {

  205.         uchar i, LocalHalfWidth,LocalFullWidth; //半宽字体,全宽字体
  206.         LocalHalfWidth=8;//8*12的字体,光看上面一半8字节
  207.         LocalFullWidth=16;//8*12的字体,上下两行就是16字节       
  208.        
  209.         dat-=32;
  210.         if(hang==0)//按照4行显示,首行为0,地址就是0-3行,不是控制器的地址
  211.         {
  212.                 Lcd5110SetXY(addr, hang);// 列,页
  213.                 for(i=0; i<LocalHalfWidth;i++)  //上半部分 12个像素
  214.                 {
  215.                         Lcd5110WriteDta(Ascii8x12[dat*LocalFullWidth+i]);
  216.                 }
  217.                 Lcd5110SetXY(addr, hang+1);// 列,页
  218.                 for(i=LocalHalfWidth; i<LocalFullWidth;i++)  //下半部分 12个像素
  219.                 {
  220.                         Y0Ram[addr+i-LocalHalfWidth]=Ascii8x12[dat*LocalFullWidth+i]; //第0行的下半部分12个字节存起来
  221.                         Lcd5110WriteDta(Y0Ram[addr+i-LocalHalfWidth] | Y1Ram[addr+i-LocalHalfWidth]<<4 );
  222.                 }

  223.         }
  224.         if(hang==1)
  225.         {
  226.                 Lcd5110SetXY(addr, hang);// 列,页
  227.                 for(i=0; i<LocalHalfWidth;i++)  //上半部分 12个像素
  228.                 {
  229.                         Y1Ram[addr+i]=Ascii8x12[dat*LocalFullWidth+i];//第1行上半部分存起来
  230.                         Lcd5110WriteDta(Y1Ram[addr+i]<<4 | Y0Ram[addr+i]);
  231.                 }
  232.                 Lcd5110SetXY(addr, hang+1);// 列,页
  233.                 for(i=LocalHalfWidth; i<LocalFullWidth;i++)  //下半部分 12个像素
  234.                 {
  235.                         Lcd5110WriteDta(Ascii8x12[dat*LocalFullWidth+i]<<4 | Ascii8x12[dat*LocalFullWidth+i-LocalHalfWidth]>>4  );
  236.                 }               

  237.         }

  238.         if(hang==2)//按照4行显示,首行为0,地址就是0-3行,不是控制器的地址
  239.         {
  240.                 Lcd5110SetXY(addr, hang+1);// 列,页
  241.                 for(i=0; i<LocalHalfWidth;i++)  //上半部分 12个像素
  242.                 {
  243.                         Lcd5110WriteDta(Ascii8x12[dat*LocalFullWidth+i]);
  244.                 }
  245.                 Lcd5110SetXY(addr, hang+2);// 列,页
  246.                 for(i=LocalHalfWidth; i<LocalFullWidth;i++)  //下半部分 12个像素
  247.                 {
  248.                         Y2Ram[addr+i-LocalHalfWidth]=Ascii8x12[dat*LocalFullWidth+i]; //第0行的下半部分12个字节存起来
  249.                         Lcd5110WriteDta(Y2Ram[addr+i-LocalHalfWidth] | Y3Ram[addr+i-LocalHalfWidth]<<4 );
  250.                 }       

  251.         }
  252.         if(hang==3)//按照4行显示的话,地址就是0-3行
  253.         {
  254.                 Lcd5110SetXY(addr, hang+1);// 列,页
  255.                 for(i=0; i<LocalHalfWidth;i++)  //上半部分 12个像素
  256.                 {
  257.                         Y3Ram[addr+i]=Ascii8x12[dat*LocalFullWidth+i];//第1行上半部分存起来
  258.                         Lcd5110WriteDta(Y3Ram[addr+i]<<4 | Y2Ram[addr+i]);
  259.                 }
  260.                 Lcd5110SetXY(addr, hang+2);// 列,页
  261.                 for(i=LocalHalfWidth; i<LocalFullWidth;i++)  //下半部分 12个像素
  262.                 {
  263.                         Lcd5110WriteDta(Ascii8x12[dat*LocalFullWidth+i]<<4 | Ascii8x12[dat*LocalFullWidth+i-LocalHalfWidth]>>4);
  264.                 }               

  265.         }       
  266. }

  267. void Lcd5110String8x12(uchar hang,addr,uchar *p)
  268. {
  269.         uchar dat;
  270.         while(*p!='\0')
  271.         {
  272.                 dat =*p;       
  273.                 Lcd5110DisplayAscii8x12AtAddr(hang ,addr, dat);
  274.                 *p++;  
  275.                 addr+=8;
  276.                 //delay(6000); //调试用 慢动作
  277.         }
  278. }
  279. /*---------------------------------------------
  280. 显示一个12*12的汉字
  281. hang: 0-3行
  282. addr:这一行的第几个像素
  283. dat,要显示 字库中第几个数
  284. -----------------------------------------------*/
  285. void Lcd5110ShowHZ12X12(uchar hang,addr, dat)  
  286. {
  287.         uchar i, LocalHalfWidth,LocalFullWidth; //半宽字体,全宽字体
  288.         LocalHalfWidth=12;//12*12的字体,光看上面一半12字节
  289.         LocalFullWidth=24;//12*12的字体,上下两行就是24字节
  290.         if(hang==0)//按照4行显示,首行为0,地址就是0-3行,不是控制器的地址
  291.         {
  292.                 Lcd5110SetXY(addr, hang);// 列,页
  293.                 for(i=0; i<LocalHalfWidth;i++)  //上半部分 12个像素
  294.                 {
  295.                         Lcd5110WriteDta(CH12x12[dat*LocalFullWidth+i]);
  296.                 }
  297.                 Lcd5110SetXY(addr, hang+1);// 列,页
  298.                 for(i=LocalHalfWidth; i<LocalFullWidth;i++)  //下半部分 12个像素
  299.                 {
  300.                         Y0Ram[addr+i-LocalHalfWidth]=CH12x12[dat*LocalFullWidth+i]; //第0行的下半部分12个字节存起来
  301.                         Lcd5110WriteDta(Y0Ram[addr+i-LocalHalfWidth] | Y1Ram[addr+i-LocalHalfWidth]<<4 );
  302.                 }

  303.         }
  304.         if(hang==1)
  305.         {
  306.                 Lcd5110SetXY(addr, hang);// 列,页
  307.                 for(i=0; i<LocalHalfWidth;i++)  //上半部分 12个像素
  308.                 {
  309.                         Y1Ram[addr+i]=CH12x12[dat*LocalFullWidth+i];//第1行上半部分存起来
  310.                         Lcd5110WriteDta(Y1Ram[addr+i]<<4 | Y0Ram[addr+i]);
  311.                 }
  312.                 Lcd5110SetXY(addr, hang+1);// 列,页
  313.                 for(i=LocalHalfWidth; i<LocalFullWidth;i++)  //下半部分 12个像素
  314.                 {
  315.                         Lcd5110WriteDta(CH12x12[dat*LocalFullWidth+i]<<4 | CH12x12[dat*LocalFullWidth+i-LocalHalfWidth]>>4  );
  316.                 }               

  317.         }

  318.         if(hang==2)//按照4行显示,首行为0,地址就是0-3行,不是控制器的地址
  319.         {
  320.                 Lcd5110SetXY(addr, hang+1);// 列,页
  321.                 for(i=0; i<LocalHalfWidth;i++)  //上半部分 12个像素
  322.                 {
  323.                         Lcd5110WriteDta(CH12x12[dat*LocalFullWidth+i]);
  324.                 }
  325.                 Lcd5110SetXY(addr, hang+2);// 列,页
  326.                 for(i=LocalHalfWidth; i<LocalFullWidth;i++)  //下半部分 12个像素
  327.                 {
  328.                         Y2Ram[addr+i-LocalHalfWidth]=CH12x12[dat*LocalFullWidth+i]; //第0行的下半部分12个字节存起来
  329.                         Lcd5110WriteDta(Y2Ram[addr+i-LocalHalfWidth] | Y3Ram[addr+i-LocalHalfWidth]<<4 );
  330.                 }       

  331.         }
  332.         if(hang==3)//按照4行显示的话,地址就是0-3行
  333.         {
  334.                 Lcd5110SetXY(addr, hang+1);// 列,页  
  335.                 for(i=0; i<LocalHalfWidth;i++)  //上半部分 12个像素
  336.                 {
  337.                         Y3Ram[addr+i]=CH12x12[dat*LocalFullWidth+i];//第1行上半部分存起来
  338.                         Lcd5110WriteDta(Y3Ram[addr+i]<<4 | Y2Ram[addr+i]);
  339.                 }
  340.                 Lcd5110SetXY(addr, hang+2);// 列,页
  341.                 for(i=LocalHalfWidth; i<LocalFullWidth;i++)  //下半部分 12个像素
  342.                 {
  343.                         Lcd5110WriteDta(CH12x12[dat*LocalFullWidth+i]<<4 | CH12x12[dat*LocalFullWidth+i-LocalHalfWidth]>>4);
  344.                 }               

  345.         }       
  346. }
  347. void DispOneChs16x16(uchar hang,addr,uchar *dat)
  348. {
  349.         uchar i,j;
  350.         for(j=0; j<2;j++)
  351.         {
  352.                 Lcd5110SetXY(addr, hang+j);// 列,页
  353.                 for(i=0; i<16;i++)         
  354.                         Lcd5110WriteDta(dat[16*j+i]);
  355.                
  356.         }       
  357. }
  358. /* */
  359. void DispOneChsFromTable16x16(uchar hang,addr, uchar *dat)
  360. {
  361.         uchar i;
  362.         for(i=0;i<LenthOfGbk16;i++) //索引
  363.         {
  364.                 if( (GBK16[i].Index[0] == dat[0]) && (GBK16[i].Index[1] == dat[1])) break;
  365.         }
  366.         switch (hang)
  367.         {
  368.                 case 0:hang=0;break;
  369.                 case 1:hang=2;break;
  370.                 case 2:hang=4;break;
  371.                 default:break;
  372.         }
  373.         DispOneChs16x16(hang,addr,GBK16[i].Matrix);               
  374.        
  375. }
  376. void Lcd5110ChineseString16x16(uchar hang,addr,uchar *dat)
  377. {
  378.         while(*dat)
  379.         {
  380.                 DispOneChsFromTable16x16(hang,addr,dat);
  381.                 addr+=16;
  382.                 dat+=2;
  383.                
  384.         }
  385. }
  386. /*使用一个6x8的字体显示一个3位整数*/
  387. void Lcd5110DispHundredIn6x8(uchar hang,addr, int dat)
  388. {
  389.         Lcd5110SetXY(addr,hang);
  390.         Lcd5110show6x8AscWithNoAddr(48+dat/100);
  391.         Lcd5110show6x8AscWithNoAddr(48+dat%100/10);
  392.         Lcd5110show6x8AscWithNoAddr(48+dat%100%10);       
  393. }
  394. //hang,地址,传入
  395. void Lcd5110DispHundredIn12x12(uchar hang,addr,int dat)
  396. {
  397.         Lcd5110DisplayAscii8x12AtAddr(hang,addr,48+dat/100);
  398.         Lcd5110DisplayAscii8x12AtAddr(hang,addr+8,48+dat%100/10);
  399.         Lcd5110DisplayAscii8x12AtAddr(hang,addr+16,48+dat%100%10);       
  400.        
  401. }
复制代码





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

使用道具 举报

沙发
ID:143278 发表于 2016-10-18 18:02 | 只看该作者
你好,请问arduino应该怎么设计激光测距仪程序呢?
回复

使用道具 举报

板凳
ID:151459 发表于 2016-12-1 15:34 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

无效楼层,该帖已经被删除
5#
ID:166553 发表于 2017-2-25 11:12 | 只看该作者
感谢楼主楼主,一直想做这方面,
回复

使用道具 举报

6#
ID:187802 发表于 2017-4-9 22:05 | 只看该作者
挺不错
回复

使用道具 举报

7#
ID:188069 发表于 2017-4-10 15:05 | 只看该作者
也正在准备做这个
回复

使用道具 举报

8#
ID:146492 发表于 2017-4-10 22:12 | 只看该作者
这个程序不错,可以学到不少东西,感谢
回复

使用道具 举报

9#
ID:84492 发表于 2017-4-13 11:10 | 只看该作者
非常感谢分享 ,  没做过但看了知道不少知识。
回复

使用道具 举报

10#
无效楼层,该帖已经被删除
11#
ID:197884 发表于 2017-5-7 20:45 | 只看该作者
很不错,学习一下!
回复

使用道具 举报

12#
ID:202754 发表于 2017-5-20 10:55 | 只看该作者
很不错,学习一下!
回复

使用道具 举报

13#
ID:202754 发表于 2017-5-20 10:56 | 只看该作者
学习一下!
回复

使用道具 举报

14#
ID:202754 发表于 2017-5-20 11:12 | 只看该作者
学习一下,好东西
回复

使用道具 举报

15#
ID:204894 发表于 2017-5-26 08:22 | 只看该作者
学习,不错,感谢分享
回复

使用道具 举报

16#
ID:207153 发表于 2017-6-4 15:25 | 只看该作者
大神,求教,我想将三个激光测距仪模块组合到一起三个发射器按不同角度排列,这样我可以测出三个距离,能不能用一个开发板直接读取三个测距仪的数据?
回复

使用道具 举报

17#
ID:95360 发表于 2017-6-10 20:27 | 只看该作者
非常感谢分享
回复

使用道具 举报

18#
ID:228316 发表于 2017-8-18 19:40 | 只看该作者
学习,不错,感谢分享
回复

使用道具 举报

19#
无效楼层,该帖已经被删除
20#
ID:230686 发表于 2017-9-3 14:18 来自手机 | 只看该作者
好东西阿,楼主
回复

使用道具 举报

21#
ID:242782 发表于 2017-10-25 14:32 | 只看该作者
厉害!!!!!
回复

使用道具 举报

22#
ID:263809 发表于 2017-12-19 17:21 | 只看该作者
好厉害!!
回复

使用道具 举报

23#
ID:6656 发表于 2018-2-8 14:16 | 只看该作者
只是串口读取和发送,还有LCD显示,对于相位测距原理没能从源码很好表示
回复

使用道具 举报

24#
ID:284625 发表于 2018-2-21 16:07 | 只看该作者

感谢楼主楼主
回复

使用道具 举报

25#
ID:378172 发表于 2018-7-23 20:36 | 只看该作者
感谢楼主 ,楼主威武
回复

使用道具 举报

26#
无效楼层,该帖已经被删除
27#
ID:352644 发表于 2018-8-16 09:06 | 只看该作者
不错,大师,学习了!
回复

使用道具 举报

28#
ID:242969 发表于 2018-12-5 12:38 | 只看该作者

不错,大师,学习了
回复

使用道具 举报

29#
ID:470897 发表于 2019-1-25 13:30 | 只看该作者
我的毕设有救了
回复

使用道具 举报

30#
无效楼层,该帖已经被删除
31#
ID:599611 发表于 2019-8-13 09:40 | 只看该作者
只是使用测距模块。没有设计测距模块内部。
回复

使用道具 举报

32#
ID:830793 发表于 2020-10-16 18:05 | 只看该作者
大侠有没有研究过同轴相位方式的激光测距
回复

使用道具 举报

33#
ID:808602 发表于 2020-10-19 09:39 | 只看该作者
现在τ 宝卖的激光测距成品,才58块,真是无敌了。
回复

使用道具 举报

34#
无效楼层,该帖已经被删除
35#
ID:871889 发表于 2021-1-1 17:41 | 只看该作者

你好,我现在也在做这个DIY小玩意,请问能把这个贴子的完整代码分享一下吗?十分感谢!
回复

使用道具 举报

36#
ID:1001552 发表于 2022-1-12 17:29 | 只看该作者
真的是太棒了,找了很久,希望可以下载看看
回复

使用道具 举报

37#
ID:462768 发表于 2022-2-28 06:59 | 只看该作者
可以买个成品,拆配件串口通信吗
回复

使用道具 举报

38#
ID:289218 发表于 2022-3-24 12:46 | 只看该作者
可以做个身高测量仪,感谢楼主分享~
回复

使用道具 举报

39#
无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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