找回密码
 立即注册

QQ登录

只需一步,快速开始

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

TCS3200颜色识别-51单片机源码 LCD1602液晶显示

  [复制链接]
跳转到指定楼层
楼主
此款源码,是用于51单片机颜色识别所用,所用模块还有TCS3200和LCD1602,适合毕业设计(仅限本科)和课余自乐!


单片机源程序:
  1. #include <reg52.h>                                //添加STC89C52所需头文件
  2. #include <string.h>
  3. #define uchar unsigned char                //宏定义无符号字符型变量
  4. #define uint  unsigned  int                //宏定义无符号整型变量
  5. uchar str[3];                                        //定义数组
  6. uchar *s;                                                //定义指针
  7. uint date;                            //定义数据类型
  8. uint dispcount=0;                    //中断计数
  9. uint lck=0;                                    //定时器计数
  10. uint disp=0;                            //频率值计数
  11. sbit RS=P1^0;                            //数据/命令选择端,高电平-数据寄存器,低-指令寄存器
  12. sbit RW=P1^1;                            //读/写选择端,高-读操作,低-写操作
  13. sbit E=P2^5;                                        //使能端
  14. sbit s0 = P2^0;                                        //声明引脚
  15. sbit s1 = P2^1;
  16. sbit s3 = P1^7;
  17. sbit s2 = P1^6;
  18. sbit oe = P1^2;
  19. /**************************************************
  20.                         延迟函数,延时1ms  
  21. **************************************************/
  22. void delay1ms(uint i)
  23. {  uint j;
  24.    while(i--)
  25.    {       
  26.                  for(j=0;j<125;j++);
  27.    }
  28. }
  29. /**************************************************
  30.                          初始化STC89C52        
  31. **************************************************/
  32. void initTimer(void){         //定时器0初始化函数,包括装入初值,设置定时时间为1ms
  33.        
  34.         TMOD=0x0;
  35.         TH0=0xe0;
  36.         TL0=0x18;
  37. }
  38. void timer0(void) interrupt 1{        //定时器函数                                                          
  39.         TH0=0xe0;                         //装入初值
  40.         TL0=0x18;                        //装入初值(定时器中断每1ms中断一次)
  41.         lck++;                                //设置累加变量,累加1000次即为1S
  42.         if(lck==1000){                 //判断是否到了1S
  43.                 disp=dispcount; //将外部中断0内的累加数据(接收TCS3200的脉冲次数)赋值给disp,便于传递参数
  44.                 lck=0;                        //对累加变量清零,用于下1S的累加计数
  45.                 dispcount=0;        //对外部中断0的累加数据进行清零,便于下一次对脉冲的计数
  46.        }
  47. }
  48. void int0(void) interrupt 0{//外部中断0的处理函数
  49.         dispcount++;                 //外部中断0,TCS3200的OUT端口接到了STC89C52的INT0端口
  50.                                                 //每一次中断,计数加1,当到达1S时,将此数据放在定时器函数中计数
  51. }
  52. /*******RGB三种颜色通道选择模块       
  53. **************************************************/  
  54. void red()               
  55. {                        //红色通道选通函数
  56.         oe = 0;        //使能TCS3200
  57.         s2 = 0;        //选通红色滤波器
  58.         s3 = 0;
  59.         s0 = 0;        //设置输出为2%比率
  60.         s1 = 1;
  61.         delay1ms(1100);//延迟1S
  62.         date=disp/100;//依据方法2,求出比例系数
  63.         date=(255.0/153)*date;//153是在纯白情况下测得的红色通道频率值
  64. }
  65. void green() //绿色通道选通函数
  66. {       
  67.         s0 = 0;
  68.         s1 = 1;        //设置输出2%的比率
  69.         oe = 0;
  70.         s2 = 1;
  71.         s3 = 1;
  72.         delay1ms(1100);
  73.         date=disp/100;
  74.         date=(255.0/145)*date;//145是在纯白情况下测得的绿色通道频率值
  75. }
  76. void blue()                          //蓝色通道
  77. {       
  78.         //P1=0x81;
  79.         s0 = 0;
  80.         s1 = 1;
  81.         s3 = 1;
  82.         s2 = 0;
  83.         oe = 0;
  84.         delay1ms(1100);
  85.         date=disp/100;
  86.         date=(255.0/183)*date;        //183是在纯白情况下测得的蓝色通道频率值
  87. }
  88. /**************************************************
  89.          整型数转化成字符串,以便LCD输出显示       
  90. **************************************************/
  91. uchar * int2str(uint d)
  92. {        if(d>=255)
  93.         { d=255;
  94. str[0]='0'+d/100;
  95. str[1]='0'+d%100/10;
  96.       str[2]='0'+d%10;        }
  97.         else
  98.         { str[0]='0'+d/100;
  99.           str[1]='0'+d%100/10;
  100.       str[2]='0'+d%10; }
  101.         return str;
  102. }
  103. /*****LCD显示模块*********/

  104. void LCD_w_com(unsigned com)                                  //写命令函数,com为        要写的指令
  105. {  RW=0; RS=0; E=1;
  106.    P0=com; delay1ms(10);
  107.    E=0; RW=1;
  108. }
  109. void LCD_w_dat(uchar dat)                   // 写数据 函数,        写要显示的数据
  110. {  RW=0; RS=1; E=1;
  111.    P0=dat; delay1ms(10);
  112.    E=0; RW=1;
  113. }
  114. void init_LCD(void)                                                // 初始化lcd
  115. {  LCD_w_com(0x38);                             // lcd为两行显示8位数据线有效
  116.    LCD_w_com(0x0e);                                     // 显示字符  关闭光标
  117.    LCD_w_com(0x06);                    // 输入方式设置 光标向右移动一位 ac-1
  118. }
  119. void clear_LCD()                                                                    //清屏
  120. {            
  121.    LCD_w_com(0x01);                                              //清屏指令
  122.    LCD_w_com(0x02);                          // 光标归位 即光标置于左上位置
  123. }
  124. void display_LCD_string(uchar *p)                              //字符串输出函数
  125. {  while(*p)
  126.    {  LCD_w_dat(*p); p++; delay1ms(10); }
  127. }
  128. void gotoxy(unsigned x,unsigned y)                              //定位  ,x为行,y为列
  129. {  if(x==1)  LCD_w_com(0x80+y);
  130.    else      LCD_w_com(0xC0+y);
  131. }

  132. /**************************************************
  133.                      主函数       
  134. **************************************************/
  135. void main(void)
  136. {  IT0=1;                                                //INT0下降沿中断
  137.    EX0=1;                                                 //允许INT0中断
  138.    initTimer();                                                  //装入初值
  139.    TR0=1;                                                          //开定时器T0
  140.    ET0=1;                                                          //允许T0中断
  141.    EA=1;                                                          //中断总控制
  142.    init_LCD();                                                 //LCD初始化
  143.    clear_LCD();   //清屏
  144.    while(1)
  145.    {  
  146.           gotoxy(1,00); display_LCD_string("R:"); red();        //调用红色通道并显示色彩值
  147.       

  148. …………限于本文篇幅 余下代码请从51黑论坛下载附件…………
复制代码
下载:
MyColorTest.zip (38.03 KB, 下载次数: 202)


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

使用道具 举报

沙发
ID:283987 发表于 2018-9-13 14:54 | 只看该作者
谢谢分享
回复

使用道具 举报

板凳
ID:403334 发表于 2018-10-29 10:09 来自手机 | 只看该作者
你好,请问out接哪个口?
回复

使用道具 举报

地板
ID:397663 发表于 2018-11-5 18:35 | 只看该作者
TCS3200跟openmv相比哪个比较好用啊??
回复

使用道具 举报

5#
ID:379099 发表于 2018-12-17 16:10 | 只看该作者
为什么下载后程序打不开?
回复

使用道具 举报

6#
ID:508997 发表于 2019-5-4 18:16 | 只看该作者
楼主还在吗,我有一些问题想要请教你
回复

使用道具 举报

7#
ID:551325 发表于 2019-5-30 20:39 | 只看该作者
为什么下载后程序打不开?
回复

使用道具 举报

8#
ID:328014 发表于 2019-5-31 01:56 | 只看该作者
F沧海一声笑 发表于 2019-5-30 20:39
为什么下载后程序打不开?

可以打开啊 keil4
回复

使用道具 举报

9#
ID:858523 发表于 2021-9-27 18:30 | 只看该作者
为什么我测出来的G值和B值都是0?
回复

使用道具 举报

10#
ID:942417 发表于 2021-12-19 17:32 | 只看该作者
Sinclair! 发表于 2018-11-5 18:35
TCS3200跟openmv相比哪个比较好用啊??

OPENmv好用
回复

使用道具 举报

11#
ID:208271 发表于 2023-3-24 11:52 | 只看该作者
实测,有数据,但数据不准,不建议使用
回复

使用道具 举报

12#
ID:433219 发表于 2023-3-24 14:16 | 只看该作者
有没有大佬推荐下类似的  CMYK色  判读传感器 ?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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