51单片机课程设计:基于TCS230/3200的颜色复制显示器

发布者:温柔浪漫最新更新时间:2021-06-29 来源: eefocus关键字:51单片机  TCS230 手机看文章 扫描二维码
随时随地手机看文章

本程序将从颜色识别模块读取到的数据显示在LCD1602上,同时生成对应的PWM波操作三色灯显示不同颜色,以此来实现颜色的复制显示,关于各模块的接线方法在源码都有详细介绍,同时,相关工程文件以及资料可在文章最下方下载。


关于粘贴复制乱码的问题:如果程序复制到Keil编译器上出现注释乱码,可以先建一个.c文件,也就是说不在keil里面编辑,然后用记事本打开.c文件,将源码复制进去,再在keil中添加文件即可。


/**************************************************************************************

                               基于TCS3200/230颜色复制显示器

 * 用途:用于颜色的复制显示,通过TCS3200模块将取得的数据转换为对应的PWM波给三色灯显示出来    ,同时在LCD1602上显示出来

 *接线方法 

    P0为LCD1602数据端口

    P2.5接LCD1602 RS

    P2.6接LCD1602 RW

    P2.7接LCD1602 EN

 *三色灯接法

    P1.5接红色端

    P1.6接绿色端

    P1.7接蓝色端

 *TCS3200接法

    模块S2-----单片机P1.1

    模块S3-----单片机P1.0

    模块OUT----单片机P3.5(计数器1输入)

    模块VCC----单片机VCC

    模块GND----单片机GND

**************************************************************************************/

#include

#include       //Keil library  

#include      //Keil library

#include

#define uchar unsigned char

#define uint  unsigned int

#define DataPort P0   //LCD1602 数据端口

sbit    LCM_RS=P2^5;   //LCD1602 控制端口

sbit    LCM_RW=P2^6;   //LCD1602 控制端口

sbit    LCM_EN=P2^7;   //LCD1602 控制端口

sbit Red=P1^5;        

sbit Green=P1^6;

sbit Blue=P1^7;

/**引脚定义**/  

sbit s2=P1^1;        //TCS3200 S2 

sbit s3=P1^0;        //TCS3200 S3

                     //TCS3200 S0 模块内部默认上拉

                     //TCS3200 S1 模块内部默认上拉

                     //TCS3200 OE 模块内部接地

sbit test_pin=P1^2;  //用示波器看这个引脚,可知道定时器中断频率

//变量、常量定义

uchar ge,shi,bai ;

uchar rp=3,gp=3,bp=6; //定义比例因子,具体环境可以修改

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

uint RC=0,GC=0,BC=0;

//显示数组

uchar disp_R[3];  //红

uchar disp_G[3];  //绿

uchar disp_B[3];  //蓝

//********定义函数*****************************

void    delay(unsigned int k);

void    InitLcd();

void    WriteDataLCM(uchar dataW);

void    WriteCommandLCM(uchar CMD,uchar Attribc);

void    DisplayOneChar(uchar X,uchar Y,uchar DData);

//*********LCD1602初始化**********************

void InitLcd()

{

    WriteCommandLCM(0x38,1);

    WriteCommandLCM(0x08,1);

    WriteCommandLCM(0x01,1);

    WriteCommandLCM(0x06,1);

    WriteCommandLCM(0x0c,1);

}

//**********检测忙信号************************

void WaitForEnable(void)

{

    DataPort=0xff;

    LCM_RS=0;LCM_RW=1;_nop_();

    LCM_EN=1;_nop_();_nop_();

    while(DataPort&0x80);

    LCM_EN=0;

}

//**********写命令至LCD***********************

void WriteCommandLCM(uchar CMD,uchar Attribc)

