Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7679657
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2011-03-25 12:52:45

  1. /*******************************************
  2. * 文件名:TCS230.c
  3. * 功能: 读取RGB值
  4. * 说明:
  5. * 时间:2011-3-20
  6. /********************************************/
  7. #include <reg51.h>
  8. #include <intrins.h>

  9. #define uchar unsigned char
  10. #define uint unsigned int

  11. /**引脚定义**/
  12. sbit oe=P1^0;    
  13. sbit s0=P1^2;
  14. sbit s1=P1^3;
  15. sbit s2=P1^5;
  16. sbit s3=P1^4;

  17. //变量、常量定义

  18. long int color,red,green,blue;
  19. long int disp_tc;    
  20. long int buf_cor;    //颜色值

  21. uint rp=3,gp=6,bp=3;    //定义比例因子

  22. uchar disp_p;    //颜色标志位(0:红 1:绿 2:蓝)


  23. //数组

  24. uchar disp_buf[3]={0xff,0xff,0xff};    //临时保存当前的色值

  25. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x08,0x42,0x00};/*数码管花数*/
  26. uchar code scan[4]={0x8f,0x4f,0x2f,0x0f};    /*数码管位选*/

  27. /*******************************************
  28. * 函数名称: t0_init()
  29. * 函数功能: 定时器0初始化
  30. * 入口参数: 无
  31. * 出口参数: 无
  32. /********************************************/
  33. void t0_init()
  34. {
  35.      TMOD=0x51;        //T1计数 T0定时 工作方式1

  36.      TH0=0x3C;        //定时50ms

  37.      TL0=0xB0;
  38.      TH1=0xFF;        //计数初值

  39.      TL1=0x9C;
  40.      EA=1;            //开中断

  41.      ET0=1;        
  42.      TR0=1;            //启动

  43.      TR1=1;
  44. }

  45. /*******************************************
  46. * 函数名称: delay_1ms(uint w)
  47. * 函数功能: 延时1mx
  48. * 入口参数: 无符号整形W
  49. * 出口参数: 无
  50. /********************************************/
  51. void delay_1ms(uint w)    
  52. {
  53.      uint y,z;
  54.      for(z=w;z>0;z--)
  55.         for(y=100;y>0;y--);
  56. }

  57. /*******************************************
  58. * 函数名称: feed_buf()
  59. * 函数功能: 根据颜色标志位disp_p,读取当前检测
  60.             到的色值,并保存到disp_buf[]
  61. * 入口参数: 无
  62. * 出口参数: 无
  63. /********************************************/
  64. void feed_buf()
  65. {
  66.     //依次读取红、绿、蓝色值

  67.      if(disp_p==0)
  68.         {red=buf_cor/rp;color=red;}    //读取红色值        

  69.      else if(disp_p==1)
  70.         {green=buf_cor/gp;color=green;}
  71.      else if(disp_p==2)
  72.         {blue=buf_cor/bp;color=blue;}
  73.             
  74.      disp_buf[0]=color/100;
  75.      disp_buf[1]=(color-100*disp_buf[0])/10;
  76.      disp_buf[2]=color%10;
  77.  }

  78. /*******************************************
  79. * 函数名称: display()
  80. * 函数功能: 数码管显示
  81. * 入口参数: 无
  82. * 出口参数: 无
  83. /********************************************/
  84. void display()
  85. {
  86.    uchar i;
  87.    for(i=0;i<3;i++)
  88.    {
  89.         if(disp_p==0&&i==0)
  90.             {P0=table[10];P2=scan[0];delay_1ms(2);P2=0xff;}
  91.         else if(disp_p==1&&i==0)
  92.             {P0=table[11];P2=scan[0];delay_1ms(2);P2=0xff;}
  93.         else if(disp_p==2&&i==0)
  94.             {P0=table[12];P2=scan[0];delay_1ms(2);P2=0xff;}
  95.         else if(i<=3)
  96.             {P0=table[disp_buf[i-1]];P2=scan[i];delay_1ms(2);P2=0xff;}
  97.    }
  98. }

  99. /*******************************************
  100. * 函数名称: main()
  101. /********************************************/
  102. void main()
  103. {
  104.      oe=0;        //使能TCS230

  105.      s0=1; s1=1;    //选择输出比例因子100%

  106.      t0_init();        //定时计数初使化

  107.      while(1)
  108.      {
  109.         display();
  110.      }
  111. }

  112.  /*******************************************
  113. * 函数名称: c10ms_out()
  114. * 函数功能: 定时中断0服务程序
  115.             修改颜色标志disp_tc(0:红 1:绿 2:蓝)
  116.             设置S0 S1 S2 选择滤波器
  117.             计算脉冲,读取色值
  118. * 入口参数: 无
  119. * 出口参数: 无
  120. /********************************************/
  121. void c10ms_out() interrupt 1
  122. {
  123.    TR0=0;    //关闭定时

  124.    TR1=0;    //关闭计数


  125.    disp_tc+=1;//实现先检测绿色,再检测蓝色,然后检测红色,循环检测

  126.    
  127.    if(disp_tc==100)
  128.    {
  129.         disp_tc=0;
  130.         if(disp_p==0)
  131.         {
  132.             disp_p+=1;    
  133.             s2=1;s3=1;    //选择滤波器为绿色            

  134.         }
  135.         else if(disp_p==1)
  136.         {            
  137.             disp_p+=1;
  138.             s2=1;s3=0;    //选择滤波器为蓝色

  139.         }
  140.         else if(disp_p==2)
  141.         {            
  142.             disp_p=0;
  143.             s2=0;s3=0;    //选择滤波器为红色

  144.         }
  145.     }
  146.     
  147.     if(disp_tc%10==0)
  148.     {
  149.         buf_cor=TH1*256+TL1;    //计算这段时间内 TCS230 的输出脉冲数

  150.         feed_buf();
  151.     }
  152.     
  153.     //重赋初值

  154.      TH0=0xB0;
  155.      TL0=0x3C;
  156.      TL1=0x00;
  157.      TH1=0x00;
  158.      TR0=1;
  159.      TR1=1;
  160.  }
阅读(2071) | 评论(0) | 转发(2) |
0

上一篇:L298N的说明及应用

下一篇:栈应用编程

给主人留下些什么吧!~~