找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 11689|回復(fù): 16
收起左側(cè)

STC15單片機(jī)測(cè)量位移 電路原理圖 PCB 程序源代碼

  [復(fù)制鏈接]
ID:124161 發(fā)表于 2016-6-7 16:40 | 顯示全部樓層 |閱讀模式
       0.png    0.png


       本系統(tǒng),主要用于測(cè)量實(shí)驗(yàn)臺(tái)移動(dòng)的位移。單片機(jī)通過(guò)步進(jìn)電機(jī)驅(qū)動(dòng)器控制步進(jìn)電機(jī)轉(zhuǎn)動(dòng),從而驅(qū)動(dòng)實(shí)驗(yàn)臺(tái)在導(dǎo)軌上的水平位移,再通過(guò)位移傳感器實(shí)時(shí)檢測(cè)位移值,并可以通過(guò)LCD1602或串口屏顯示位移值和其他一些參數(shù)。
        本系統(tǒng)采用STC15W4KS32單片機(jī)為控制核心,其上的44個(gè)引腳全部引出,該控制器既可以實(shí)現(xiàn)驅(qū)動(dòng)電機(jī)和顯示位移功能,還可以充當(dāng)51學(xué)習(xí)開發(fā)板的功能。

0.png

電路原理圖:
0.png

二、接口資源分配
1 單片機(jī)最小系統(tǒng)
MCU:STC15W4KS32,這里選用LQFP44封裝。
資源簡(jiǎn)介:42個(gè)I/O,4KB RAM,32KB FLASH,810ADC通道,SPI接口,4路串口。價(jià)格:6元左右。
晶振電路(可選)
復(fù)位電路(可選)
下載電路:串口下載或USB下載(可選)
2 步進(jìn)電機(jī)驅(qū)動(dòng)器
PUL-P1.0
DIR-P1.1
其余四個(gè)引腳接5V電源。
3 LCD1602顯示模塊
需要11個(gè)GPIO。
4 LED燈指示
電源指示燈1個(gè),上電即亮;
運(yùn)行指示燈2個(gè),正轉(zhuǎn)和反轉(zhuǎn)各1個(gè),不同顏色;
報(bào)警指示燈1個(gè)。
5 蜂鳴器指示
需要1個(gè)GPIO。
6傳感器接口電路
電阻式位移傳感器,輸出0~5V,需要接到單片機(jī)的AD接口上,進(jìn)行AD轉(zhuǎn)換。
方案1:使用單片機(jī)內(nèi)部的10AD轉(zhuǎn)換器,理論上講,剛好能夠滿足要求,電路按照芯片手冊(cè)設(shè)計(jì);
方案2:使用AD7705模塊,該模塊擁有16位轉(zhuǎn)換精度,SPI接口,能夠保證系統(tǒng)對(duì)精度的要求。
控制板上預(yù)留模塊接口,如果內(nèi)部ADC無(wú)法滿足要求,直接用更高精度ADC模塊。
7 按鍵接口
啟動(dòng)1個(gè),停止1個(gè),正反轉(zhuǎn)1個(gè),預(yù)留1個(gè)。
8 電源部分
全部采用5V供電。
9 串口通信電路
預(yù)留了2路串行通信接口,一路為下載,另一路可用作通信,進(jìn)行串口調(diào)試。
一、本系統(tǒng)的創(chuàng)新之處
1、原理圖的繪制,采用九宮格形式,清晰容易理解。
2、雙電源供電,既可以使用5V電源適配器,也可以使用USB電源,USB可來(lái)自電腦,也可以來(lái)自隨手可得的手機(jī)充電器;使用一個(gè)撥動(dòng)開關(guān)進(jìn)行切換,既方便又提高了產(chǎn)品的靈活性;
3、雙下載方式,既可以使用RS-232串口進(jìn)行下載,也可以使用USB下載方式,這里,用到了STC15W4KS32的獨(dú)特下載方式,其他51系列單片機(jī)暫不具備此功能;
4、雙路選擇ADC轉(zhuǎn)換,一路為片內(nèi)自帶ADC模塊,預(yù)留了基準(zhǔn)參考電路,一般情況下,可以選擇不焊接;另一路為高精度的AD7705模塊接口,當(dāng)片內(nèi)自帶的ADC模塊難以滿足高精度要求時(shí),采用成熟可靠的ADC模塊;
5、雙路顯示接口,正常情況下,選擇LCD1602液晶屏,可以顯示字母、數(shù)字和字符,滿足系統(tǒng)要求,如果想要現(xiàn)實(shí)漢字,可以選用OLED顯示模塊,LCD1602接口同時(shí)兼容OLED模塊,所以一個(gè)接口滿足了2個(gè)需求;
6、雙路LED燈顯示,一路為貼片式,減少了體積,同時(shí),還增加了直插式LED燈,滿足將來(lái)做外殼時(shí),為了方便觀察,需要把LED燈露在外殼表面,沒(méi)做外殼前,可不焊接直插式;
7、步進(jìn)電機(jī)驅(qū)動(dòng)器接口為6線插座,與接口一一對(duì)應(yīng),即插即用;釋放功能可用。
8、雙串口通信,這款單片機(jī)本身?yè)碛?個(gè)串口,這里使用了2個(gè),滿足要求;
9、雙路按鍵,既有4個(gè)獨(dú)立按鍵,又預(yù)留了矩陣鍵盤接口,將來(lái)做外殼時(shí),按鍵可以有多種選擇,總共有8個(gè)接口,非常靈活;
10、         預(yù)留了一個(gè)IIC傳感器接口,既可以接常用的18B20溫度傳感器,又可以接AM2320溫濕度傳感器;
11、         最小系統(tǒng)非常簡(jiǎn)單,晶振電路和復(fù)位電路都可以省去,但是預(yù)留了相應(yīng)電路,覺(jué)得有必要可以焊上。
系統(tǒng)簡(jiǎn)介
       本系統(tǒng),主要用于測(cè)量實(shí)驗(yàn)臺(tái)移動(dòng)的位移。單片機(jī)通過(guò)步進(jìn)電機(jī)驅(qū)動(dòng)器控制步進(jìn)電機(jī)轉(zhuǎn)動(dòng),從而驅(qū)動(dòng)實(shí)驗(yàn)臺(tái)在導(dǎo)軌上的水平位移,再通過(guò)位移傳感器實(shí)時(shí)檢測(cè)位移值,并可以通過(guò)LCD1602或串口屏顯示位移值和其他一些參數(shù)。
       本系統(tǒng)采用STC15W4KS32單片機(jī)為控制核心,其上的44個(gè)引腳全部引出,該控制器既可以實(shí)現(xiàn)驅(qū)動(dòng)電機(jī)和顯示位移功能,還可以充當(dāng)51學(xué)習(xí)開發(fā)板的功能。