{

    if(Attribc)WaitForEnable();

    LCM_RS=0;LCM_RW=0;_nop_();

    DataPort=CMD;_nop_();

    LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

//**********写数据至LCD************************

void WriteDataLCM(uchar dataW)

{

    WaitForEnable();

    LCM_RS=1;LCM_RW=0;_nop_();

    DataPort=dataW;_nop_();

    LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

//*********写一个字符数据到指定的目标***********

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

    Y&=1;

    X&=15;

    if(Y)X|=0x40;

    X|=0x80;

    WriteCommandLCM(X,0);

    WriteDataLCM(DData);

}

//**********延时函数***************

void delay(unsigned int k)

{

    unsigned int i,j;

    for(i=0;i    {

        for(j=0;j<121;j++)

        {;}

    }

}            

/*******************************************

* 函数名称: t0_init()

* 函数功能: 定时器0初始化

* 入口参数: 无

* 出口参数: 无

/********************************************/

void t0_init()

{

    TMOD=0x51;        //T1计数 T0定时 工作方式1

    TH1=0x00;        //计数初值

    TL1=0x00;

    TH0=0xE0;

    TL0=0x00;        //11。0592M 晶振10ms

    EA=1;            //开中断

    ET0=1;        

    TR0=1;           //启动

    TR1=1;

}

//*********************************************

//数值转换出个十百千的ASCII码

//*********************************************

void conversion(uint temp_data)  

{  

    bai=temp_data/100+0x30 ;

    temp_data=temp_data%100;   //取余运算

    shi=temp_data/10+0x30 ;

    ge=temp_data%10+0x30;      //取余运算

}

/*******************************************

* 函数名称: main()

/********************************************/

void main()

{

    delay(10); 

    InitLcd();      //lcd初始化

    s2=0;           //初始设定S2引脚

    s3=0;           //初始设定S3引脚

    t0_init();      //定时计数初使?

    while(1)

    {

        uint count = 0;

        /**********************最笨的方法

        通过主函数循环来实现显示各种颜色

        ******************/

        while(1)

        {

            if(count<=RC)

            {

                Red = 0;

            }

            else

            {

                Red = 1;

            }

            if(count<=BC)

            {

                Blue = 0;

            }

            else

            {

                Blue = 1;

            }

            if(count<=GC)

            {

                Green = 0;

            }

            else

            {

                Green = 1;

            }

                  

            count++;

            if(count>=256)

            {

                count = 0;

            }

        }   

    }

}

/*******************************************

* 函数名称: c10ms_out() 

* 函数功能: 定时中断0服务程序

            修改颜色标志disp_tc(0:红 1:绿 2:蓝)

            设置S0 S1 S2 选择滤波器

            计算脉冲,读取色值

* 入口参数: 无

* 出口参数: 无

/********************************************/

void c10ms_out() interrupt 1

{

    uint temp;

    test_pin=!test_pin; //测试定时器中断频率引脚,可以用示波器观察

    TR0=0;              //关闭定时

    TR1=0;              //关闭计数

    //   count+1实现先检测绿色,再检测蓝色,然后检测红色,循环检测       

    if(count==0)

    {

        count++;    

        s2=1;s3=1;             //选择滤波器为绿色     

        temp=(8<        temp/=rp;

        GC=temp;

        conversion(temp);

        disp_R[2]=ge;         

        disp_R[1]=shi;

        disp_R[0]=bai;

    }

    else if(count==1)

    {            

        count++;

        s2=1;s3=0;            //选择滤波器为蓝色

        temp=(8<        temp/=gp;

        BC=temp;

        conversion(temp);

        disp_G[2]=ge;         

        disp_G[1]=shi;

        disp_G[0]=bai;

    }

    else if(count==2)

    {            

        count=0;

        s2=0;s3=0;            //选择滤波器为红色

        temp=(8<        temp/=bp;

        RC=temp;

        conversion(temp);

        disp_B[2]=ge;         

        disp_B[1]=shi;

        disp_B[0]=bai;

    }

    DisplayOneChar(0, 0, 'T');

    DisplayOneChar(1, 0, 'C');

    DisplayOneChar(2, 0, 'S');

    DisplayOneChar(3, 0, '2');

    DisplayOneChar(4, 0, '3');

    DisplayOneChar(5, 0, '0');

[1] [2]
关键字:51单片机  TCS230 引用地址:51单片机课程设计:基于TCS230/3200的颜色复制显示器

上一篇:单片机最小零碎[配图][超具体]
下一篇:51单片机课程设计:基于DHT11的温湿度报警器

推荐阅读最新更新时间:2024-11-02 20:07

51单片机16X16点阵显示屏学习板基本原理
  1.功能      16×16点阵显示屏学习板如下图所示,LED显示屏各点亮度均匀、充足,可显示图形和文字,通过文字图像取模软件获得数据码,可以显示各类图形或文字。稳定、清晰、无串扰,图形或文字显示有静止、移入移出等显示方式。      2.基本原理      16×16点阵是用4个8×8点阵屏拼合而成,8X8点阵LED工作原理说明:8×8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置O电平,则相应的二极管就亮;因此要实现一根柱形的亮法。对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:      一根竖柱:对应的列置1,而行则采用扫描
[单片机]
<font color='red'>51单片机</font>16X16点阵显示屏学习板基本原理
51单片机-代码参考
前面的篇章我们都是在普及知识,真正使用好定时器还是需要重新拟定新的书写方案的,我们参考了宋老师的书写方式,在他的代码基础上我们进行小修改成就实用的工程代码。 1.代码解析 void ConfigTimer0(unsigned int ms) { unsigned long tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率 tmp = (tmp * ms) / 1000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp + 13; //补偿中断响应延时造
[单片机]
51单片机之串口操作入门经验总结与C源程序
用计算机来控制单片机,进而控制继电器等其他外设,感觉不错啊,怎么实现呢?一步步来吧。 单片机串行口通信,也就是单片机与计算机之间的通信,要实现,要明白一些基本的概念。 (1)实现之前,请确定串口正常,我之前做过串口操作,烧了不能控制,后来才发现,设备管理器里串口有叹号,驱动有问题,可能是开发实验板没有插好或是换了个USB口造成的(我用的是串口转USB的,笔记本用) (2)串口初始化,这方面,最好有相关的书来的,明白消化定时器与中断, 这样操作起来就容易了。 一。设定串口的工作方式:设定SCON寄存器。 什么是SCON呢? SCON寄存器是51单片机一个可寻址的专用寄存器,用于串行数据通信的控制,其字节地址为:98H,位地址为:98
[单片机]
AT89C51与AT89S51单片机有什么区别
AT89S51 是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统供给高性价比的解决方案。 AT89S51具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌
[单片机]
MCS51单片机专用功能寄存器
MCS-51单片机内的锁存器、定时器、串行口数据缓冲器以及各种控制寄存器和状态寄存器都是以专用功能寄存器(或称特殊功能寄存器)的形式出现的,它们分散地分布在内部RAM地址空间范围(80H~FFH)内,表 2-5列出了这些专用功能寄存器(SFR)的助记标识符、名称及地址。 其中,凡字节地址可以被8整除的专用功能寄存器都可以位寻址。其位地址见表2-6。 大部分寄存器的应用将在后面有关章节中评述,这里仅作简单介绍。 ·累加器ACC 累加器是一个最常用的专用寄存器。大部分单操作数指令的操作取自累加器。很多双操作数指令的一个操作数取自累加器。加、减、乘、除算术运算指令的运算结果都存放在累加器A或AB寄存器对中。指令系
[单片机]
51单片机学习笔记2 -- 单灯控制及流水灯
1.LED仿真电路绘制 LED就不展开介绍了,二极管单向导通电能转换光能,直接上原理图,可以看到LED灯D1连接在51单片机P1.0引脚 在Protues元器件查找输入关键词LED,在详细列表下拉找到几个颜色的LED,分别是蓝、绿、红、黄,随便找一个颜色的LED即可 单个LED的接线按照原理图如下进行仿真电路绘制,注意LED的朝向(LED阳极接限流电阻R2,阴极接芯片引脚P1.0) 2.Keil 51工程创建 打开Keil软件,先关掉当前打开的工程,菜单栏 Project - Close Project 新建一个文件夹以存放工程文件,Keil新建工程 选择新建的文件夹存放工程,并给工程命名 选择工程对应的处
[单片机]
<font color='red'>51单片机</font>学习笔记2 -- 单灯控制及流水灯
基于51单片机的红外电子密码锁的设计
本设计包含两个51单片机和一个proteus自带的红外组件IRLINK来模拟实现红外通信:1)一个单片机模拟发送密码信号; 2)一个单片机接收密码信号并通过电磁线圈控制锁的开或者关; 3)使用proteus自带的红外组件IRLINK的发射端模拟第一个单片机发射红外信号; 4)使用proteus自带的红外组件IRLINK的接收端模拟接红外信号并经过光电转换成电信号送入第二个单片机(红外电子密码锁的控制器) 以下是电路图的设计: 电路图设计 以下是红外通信的部分程序 #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16
[单片机]
基于<font color='red'>51单片机</font>的红外电子密码锁的设计
51单片机中定时器的小程序
今天我开始了对51中的定时器进行了学习,并写了一个小程序。 #i nclude sbit P0_1=P0^1; //定义位变量 /********************************************************* * 延时子程序 * 16个循环为1秒 * **********************************************************/ void Delay(count) { int i; while(--count != 0) { for(i = 0; i 125; i++); // ";" 表示空语句,CPU空转。 } // i
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved