A. 單片機RGB調色程序 要求基於PWM(STC系列單片機c語言)可以實現至少60種顏色調節,有多種模
選用STC12C56XX的單片機,利用三路PWM來調色就簡單了,再多的顏色無非是把表格做的大點,利用查表法,來獲取顏色的PWM寄存器的初裝值就可以了。
B. 用 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初始化
其他程序網上自己找找參照
C. 51單片機從TFT彩屏上讀取某一點顏色的函數方法
這和TFT液晶屏型號有關,還和你採用何種接線方式有關
如以下是ILI9341控制的單片機讀方法,它採用16位數據線,所以一次讀出16位,一個點本來要讀3次,但時序要求讀4次
R = *(__IO uint16_t *)Bank1_LCD_D實際上就是 給液晶屏一個讀信號,然後單片機從匯流排上獲得數據,這是STM32單片機以8088匯流排的時序操作方式,因此只是一條指令,由於51單片機是8位數據線,因此這一句要分好多語句才能完成
uint16_t LCD_RD_data(void) //連續讀4次
{
uint16_t R=0, G=0, B=0 ;
R = *(__IO uint16_t *)Bank1_LCD_D; /*FIRST READ OUT DUMMY DATA*/
R = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT RED DATA */
B = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT BLACK DATA*/
G = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT GREEN DATA*/
return (((R>>11)<<11) | ((G>>10)<<5) | (B>>11));
}
uint16_t LCD_GetPoint(uint16_t x , uint16_t y)//完整的讀程序
{
uint16_t temp;
LCD_SetCursor(x, y);
LCD_ILI9341_CMD(0x2e); /* 讀數據 的命令*/
temp=LCD_RD_data();
return (temp);
}
D. 單片機(任何一種)+ov7670做圖像識別的程序,比如說能識別出圖像的顏色或者圖像中的點的位置,有思路也行
識別顏色和位置應該比較簡單啊,我之前就做過用STC12C5A60加ov7670控制小車識別指定顏色,思路是這樣的:
配置好OV7670,比如說輸出格式為RGB565,解析度為160X120,在程序中設置R,G,B閥值對每個像素的R,G,B進行比較,如果閥值比對OK,就輸出此像素的坐標值。假若設置左上角為坐標原點(0,0),則第一行結束的坐標即為(159,0),依次對整個圖像數據採集判讀即可得到相應顏色的坐標值進而判讀指定顏色目標的位置。
E. 單片機機械手怎麼識別三種顏色的球
不同顏色的波長不同,機械手上加上顏色感測器就可以識別了