① 用 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);
}
}
}
以上就是整個代碼部分,希望有幫助