① 用 stc12c5a60s2单片机控制颜色传感器tcs3200的程序,我做得不知为什么识别不了,
1、参考网上程序或者模块提供的程序
2、仔细参读datasheet,尤其研究时序以及逻辑功能的实现
3、多动脑筋思考,学会调试程序,多网络Google。
/*模块的使用方法:把板距离白纸2CM处开机,使输出的数据位FFFFFFF(白平衡),接下来就可以正常使用
实现功能:对颜色传感器输出RGB
使用芯片:AT89S52或者STC89C52或AT89S51STC89C51
晶振:12MHZ
编译环境:Keil
作者:zhengzhongxign39*/
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
//==============LCD1602接口连接方法=====================
/*-----------------------------------------------------
|DB0-----P0.0|DB4-----P0.4|RW-------P2.3|
|DB1-----P0.1|DB5-----P0.5|RS-------P2.4|
|DB2-----P0.2|DB6-----P0.6|E--------P2.2|
|DB3-----P0.3|DB7-----P0.7|
---------------------------------------------------*/
//================================================*/
#defineLCM_DataP0//LCD1602数据接口
#defineBusy0x80//用于检测LCM状态字中的Busy标识
sbitLCM_RW=P2^3;//读写控制输入端,LCD1602的第五脚
sbitLCM_RS=P2^4;//寄存器选择输入端,LCD1602的第四脚
sbitLCM_E=P2^2;//使能信号输入端,LCD1602的第6脚
//=================颜色传感模块连接=====================
/*-----------------------------------------------------
|EO-----GND
|S0-----VCC|S2-----P2.0|OUT-------P3.5
|S1-----VCC|S3-----P2.1|
---------------------------------------------------*/
sbittcs230_s2=P2^0;//TCS230S2接单片机P2.0
sbittcs230_s3=P2^1;//TCS230S3接单片机P2.1
sbittcs230_en=P3^0;//TCS230EN(E0)接GND
//**************函数声明***************************************
voidWriteDataLCM(ucharWDLCM);//LCD模块写数据
voidWriteCommandLCM(ucharWCLCM,BuysC);//LCD模块写指令
ucharReadStatusLCM(void);//读LCD模块的忙标
voidDisplayOneChar(ucharX,ucharY,ucharASCII);//在第X+1行的第Y+1位置显示一个字符
voidLCMInit(void);//LCD初始
voidDelayMs(uintMs);//1MS基准延时程序
voidpingheng();//白平衡子程序
voidceliang();//实际颜色程序
uintryz,gyz,byz;//分别定义红色因子绿色因子蓝色因子
uintrb,gb,bb;//RGB值
uchartab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//***********************主程序******************************
main()
{
TMOD=0x51;//设定T0以工作方式1定时10毫秒
LCMInit();//LCD初始
pingheng();//上电时先白平衡一次
while(1)
{
celiang();//颜色测试
DisplayOneChar(0,0,'R');//以十进制显示RGB中红色的分值
DisplayOneChar(0,1,rb/100+0x30);//显示百位数据
DisplayOneChar(0,2,rb/10%10+0x30);//显示十位数据
DisplayOneChar(0,3,rb%10+0x30);//显示个位数据
DisplayOneChar(0,5,'G');//以十进制显示RGB中绿色的分值
DisplayOneChar(0,6,gb/100+0x30);//显示百位数据
DisplayOneChar(0,7,gb/10%10+0x30);
DisplayOneChar(0,8,gb%10+0x30);
DisplayOneChar(0,10,'B');//以十进制显示RGB中蓝色的分值
DisplayOneChar(0,11,bb/100+0x30);
DisplayOneChar(0,12,bb/10%10+0x30);
DisplayOneChar(0,13,bb%10+0x30);
//*****在LCD1602的第二行以16进制显示RGB*******************
DisplayOneChar(1,1,tab1[rb/16]);
DisplayOneChar(1,2,tab1[rb%16]);
DisplayOneChar(1,3,'H');
DisplayOneChar(1,6,tab1[gb/16]);
DisplayOneChar(1,7,tab1[rb%16]);
DisplayOneChar(1,8,'H');
DisplayOneChar(1,11,tab1[bb/16]);
DisplayOneChar(1,12,tab1[bb%16]);
DisplayOneChar(1,13,'H');
DelayMs(250);//每隔0.25秒测试一次颜色
}
}
//******************************************************
//白平衡子程序
voidceliang()
{
//*********求R值************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=0;//选择红色滤光器
tcs230_en=0;
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
rb=(unsignedlong)(TH1*256+TL1)*255/ryz;
if(rb>255)rb=255;//判断RGB值是否合法
//***********求B值**************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=1;//选择蓝色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
bb=(unsignedlong)(TH1*256+TL1)*255/byz;
if(bb>255)bb=255;//判断RGB值是否合法
//***********求G值**************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=1;
tcs230_s3=1;//选择绿色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
tcs230_en=1;
gb=(unsignedlong)(TH1*256+TL1)*255/gyz;
if(gb>255)gb=255;//判断RGB值是否合法
}
//******************************************************
//白平衡子程序
voidpingheng()
{
//**************求取红色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=0;//选择红色滤光器
tcs230_en=0;
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
ryz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
//**************求取蓝色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=1;//选择蓝色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
byz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
//**************求绿红色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=1;
tcs230_s3=1;//选择绿色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
tcs230_en=1;
gyz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
}
/*======================================================================
LCM初始化
其他程序网上自己找找参照
② 为什么单片机开发板,有些是涂的绿色的漆,有些则是蓝色,还有些是黑色,他们各有什么优点
你是指PCB板子的颜色不同吧,就我知道的没什么不同。只是加工商不一样而已。不过在PCB制板行业里是不是真的有什么讲究?我也不知道。
③ 单片机(任何一种)+ov7670做图像识别的程序,比如说能识别出图像的颜色或者图像中的点的位置,有思路也行
识别颜色和位置应该比较简单啊,我之前就做过用STC12C5A60加ov7670控制小车识别指定颜色,思路是这样的:
配置好OV7670,比如说输出格式为RGB565,分辨率为160X120,在程序中设置R,G,B阀值对每个像素的R,G,B进行比较,如果阀值比对OK,就输出此像素的坐标值。假若设置左上角为坐标原点(0,0),则第一行结束的坐标即为(159,0),依次对整个图像数据采集判读即可得到相应颜色的坐标值进而判读指定颜色目标的位置。
④ 做机器人,我该选择哪种51单片机~~
一、一般做机器人用avr单片机,你可以查一下资料。
二、不是说针对哪一类,如果你学号一种单片机,都是可以处理的(只要单片机有这个处理能力),关键是你学习还是做项目,要是学习,c51是好的选择,郭天祥的视频讲的比较详细。你可以看下。
……以上我只是按我了解的说的,希望能帮助你。
⑤ 乐博乐博的单片机怎么样啊
现在新一代的单片机还增加了图像传感器,能进行颜色识别、图标识别什么的,将图像传输到电脑上,让孩子在电脑端进行操控,能更好的互动。关于图像传感器这点,其实我们家里已经很常用了,像扫地机器人,就是利用图像传感器来创造工作路径。想了解更多可以网络一下。
⑥ 求51单片机用的的 TCS230D颜色识别模块c语言程序
//转自某某大侠的(名字忘了)此程序用于颜色模块TCS230D的51驱动(2010.08.26大侠)
//鉴于你应该知道TCS230D芯片的资料,芯片引脚功能我就不说了
#include<reg52.h>
unsigned char tmp;
/*******************************************
定义颜色识别模块引脚
*******************************************/
sbit clr_S0=P3^0;
sbit clr_S1=P3^1;
//设置p3.0脚3.1脚分别接到tcs230d芯片的s0和s1脚
sbit clr_OE=P3^2;
sbit clr_OUT=P3^5;
//设置p3.2脚3.5脚分别接到tcs230d芯片的OE和OUT脚
sbit clr_S2=P3^4;
sbit clr_S3=P3^3;
//设置p3.4脚3.3脚分别接到tCS230D芯片的S2和S3脚
/*******************************************/
/**********
串口初始化
***********************/
/*******************************************/
void init_ser()//初始化串口
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON&=0xef;
TR1=1;
IE=0x00;
}
void ser_sendchar(unsigned char a)//串口发送一个字节
{
SBUF=a;
while(!TI);
TI=0;
}
/*******************************************/
/********
颜色识别模块配置
*******************/
/*******************************************/
void init_clr()
{
clr_OE=1;
}
unsigned int clr_get(unsigned char a)
{
unsigned int time;
TMOD=0x61;//设置定时器0工作方式为16位
TH0=TL0=0x00;//设置定时器0从0计时
TH1=TL1=0x00;
clr_S0=1;
clr_S1=1;
clr_S2=a&0x02;
clr_S3=a&0x01;
clr_OE=0;
TR1=TR0=1;
while(TL1<250);
TR1=TR0=0;
clr_OE=1;
time=TH0*256+TL0;
return(time);
}
/*******************************************/
/*******************************************/
/*******************************************/
void main()
{
unsigned int a;
init_ser();
init_clr();
while(1)
{
if(RI)
{
RI=0;
tmp=SBUF;
a=clr_get(tmp);
init_ser();
ser_sendchar(a&0x00ff);
ser_sendchar(a/256);
}
}
}
以上就是整个代码部分,希望有帮助