❶ 用 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初始化
其他程序網上自己找找參照
❷ 單片機(任何一種)+ov7670做圖像識別的程序,比如說能識別出圖像的顏色或者圖像中的點的位置,有思路也行
識別顏色和位置應該比較簡單啊,我之前就做過用STC12C5A60加ov7670控制小車識別指定顏色,思路是這樣的:
配置好OV7670,比如說輸出格式為RGB565,解析度為160X120,在程序中設置R,G,B閥值對每個像素的R,G,B進行比較,如果閥值比對OK,就輸出此像素的坐標值。假若設置左上角為坐標原點(0,0),則第一行結束的坐標即為(159,0),依次對整個圖像數據採集判讀即可得到相應顏色的坐標值進而判讀指定顏色目標的位置。
❸ 基於單片機(友善之臂)的西紅柿成熟度判定,本科畢業設計。求高手指導
用顏色識別,其中可以用攝像頭或者用顏色識別晶元針對某一個顏色判斷!
❹ 這個顏色識別模擬的tcs怎麼連接單片機的
哦,我的元件庫裡面沒有這個東西;
顏色有多種,能識別出來,說明這個東西會輸出可變的電壓信號,因此,需要把她連接到ADC;
❺ 單片機機械手怎麼識別三種顏色的球
不同顏色的波長不同,機械手上加上顏色感測器就可以識別了
❻ 如何製作單片機機器人
感測器,單片機編程,電路設計,機械部分,模擬電路轉數字電路。對於零基礎來說有些困難,畢竟要學的東西不少
❼ 如何用單片機讀取顏色感測器的數值
單片機只能用來處理數據,檢測氣體是需要用感測器,有時還需要用放大器把感測器的微弱信號放大到足夠單片機讀取的幅度(通常是1v-5v),然後根據電壓的高低來判定(a/d模擬量轉換成數字量)氣體的濃度
❽ 亞龍236型51單片機 YL_G001機械手如何識別顏色啊
顏色感測器。不同顏色送出不同值。
❾ 求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);
}
}
}
以上就是整個代碼部分,希望有幫助
❿ proteus單片機模擬時,如何看那些引腳出現的顏色代表什麼
proteus單片機模擬時出現的顏色意思為:
紅色:輸出,高電平(一般 =VCC) 也表示為 1。
藍色:輸出,低電平(一般 =GND) 也表示為 0。
灰色:輸出,不確定。
proteus可以模擬51系列、AVR、PIC、ARM、等常用主流單片機。還可以直接在基於原理圖的虛擬原型上編程,再配合顯示及輸出,能看到運行後輸入輸出的效果。配合系統配置的虛擬邏輯分析儀、示波器等,Proteus建立了完備的電子設計開發環境。
(10)基於單片機的顏色識別擴展閱讀:
proteus的相關要求規定:
1、Proteus可提供的模擬儀表資源 :示波器、邏輯分析儀、虛擬終端、SPI調試器、I2C調試器、信號發生器、模式發生器、交直流電壓表、交直流電流表。理論上同一種儀器可以在一個電路中隨意的調用。
2、Proteus提供了一個圖形顯示功能,可以將線路上變化的信號,以圖形的方式實時地顯示出來,其作用與示波器相似,但功能更多。這些虛擬儀器儀表具有理想的參數指標,例如極高的輸入阻抗、極低的輸出阻抗。這些都盡可能減少了儀器對測量結果的影響。
3、Proteus可提供的調試手段 Proteus提供了比較豐富的測試信號用於電路的測試。這些測試信號包括模擬信號和數字信號。