利用光纖放大器顏色識(shí)別傳感器模塊(顏色光電色標(biāo)傳感器光纖放ER2-21M)設(shè)計(jì)位移檢測(cè)機(jī)構(gòu)。因?yàn)榉瓷湫偷墓饫w位移傳感器基本原理比較簡(jiǎn)單,整體設(shè)計(jì)是將步進(jìn)電機(jī)模塊與光纖傳感器模塊相結(jié)合而構(gòu)成,進(jìn)而實(shí)現(xiàn)簡(jiǎn)單的位移檢測(cè)。本文介紹了控制程序的生成、反射型光纖傳感器的工作原理、整個(gè)系統(tǒng)的構(gòu)成、以及步進(jìn)電機(jī)在位移檢測(cè)機(jī)構(gòu)中的作用及原理、光纖傳感器在系統(tǒng)中的作用。主要的目的就是實(shí)現(xiàn)對(duì)待測(cè)物體的短距離的位移測(cè)量,本文將以單片機(jī)為中心實(shí)現(xiàn)對(duì)電機(jī)的控制和對(duì)位移值的顯示的軟件設(shè)計(jì),將步進(jìn)電機(jī)與光纖傳感器等硬件結(jié)構(gòu)完整地搭建起來(lái)。
單片機(jī)源程序如下:
- #include "reg52.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define MotorTabNum 5
- unsigned char T0_NUM = 0;
- signed char g_MotorNum = 0;
- unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
- sbit CLK = P1^0; //PWM信號(hào)輸出端
- sbit FX = P1^1; //電機(jī)方向
- sbit P1_3 = P1^3; //電機(jī)開(kāi)關(guān)
- sbit MotorEn = P2^1; // 使能
- sbit K1 = P1^4; //開(kāi)關(guān)按鍵Key1
- sbit K2 = P1^5; //方向按鍵Key2
- sbit K3 = P1^6; //開(kāi)關(guān)按鍵Key3
- sbit K4 = P1^7; //方向按鍵Key4
- sbit SMG1 = P0^0; //數(shù)碼管第一位定義
- sbit SMG2 = P0^1; //數(shù)碼管第二位定義
- sbit SMG3 = P0^2; //數(shù)碼管第三位定義
- sbit SMG4 = P0^3; //數(shù)碼管第四位定義
- unsigned char g_MotorSt = 0; // 啟停
- unsigned char g_MotorDir = 0; // 正反
- int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40}; //共陰極數(shù)碼管段值
- void Init_t0(void); //子函數(shù)聲明
- void scan_key(void);
- void delayms(xms);
- void Display(void);
- void main()
- {
- FX=1;
- CLK = 0; //置PWM初始輸出為高電平
- P1_3 = 0;
- Init_t0();
- while(1)
- {
- scan_key();
- } //等待中斷
- }
- void scan_key(void)
- {
- #if 0
- if(0 == P1_5)
- {
- delayms(3);
- if(0 == P1_5)
- P1_1 = ~P1_1;
- }
- else if(0 == P1_4)
- {
- delayms(3);
- if(0 == P1_4)
- {
- if(TR0==1)
- TR0 = 0;
- else
- TR0 = 1;
- }
- }
- delayms(30);
- #endif
- if(K1 == 0)
- {
- delayms(10); // 軟件延時(shí)消抖
- if(K1 == 0)
- {
- while(!K1){Display();}; // 等待K1松開(kāi)
- g_MotorSt = g_MotorSt ^ 0x01;
- MotorEn ^= 1;
- if(TR0 == 0)
- {
- TR0 = 1;
- }
- else
- TR0 = 0;
- }
- }
- if(K2 == 0)
- {
- delayms(10); // 軟件延時(shí)消抖
- if(K2 == 0)
- {
- while(!K2){Display();}; // 等待K1松開(kāi)
- g_MotorDir = g_MotorDir ^ 0x01;
- FX ^= 1;
- }
- }
- if(K3 == 0) // 加速
- {
- delayms(10); // 軟件延時(shí)消抖
- if(K3 == 0)
- {
- while(!K3){Display();}; // 等待K1松開(kāi)
- g_MotorNum++;
- if(g_MotorNum > MotorTabNum)
- g_MotorNum = MotorTabNum;
- }
- }
- if(K4 == 0) // 減速
- {
- delayms(10); // 軟件延時(shí)消抖
- if(K4 == 0)
- {
- while(!K4){Display();}; // 等待K1松開(kāi)
- g_MotorNum--;
- if(g_MotorNum < 0)
- g_MotorNum = 0;
- }
- }
- }
- void Init_t0(void)
- TMOD=0x01; //設(shè)置定時(shí)器0工作方式1后面運(yùn)行TR位啟動(dòng)
- TH0=(65536-100)/256;
- TL0=(65536-100)%256; //1.5ms 的高電平
- EA=1;
- ET0=1;
- // TR0=1;
- }
- /*******************中斷服務(wù)程序**********************/
- void PWM0() interrupt 1 //定時(shí)器0中斷,產(chǎn)生方波
- {
- #if 0
- if(P1_0==1) //如果上個(gè)電平為1,則下個(gè)低電平的時(shí)間為18.5ms
- {
- TH0=(65536-18500)/256; //試過(guò)t1=1500;t0=20000-t1;但舵機(jī)老是吱吱的響,推測(cè):運(yùn)算耗時(shí).
- TL0=(65536-18500)%256;
- }
- else //如果上個(gè)電平為0,則下個(gè)高電平為1.5ms
- {
- TH0=(65536-8000)/256;
- TL0=(65536-8000)%256;
- }
- P1_0=~P1_0;
- #endif
- TH0 = (65535-100)/256;
- TL0 = (65535-100)%256;
- T0_NUM++;
- if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按鍵g_MotorNum++ 減小按鍵g_MotorNum--
- {
- T0_NUM = 0;
- CLK=CLK^0x01; // 輸出脈沖
- }
- }
- /********延時(shí)函數(shù)***********************************************************/
- void delayms(xms)
- {
- unsigned int x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--) ;
- }
- void Display(void)
- {
- unsigned char b1, b2;
- b1=g_MotorNum/10;
- b2=g_MotorNum%10;
- if(FX == 0)
- P0=0x71;//顯示F
- else
- P0=0x79;
- SMG1=0;
- delayms(3);
- SMG1=1;
- P0=0x40;
- SMG2=0;
- delayms(3);
- SMG2=1;
- P0=table[b1];
- SMG3=0; //顯示十位
- delayms(3);
- SMG3=1;
- P0=table[b2];
- SMG4=0;
- delayms(3); //顯示個(gè)位
- SMG4=1;
- }
-
復(fù)制代碼
所有資料51hei提供下載:
基于顏色識(shí)別傳感器模塊設(shè)計(jì)位移檢測(cè)機(jī)構(gòu).doc
(66.5 KB, 下載次數(shù): 9)
2018-3-7 11:27 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|