久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 34786|回復: 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黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:166553 發表于 2017-2-25 11:12 | 只看該作者
感謝樓主樓主,一直想做這方面,
回復

使用道具 舉報

5#
ID:187802 發表于 2017-4-9 22:05 | 只看該作者
挺不錯
回復

使用道具 舉報

6#
ID:188069 發表于 2017-4-10 15:05 | 只看該作者
也正在準備做這個
回復

使用道具 舉報

7#
ID:146492 發表于 2017-4-10 22:12 | 只看該作者
這個程序不錯,可以學到不少東西,感謝
回復

使用道具 舉報

8#
ID:84492 發表于 2017-4-13 11:10 | 只看該作者
非常感謝分享 ,  沒做過但看了知道不少知識。
回復

使用道具 舉報

9#
ID:197884 發表于 2017-5-7 20:45 | 只看該作者
很不錯,學習一下!
回復

使用道具 舉報

10#
ID:202754 發表于 2017-5-20 10:55 | 只看該作者
很不錯,學習一下!
回復

使用道具 舉報

11#
ID:202754 發表于 2017-5-20 10:56 | 只看該作者
學習一下!
回復

使用道具 舉報

12#
ID:202754 發表于 2017-5-20 11:12 | 只看該作者
學習一下,好東西
回復

使用道具 舉報

13#
ID:204894 發表于 2017-5-26 08:22 | 只看該作者
學習,不錯,感謝分享
回復

使用道具 舉報

14#
ID:207153 發表于 2017-6-4 15:25 | 只看該作者
大神,求教,我想將三個激光測距儀模塊組合到一起三個發射器按不同角度排列,這樣我可以測出三個距離,能不能用一個開發板直接讀取三個測距儀的數據?
回復

使用道具 舉報

15#
ID:95360 發表于 2017-6-10 20:27 | 只看該作者
非常感謝分享
回復

使用道具 舉報

16#
ID:228316 發表于 2017-8-18 19:40 | 只看該作者
學習,不錯,感謝分享
回復

使用道具 舉報

17#
ID:230686 發表于 2017-9-3 14:18 來自手機 | 只看該作者
好東西阿,樓主
回復

使用道具 舉報

18#
ID:242782 發表于 2017-10-25 14:32 | 只看該作者
厲害!!!!!
回復

使用道具 舉報

19#
ID:263809 發表于 2017-12-19 17:21 | 只看該作者
好厲害!!
回復

使用道具 舉報

20#
ID:6656 發表于 2018-2-8 14:16 | 只看該作者
只是串口讀取和發送,還有LCD顯示,對于相位測距原理沒能從源碼很好表示
回復

使用道具 舉報

21#
ID:284625 發表于 2018-2-21 16:07 | 只看該作者

感謝樓主樓主
回復

使用道具 舉報

22#
ID:378172 發表于 2018-7-23 20:36 | 只看該作者
感謝樓主 ,樓主威武
回復

使用道具 舉報

23#
ID:352644 發表于 2018-8-16 09:06 | 只看該作者
不錯,大師,學習了!
回復

使用道具 舉報

24#
ID:242969 發表于 2018-12-5 12:38 | 只看該作者

不錯,大師,學習了
回復

使用道具 舉報

25#
ID:470897 發表于 2019-1-25 13:30 | 只看該作者
我的畢設有救了
回復

使用道具 舉報

26#
ID:599611 發表于 2019-8-13 09:40 | 只看該作者
只是使用測距模塊。沒有設計測距模塊內部。
回復

使用道具 舉報

27#
ID:830793 發表于 2020-10-16 18:05 | 只看該作者
大俠有沒有研究過同軸相位方式的激光測距
回復

使用道具 舉報

28#
ID:808602 發表于 2020-10-19 09:39 | 只看該作者
現在τ 寶賣的激光測距成品,才58塊,真是無敵了。
回復

使用道具 舉報

29#
ID:871889 發表于 2021-1-1 17:41 | 只看該作者

你好,我現在也在做這個DIY小玩意,請問能把這個貼子的完整代碼分享一下嗎?十分感謝!
回復

使用道具 舉報

30#
ID:1001552 發表于 2022-1-12 17:29 | 只看該作者
真的是太棒了,找了很久,希望可以下載看看
回復

使用道具 舉報

31#
ID:462768 發表于 2022-2-28 06:59 | 只看該作者
可以買個成品,拆配件串口通信嗎
回復

使用道具 舉報

32#
ID:289218 發表于 2022-3-24 12:46 | 只看該作者
可以做個身高測量儀,感謝樓主分享~
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频一区在线观看 | 日本精品视频在线 | 成人免费视频 | 日韩av一区二区在线 | 久久视频精品 | 久草高清视频 | 中文字幕中文字幕 | 美日韩中文字幕 | 一区二区三区欧美 | 国产成人精品免费视频大全最热 | 国产精品18hdxxxⅹ在线 | 91在线一区二区三区 | 久久久久久久久国产 | 亚洲成人一级片 | 91久久综合亚洲鲁鲁五月天 | 国产色网站 | 日韩理论电影在线观看 | 欧美色图综合网 | 亚洲一区二区三区免费在线 | 99资源站 | 中文字幕第一页在线 | 日韩精品免费播放 | 国产精品视屏 | 午夜视频在线免费观看 | 黄色骚片 | 国产大毛片 | 特级毛片 | 国产午夜精品久久久久 | 天天操天天摸天天干 | 精品欧美激情精品一区 | 精品综合 | 精品欧美一区二区三区 | aaa在线观看 | h视频在线观看免费 | 成人一区二区三区在线 | 欧美在线a | 国产精品久久久久久久久久久久久久 | 91视视频在线观看入口直接观看 | 国产精品综合视频 | 国产美女一区二区 | 日韩欧美亚洲 |