TCS3200模块C51程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/**TCS3200模块**用途:TCS3200颜色测试,读取RGB值,LCD1602显示R,G,B值*///接线说明://模块S2-----单片机P1.1//模块S3-----单片机P1.0//模块OUT----单片机P3.5(计数器1输入)//模块VCC----单片机VCC//模块GND----单片机GND#includeREG52.H#includemath.h//Keillibrary#includestdio.h//Keillibrary#includeINTRINS.H#defineucharunsignedchar#defineuintunsignedint#defineDataPortP2//LCD1602数据端口sbitLCM_RS=P0^2;//LCD1602控制端口sbitLCM_RW=P0^1;//LCD1602控制端口sbitLCM_EN=P0^0;//LCD1602控制端口/**引脚定义**/sbits2=P1^1;//TCS3200S2sbits3=P1^0;//TCS3200S3//TCS3200S0模块内部默认上拉//TCS3200S1模块内部默认上拉//TCS3200OE模块内部接地sbittest_pin=P1^2;//用示波器看这个引脚,可知道定时器中断频率//变量、常量定义ucharge,shi,bai;ucharrp=3,gp=3,bp=6;//定义比例因子,具体环境可以修改ucharcount;//颜色标志位(0:红1:绿2:蓝)//显示数组uchardisp_R[3];//红uchardisp_G[3];//绿uchardisp_B[3];//蓝//********定义函数*****************************voiddelay(unsignedintk);voidInitLcd();voidWriteDataLCM(uchardataW);voidWriteCommandLCM(ucharCMD,ucharAttribc);voidDisplayOneChar(ucharX,ucharY,ucharDData);//*********LCD1602初始化**********************voidInitLcd(){WriteCommandLCM(0x38,1);WriteCommandLCM(0x08,1);WriteCommandLCM(0x01,1);WriteCommandLCM(0x06,1);WriteCommandLCM(0x0c,1);}//**********检测忙信号************************voidWaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;}//**********写命令至LCD***********************voidWriteCommandLCM(ucharCMD,ucharAttribc){if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}//**********写数据至LCD************************voidWriteDataLCM(uchardataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}//*********写一个字符数据到指定的目标***********voidDisplayOneChar(ucharX,ucharY,ucharDData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);}//**********延时函数***************voiddelay(unsignedintk){unsignedinti,j;for(i=0;ik;i++){for(j=0;j121;j++){;}}}/********************************************函数名称:t0_init()*函数功能:定时器0初始化*入口参数:无*出口参数:无/********************************************/voidt0_init(){TMOD=0x51;//T1计数T0定时工作方式1TH1=0x00;//计数初值TL1=0x00;TH0=0xE0;TL0=0x00;//11。0592M晶振10msEA=1;//开中断ET0=1;TR0=1;//启动TR1=1;}//*********************************************//数值转换出个十百千的ASCII码//*********************************************voidconversion(uinttemp_data){bai=temp_data/100+0x30;temp_data=temp_data%100;//取余运算shi=temp_data/10+0x30;ge=temp_data%10+0x30;//取余运算}/********************************************函数名称:main()/********************************************/voidmain(){delay(10);InitLcd();//lcd初始化s2=0;//初始设定S2引脚s3=0;//初始设定S3引脚t0_init();//定时计数初使?while(1){DisplayOneChar(0,0,'T');DisplayOneChar(1,0,'C');DisplayOneChar(2,0,'S');DisplayOneChar(3,0,'2');DisplayOneChar(4,0,'3');DisplayOneChar(5,0,'0');DisplayOneChar(10,0,'R');DisplayOneChar(11,0,'[');DisplayOneChar(12,0,disp_R[0]);DisplayOneChar(13,0,disp_R[1]);DisplayOneChar(14,0,disp_R[2]);DisplayOneChar(15,0,']');DisplayOneChar(0,1,'G');DisplayOneChar(1,1,'[');DisplayOneChar(2,1,disp_G[0]);DisplayOneChar(3,1,disp_G[1]);DisplayOneChar(4,1,disp_G[2]);DisplayOneChar(5,1,']');DisplayOneChar(10,1,'B');DisplayOneChar(11,1,'[');DisplayOneChar(12,1,disp_B[0]);DisplayOneChar(13,1,disp_B[1]);DisplayOneChar(14,1,disp_B[2]);DisplayOneChar(15,1,']');delay(100);}}/********************************************函数名称:c10ms_out()*函数功能:定时中断0服务程序修改颜色标志disp_tc(0:红1:绿2:蓝)设置S0S1S2选择滤波器计算脉冲,读取色值*入口参数:无*出口参数:无/********************************************/voidc10ms_out()interrupt1{uinttemp;test_pin=!test_pin;//测试定时器中断频率引脚,可以用示波器观察TR0=0;//关闭定时TR1=0;//关闭计数//count+1实现先检测绿色,再检测蓝色,然后检测红色,循环检测if(count==0){count++;s2=1;s3=1;//选择滤波器为绿色temp=(8TH1)+TL1;//计算这段时间内TCS230的输出脉冲数temp/=rp;conversion(temp);disp_R[2]=ge;//因为这次的中断,是上次选择滤波器的数值disp_R[1]=shi;disp_R[0]=bai;}elseif(count==1){count++;s2=1;s3=0;//选择滤波器为蓝色temp=(8TH1)+TL1;//计算这段时间内TCS230的输出脉冲数temp/=gp;conversion(temp);disp_G[2]=ge;//因为这次的中断,是上次选择滤波器的数值disp_G[1]=shi;disp_G[0]=bai;}elseif(count==2){count=0;s2=0;s3=0;//选择滤波器为红色temp=(8TH1)+TL1;//计算这段时间内TCS230的输出脉冲数temp/=bp;conversion(temp);disp_B[2]=ge;//因为这次的中断,是上次选择滤波器的数值disp_B[1]=shi;disp_B[0]=bai;}//定时器计数器重赋初值TH0=0xE0;TL0=0x00;//11。0592M晶振,为10msTL1=0x00;//计数器清零TH1=0x00;//计数器清零TR0=1;//打开定时器TR1=1;//打开计数器}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功