測(cè)量位移的源程序:


  1. #include "key.h"
  2. uint num1=900;
  3. uchar dir_flag;                                //定義全局變量
  4. uchar key_flag=0;                        //點(diǎn)動(dòng)或連動(dòng)標(biāo)志,指示某個(gè)鍵被按下,點(diǎn)動(dòng) 1,連動(dòng) 2


  5. /*********************按鍵掃描函數(shù)*********
  6. 功能介紹:
  7. key1:左方向,點(diǎn)動(dòng);
  8. key2:左方向,連動(dòng);
  9. key3:右方向,連動(dòng);
  10. key1:右方向,點(diǎn)動(dòng);
  11. ********************************************/
  12. /*
  13. void keyscan()
  14. {
  15.            
  16.                 if((key1==0)&&(left_dir_key==1))
  17.                    {
  18.                          delay_ms(5);                 
  19.                         if(key1==0)
  20.                            TR0=1;
  21. //                            TR0=~TR0;
  22.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  23.                            DIR_DRIVER=1;                //方向控制
  24.                            dir_flag=1;                                   //向左前進(jìn)
  25.                                 key_flag=1;  
  26.                                 delay_ms(5);
  27. //                                adc++;
  28.                          while(!key1);
  29.                            TR0=0;
  30.                     }

  31.                 else if((key2==0)&&(left_dir_key==1))
  32.                    {
  33.                          delay_ms(5);
  34.                         if(key2==0)
  35.                           TR0=~TR0;
  36.                           EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  37.                           DIR_DRIVER=1;                        //方向控制
  38.                           dir_flag=1;                                   //向左前進(jìn)
  39.                                   key_flag=2;        
  40.                          while(!key2);
  41.                     }

  42.                 else if((key3==0)&&(right_dir_key==1))
  43.                    {
  44.                          delay_ms(5);         
  45.                         if(key3==0)
  46.                            TR0=~TR0;
  47.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  48.                            DIR_DRIVER=0;                //方向控制
  49.                            dir_flag=2;                                   //向左前進(jìn)
  50.                            key_flag=2;        
  51.                          while(!key3);
  52.                     }

  53.                 else if((key4==0)&&(right_dir_key==1))
  54.                    {
  55.                          delay_ms(5);         
  56.                         if(key4==0)
  57. //                           TR0=~TR0;
  58.                            TR0=1;
  59.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  60.                            DIR_DRIVER=0;                //方向控制
  61.                            dir_flag=2;                                   //向左前進(jìn)
  62.                            key_flag=1;        
  63.                            delay_ms(5);
  64.                          while(!key4);
  65.                            TR0=0;
  66.                     }
  67.                 else
  68. //                         TR0=0;                //關(guān)閉定時(shí)器0
  69.                
  70.                 ;
  71. //                        EN_DRIVER=0;                //電機(jī)釋放,保護(hù)電機(jī)        

  72. }

  73. */
  74. /*********************電機(jī)控制,
  75.                                         先進(jìn)行距離狀態(tài)的判定,
  76.                                         當(dāng) 100>adc,左邊方向按鍵失效;
  77.                                         當(dāng) 100=<adc=<900,四個(gè)方向按鍵均有效;
  78.                                         當(dāng) 900<adc,右邊方向按鍵失效。

  79. *************************/
  80. void Motor_Control(void)
  81. {
  82.         if(adc_dis<100)
  83.         {
  84.                  EN_DRIVER=0;                        //關(guān)閉電機(jī)
  85.                  if(key3==0)
  86.                            {
  87.                          delay_ms(5);                 
  88.                         if(key3==0)
  89.                            TR0=1;                                 //點(diǎn)動(dòng)模式
  90.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  91.                            DIR_DRIVER=1;                //方向控制
  92.                            key_flag=1;
  93.                            dir_flag=2;                           //向右前進(jìn)
  94.                                 delay_ms(5);
  95.                          while(!key3);
  96.                            TR0=0;
  97.                     }

  98.                  if(key4==0)
  99.                    {
  100.                          delay_ms(5);
  101.                         if(key4==0)
  102.                           TR0=~TR0;                                //連動(dòng)模式
  103.                           EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  104.                           DIR_DRIVER=1;                        //方向控制
  105.                           key_flag=2;
  106.                           dir_flag=2;                           //向右前進(jìn)
  107.                          while(!key4);
  108.                     }        
  109.         }

  110.         else if((100<=adc_dis)&&(adc_dis<=900))
  111.         {        
  112.                 if(key1==0)
  113.                            {
  114.                          delay_ms(5);                 
  115.                         if(key1==0)
  116.                            TR0=1;                                //點(diǎn)動(dòng)模式
  117.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  118.                            DIR_DRIVER=0;                //方向控制
  119.                            key_flag=1;
  120.                            dir_flag=1;                           //向左前進(jìn)
  121.                                 delay_ms(5);
  122.                          while(!key1);
  123.                            TR0=0;
  124.                     }

  125.                 else if(key2==0)
  126.                    {
  127.                          delay_ms(5);
  128.                         if(key2==0)
  129.                           TR0=~TR0;                                 //連動(dòng)模式
  130.                           EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  131.                           DIR_DRIVER=0;                        //方向控制
  132.                           key_flag=2;
  133.                           dir_flag=1;                           //向左前進(jìn)        
  134.                          while(!key2);
  135.                     }

  136.                 else if(key3==0)
  137.                    {
  138.                          delay_ms(5);         
  139.                         if(key3==0)
  140.                            TR0=~TR0;                        //連動(dòng)模式
  141.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  142.                            DIR_DRIVER=1;                //方向控制
  143.                            key_flag=2;
  144.                            dir_flag=2;                           //向右前進(jìn)        
  145.                          while(!key3);
  146.                     }

  147.                 else if(key4==0)
  148.                    {
  149.                          delay_ms(5);         
  150.                         if(key4==0)
  151.                            TR0=1;                                //點(diǎn)動(dòng)模式
  152.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  153.                            DIR_DRIVER=1;                //方向控制
  154.                            key_flag=1;
  155.                            dir_flag=2;                           //向右前進(jìn)
  156.                            delay_ms(5);
  157.                          while(!key4);
  158.                            TR0=0;
  159.                     }
  160.                   else
  161.                   ;
  162.         
  163.         }
  164.         else if(adc_dis>900)
  165.         {
  166.           EN_DRIVER=0;                        //關(guān)閉電機(jī)
  167.                     if(key1==0)
  168.                    {
  169.                          delay_ms(5);         
  170.                         if(key1==0)
  171.                            TR0=1;                                //點(diǎn)動(dòng)模式
  172.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  173.                            DIR_DRIVER=0;                //方向控制
  174.                            key_flag=1;
  175.                            dir_flag=1;                           //向左前進(jìn)        
  176.                            delay_ms(5);
  177.                          while(!key1);
  178.                            TR0=0;
  179.                     }
  180.                     if(key2==0)
  181.                    {
  182.                         delay_ms(5);         
  183.                         if(key2==0)
  184.                            TR0=~TR0;                        //連動(dòng)模式
  185.                            EN_DRIVER=1;                        //啟動(dòng)電機(jī)
  186.                            DIR_DRIVER=0;                //方向控制
  187.                            key_flag=2;
  188.                            dir_flag=1;                           //向左前進(jìn)        
  189.                          while(!key2);
  190.                     }

  191.         }                                                                                                                                             
  192.         else
  193.         ;

  194. }

  195.         
復(fù)制代碼


0.png
全部資料(壓縮包)下載:



STC15.zip

129.36 KB, 下載次數(shù): 107, 下載積分: 黑幣 -5

原理圖和PCB.zip

739.92 KB, 下載次數(shù): 125, 下載積分: 黑幣 -5

基于STC15單片機(jī)的測(cè)距系統(tǒng).rar

54.88 KB, 下載次數(shù): 111, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 2黑幣 +57 收起 理由
wuke960422 + 30 很給力!
wqphdh + 27 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:153199 發(fā)表于 2017-1-24 16:59 | 顯示全部樓層
不錯(cuò)的帖子,很值得收藏。
回復(fù)

使用道具 舉報(bào)

ID:64765 發(fā)表于 2017-4-25 10:34 | 顯示全部樓層
不錯(cuò)的帖子,很值得收藏。
回復(fù)

使用道具 舉報(bào)

ID:193918 發(fā)表于 2017-4-27 17:33 | 顯示全部樓層
不錯(cuò)的帖子,很值得收藏。
回復(fù)

使用道具 舉報(bào)

ID:16642 發(fā)表于 2017-6-2 22:48 | 顯示全部樓層
好祥細(xì)。。。
回復(fù)

使用道具 舉報(bào)

ID:95360 發(fā)表于 2017-6-9 15:40 | 顯示全部樓層
不錯(cuò)的帖子,很值得收藏
回復(fù)

使用道具 舉報(bào)

ID:433641 發(fā)表于 2018-11-26 18:57 | 顯示全部樓層
不錯(cuò)的帖子,值得收藏
回復(fù)

使用道具 舉報(bào)

ID:153520 發(fā)表于 2018-12-25 20:11 | 顯示全部樓層
需要該資源..
回復(fù)

使用道具 舉報(bào)

ID:153520 發(fā)表于 2018-12-25 20:12 | 顯示全部樓層
這個(gè)狀態(tài)圖是怎么畫的,用的什么軟件...
回復(fù)

使用道具 舉報(bào)

ID:153520 發(fā)表于 2018-12-25 20:39 | 顯示全部樓層
版主啊,幫忙收費(fèi)低點(diǎn)啊,沒(méi)錢啊
回復(fù)

使用道具 舉報(bào)

ID:454887 發(fā)表于 2018-12-25 21:17 | 顯示全部樓層
不錯(cuò)的帖子,很值得收藏
回復(fù)

使用道具 舉報(bào)

ID:511458 發(fā)表于 2019-4-13 19:58 | 顯示全部樓層
不錯(cuò)的帖子,很值得收藏
回復(fù)

使用道具 舉報(bào)

ID:494577 發(fā)表于 2019-9-20 16:24 | 顯示全部樓層
最近正需要這方面的資料,關(guān)于電阻式位移傳感器的應(yīng)用。多謝
回復(fù)

使用道具 舉報(bào)

ID:494577 發(fā)表于 2019-9-20 16:43 | 顯示全部樓層
想問(wèn)下樓主買的電阻式位移傳感器是什么型號(hào)的?能告訴具體的型號(hào)嗎
回復(fù)

使用道具 舉報(bào)

ID:24486 發(fā)表于 2020-3-4 22:43 | 顯示全部樓層
不錯(cuò)的帖子,很值得收藏。
回復(fù)

使用道具 舉報(bào)

ID:24486 發(fā)表于 2020-3-14 15:24 | 顯示全部樓層
謝謝分享,下來(lái)看看。
回復(fù)

使用道具 舉報(bào)

ID:708014 發(fā)表于 2020-3-14 23:40 | 顯示全部樓層
學(xué)習(xí)了謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表