找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于颜色识别传感器模块设计位移检测机构

[复制链接]
跳转到指定楼层
楼主
ID:271398 发表于 2018-3-7 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用光纤放大器颜色识别传感器模块(颜色光电色标传感器光纤放ER2-21M)设计位移检测机构。因为反射型的光纤位移传感器基本原理比较简单,整体设计是将步进电机模块与光纤传感器模块相结合而构成,进而实现简单的位移检测。本文介绍了控制程序的生成、反射型光纤传感器的工作原理、整个系统的构成、以及步进电机在位移检测机构中的作用及原理、光纤传感器在系统中的作用。主要的目的就是实现对待测物体的短距离的位移测量,本文将以单片机为中心实现对电机的控制和对位移值的显示的软件设计,将步进电机与光纤传感器等硬件结构完整地搭建起来。


单片机源程序如下:
  1. #include "reg52.h"
  2. #define uint unsigned int         
  3. #define uchar unsigned char
  4. #define MotorTabNum 5
  5. unsigned char T0_NUM = 0;
  6. signed char g_MotorNum = 0;
  7. unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
  8. sbit CLK = P1^0;                       //PWM信号输出端
  9. sbit FX = P1^1;                       //电机方向
  10. sbit P1_3 = P1^3;                                                //电机开关
  11. sbit MotorEn = P2^1;     // 使能
  12. sbit K1 = P1^4;                                                //开关按键Key1         
  13. sbit K2 = P1^5;                                                //方向按键Key2           
  14. sbit K3 = P1^6;                                                //开关按键Key3         
  15. sbit K4 = P1^7;                                                //方向按键Key4
  16. sbit SMG1 = P0^0;                                        //数码管第一位定义
  17. sbit SMG2 = P0^1;                                        //数码管第二位定义
  18. sbit SMG3 = P0^2;                                        //数码管第三位定义
  19. sbit SMG4 = P0^3;                                        //数码管第四位定义
  20. unsigned char g_MotorSt = 0;     // 启停
  21. unsigned char g_MotorDir = 0;    // 正反
  22. int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};           //共阴极数码管段值     
  23. void Init_t0(void);                        //子函数声明     
  24. void scan_key(void);
  25. void delayms(xms);
  26. void Display(void);         
  27. void main()  
  28. {      
  29.                 FX=1;  
  30.         CLK = 0;                                                         //置PWM初始输出为高电平   
  31.                 P1_3 = 0;                                                     
  32.         Init_t0();
  33.         while(1)
  34.                 {
  35.                         scan_key();
  36.                 }                                //等待中断
  37. }
  38. void scan_key(void)
  39. {
  40. #if 0
  41.         if(0 == P1_5)
  42.         {
  43.                 delayms(3);
  44.                 if(0 == P1_5)
  45.                         P1_1 = ~P1_1;
  46.         }
  47.         else if(0 == P1_4)
  48.         {
  49. delayms(3);
  50.                 if(0 == P1_4)
  51.                 {
  52.                         if(TR0==1)
  53.                                  TR0 = 0;
  54.                         else
  55.                                 TR0 = 1;
  56.                 }
  57.         }
  58.         delayms(30);
  59. #endif
  60.         if(K1 == 0)
  61.         {
  62.                 delayms(10);   // 软件延时消抖
  63.                 if(K1 == 0)
  64.                 {
  65.                         while(!K1){Display();};  // 等待K1松开
  66.                         g_MotorSt = g_MotorSt ^ 0x01;
  67.                         MotorEn ^= 1;
  68.                         if(TR0 == 0)
  69.                         {
  70.                                 TR0 = 1;
  71.                         }
  72.                         else
  73.                                 TR0 = 0;
  74.                 }
  75.         }
  76.         if(K2 == 0)
  77.         {
  78.                 delayms(10);   // 软件延时消抖
  79.                 if(K2 == 0)
  80. {
  81.                         while(!K2){Display();};        // 等待K1松开
  82.                         g_MotorDir = g_MotorDir ^ 0x01;
  83.                         FX ^= 1;
  84.                 }
  85.         }
  86.         if(K3 == 0)  // 加速
  87.         {
  88.                 delayms(10);   // 软件延时消抖
  89.                 if(K3 == 0)
  90.                 {
  91.                         while(!K3){Display();};        // 等待K1松开
  92.                         g_MotorNum++;
  93.                         if(g_MotorNum > MotorTabNum)
  94.                                 g_MotorNum = MotorTabNum;
  95.                 }
  96.         }
  97.         if(K4 == 0)  // 减速
  98.         {
  99.                 delayms(10);   // 软件延时消抖
  100.                 if(K4 == 0)
  101.                 {
  102.                         while(!K4){Display();};        // 等待K1松开
  103.                         g_MotorNum--;
  104.                         if(g_MotorNum < 0)
  105.                                 g_MotorNum = 0;
  106.                 }
  107.         }
  108. }
  109. void Init_t0(void)

  110.         TMOD=0x01;                  //设置定时器0工作方式1后面运行TR位启动
  111.         TH0=(65536-100)/256;
  112.         TL0=(65536-100)%256;         //1.5ms 的高电平
  113.         EA=1;
  114.         ET0=1;
  115. //       TR0=1;         
  116. }
  117. /*******************中断服务程序**********************/  

  118. void PWM0() interrupt 1         //定时器0中断,产生方波
  119. {  
  120. #if 0
  121.         if(P1_0==1)                         //如果上个电平为1,则下个低电平的时间为18.5ms
  122.         {  
  123.                 TH0=(65536-18500)/256;                 //试过t1=1500;t0=20000-t1;但舵机老是吱吱的响,推测:运算耗时.
  124.                 TL0=(65536-18500)%256;
  125.         }
  126.         else                                         //如果上个电平为0,则下个高电平为1.5ms
  127.         {
  128.                 TH0=(65536-8000)/256;
  129.                 TL0=(65536-8000)%256;
  130.         }
  131.         P1_0=~P1_0;
  132. #endif
  133.         TH0 = (65535-100)/256;   
  134.         TL0 = (65535-100)%256;
  135. T0_NUM++;
  136.         if(T0_NUM >= MotorTab[g_MotorNum])        // 增加按键g_MotorNum++   减小按键g_MotorNum--
  137.         {
  138.                 T0_NUM = 0;
  139.                 CLK=CLK^0x01;               //   输出脉冲
  140.         }
  141. }
  142. /********延时函数***********************************************************/
  143. void delayms(xms)
  144. {
  145.          unsigned int x,y;
  146.          for(x=xms;x>0;x--)
  147.                  for(y=110;y>0;y--)                ;
  148. }
  149. void Display(void)
  150. {
  151.         unsigned char b1, b2;
  152.         b1=g_MotorNum/10;               
  153.     b2=g_MotorNum%10;
  154.         if(FX == 0)
  155.                 P0=0x71;//显示F
  156.     else
  157.                 P0=0x79;
  158.         SMG1=0;                                                         
  159.     delayms(3);
  160.     SMG1=1;

  161.         P0=0x40;
  162. SMG2=0;
  163.          delayms(3);
  164.     SMG2=1;
  165.         P0=table[b1];
  166.         SMG3=0;                                                         //显示十位
  167.         delayms(3);
  168.         SMG3=1;
  169.         P0=table[b2];
  170.     SMG4=0;
  171.     delayms(3);                                                 //显示个位
  172.     SMG4=1;
  173. }
  174.        
复制代码

所有资料51hei提供下载:
基于颜色识别传感器模块设计位移检测机构.doc (66.5 KB, 下载次数: 9)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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