弄了幾天終于實現了,就是傳感器照在什么顏色物質上,RGB燈還還原出來,并上傳電腦,和12864液晶顯示器。哈哈哈哈,機器人有眼睛了。關鍵一點還是全開源。
制作出來的實物圖如下:
20181231_004610.jpg (283.98 KB, 下載次數: 83)
下載附件
2018-12-31 01:06 上傳
20181231_004749.jpg (319.05 KB, 下載次數: 83)
下載附件
2018-12-31 01:06 上傳
20181231_005926.jpg (283.75 KB, 下載次數: 73)
下載附件
2018-12-31 01:06 上傳
20181231_004705.jpg (313.83 KB, 下載次數: 73)
下載附件
2018-12-31 01:06 上傳
20181231_004908.jpg (274.33 KB, 下載次數: 73)
下載附件
2018-12-31 01:06 上傳
單片機源碼如下:
- #include <reg52.h>
- #include "usart.h"
- #include "iic.h"
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*
- 硬件接法:
- GY-33---c51
- 1、GY-33_RX---c51_TX,c51復位將發送A5 01 A6 給模塊
- 2、c51_TX---FT232,STM32將數據上傳給上位機
- 3、GY-33_TX---c51_RX,接收模塊角度數據
- 軟件說明:
- 該程序采用串口方式獲取模塊rgb數據,波特率9600
- 所以得用上位機先將模塊串口設置成9600,然后再進行以上操作:
- 指令:A5 AE 53,模塊需復位生效
- 注:中斷函數位于stc_it.c
- */
- sfr T2MOD =0xC9; //定時器中斷2TMOD必須定義
- /*-----------------------PWM定義---------------------------*/
- uchar PWM_T=0;//PWM脈沖周期PWM_T(max)=256*中斷定時時間(1ms)
- //PWM物理地址通道定義,物理地址根據需要自由定義
- sbit PWM_IO0 = P1^0;
- sbit PWM_IO1 = P1^1;
- sbit PWM_IO2 = P1^2;
- //PWM脈沖占空比
- uchar PWM_IO0_ZKB=0; //脈沖占空比,0~255,=0時輸出最大
- uchar PWM_IO1_ZKB=0;
- uchar PWM_IO2_ZKB=0;
- /*---------------定時器2初始化-------------------*/
- void timer2_init()//定時器2初始化
- {
- RCAP2H=0xff; //16位計數器,定時39us
- RCAP2L=0xdc; //X=0xffdc=65500;T=(65536-X)*機器周期(11.0592MHz,1.085us)
- //TH2=RCAP2H; //會自動重裝
- //TL2=RCAP2L;
- T2CON=0;
- T2MOD=0;
- EA=1;
- ET2=1;
- TR2=1;
- }
- /*--------------定時器2中斷服務程序----------------------------*/
- void timer2() interrupt 5
- {
- TF2=0; //注意:定時器2必須由軟件對溢出標志位清零,
- //這里與定時器0和定時器1不同
- //PWM處理
- PWM_T++;
- if(PWM_T == 255)//取到最大值
- {PWM_T = PWM_IO0 = PWM_IO1 = PWM_IO2 = 0;} //所有通道脈沖拉至低電平
-
- //通道脈沖電平拉高
- if(PWM_T == PWM_IO0_ZKB) //通道0脈沖得高電平
- PWM_IO0 = 1;
-
- if(PWM_T == PWM_IO1_ZKB) //通道1脈沖得高電平
- PWM_IO1 = 1;
-
- if(PWM_T == PWM_IO2_ZKB) //通道2脈沖得高電平
- PWM_IO2 = 1;
-
-
- }
- void send_com(u8 datas)
- {
- u8 bytes[3]={0};
- bytes[0]=0xa5;
- bytes[1]=datas;//功能字節
- USART_Send(bytes,3);//發送幀頭、功能字節、校驗和
- }
- typedef struct
- {
- uint8_t Red;
- uint8_t Green;
- uint8_t Blue;
- } RGB;
- /***************************功能定義***************************/
- #define LCD12864_W_COM 0xF8 //寫指令
- #define LCD12864_R_COM 0xFC //讀指令
- #define LCD12864_W_DAT 0xFA //寫數據
- #define LCD12864_R_DAT 0xFE //讀數據
- #ifndef __LCD12864_H__
- #define __LCD12864_H__
- #define LCD12864_COM 0 //輸入指令
- #define LCD12864_DAT 1 //輸入數據
- #define LCD12864_CLEAR 0x01 //清除顯示
- #define LCD12864_CURSOR 0x02 //位址歸位,游標回原點
- #define LCD12864_CURSOR_RLF 0x04 //光標左移,整體顯示不移動
- #define LCD12864_CURSOR_RRF 0x06 //光標右移,整體顯示不移動
- #define LCD12864_CURSOR_RLN 0x05 //光標左移,整體顯示移動
- #define LCD12864_CURSOR_RRN 0x07 //光標右移,整體顯示移動
- #define LCD12864_DIS_OFF 0x08 //顯示狀態全關
- #define LCD12864_DIS_ON 0x0E //顯示狀態開
- #define LCD12864_DIS_CUR_ON 0x0E //游標顯示開
- #define LCD12864_DIS_CURS_ON 0x0F //游標位置顯示開
- #define LCD12864_CURSOR_RL 0x10 //游標左移
- #define LCD12864_CURSOR_RR 0x14 //游標右移
- #define LCD12864_CURDIS_RL 0x18 //整體顯示左移,光標跟隨
- #define LCD12864_CURDIS_RR 0x1C //整體顯示又移,光標跟隨
- #define LCD12864_COM_BASIC 0x30 //基本指令集動作
- #define LCD12864_COM_PLOT_ON 0x36 //擴展指令集動作,繪圖顯示ON
- #define LCD12864_COM_PLOT_OFF 0x34 //擴展指令集動作,繪圖顯示OFF
- #define LCD12864_STAND_TO 0x31 //進入待命模式
- #define LCD12864_PLACE_ROLL 0x03 //允許輸入卷動位址
- #define LCD12864_PLACE_IRAM 0x02 //允許輸入IRAM位址
- #define LCD12864_REVERES_13 0x04 //選擇一、三行同時作反白顯示
- #define LCD12864_REVERES_24 0x05 //選擇二、四行同時作反白顯示
- #define LCD12864_REST_ON 0x08 //進入睡眠模式
- #define LCD12864_REST_OFF 0x0C //脫離睡眠模式
- #define LCD12864_W_COM 0xF8 //寫指令
- #define LCD12864_R_COM 0xFC //讀指令
- #define LCD12864_W_DAT 0xFA //寫數據
- #define LCD12864_R_DAT 0xFE //讀數據
- //======串口模式=======
- sbit LCD12864_CS = P2^7; //片選信號輸入
- sbit LCD12864_STD = P2^6; //串行數據輸入
- sbit LCD12864_SCLK = P2^5; //串行移位脈沖輸入
- sbit LCD12864_PSB = P2^4; //串并模式選擇 0:串口,1:并口
- sbit LCDRST = P2^3;
- unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9數字
- /*****************************向12864寫入8位數據*************************************/
- void LCD12864_Wbyte(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- LCD12864_SCLK = 0;
- byte <<= 1; //左移待寫入數據,使最高位移至CY
- LCD12864_STD = CY; //寫入一位數據
- LCD12864_SCLK = 1;
- LCD12864_SCLK = 0;
- }
- }
- /***************************從12864讀出8位數據***返回:sdat************************************/
- uchar LCD12864_Rbyte(void)
- {
- uchar i,sdat,temp1,temp2;
- temp1 = 0;
- temp2 = 0;
- //==========12864的串行數據輸出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度兩個八位整合==============
- for(i=0;i<8;i++)
- {
- temp1=temp1 << 1;
- LCD12864_SCLK = 0;
- LCD12864_SCLK = 1;
- LCD12864_SCLK = 0;
- if( LCD12864_STD ) temp1|=0x01; //tempe1:D7-D6-D5-D4-0-0-0-0
- }
- for(i=0;i<8;i++)
- {
- temp2=temp2 << 1;
- LCD12864_SCLK = 0;
- LCD12864_SCLK = 1;
- LCD12864_SCLK = 0;
- if( LCD12864_STD ) temp2|=0x01; //tempe2:D3-D2-D1-D0-0-0-0-0
- }
- sdat = ((temp1 & 0xf0)|(temp2 >> 4)); //取出D7\D6\D5\D4\D3\D2\D1\D0
- return sdat; //返回一個值(sdat)
- }
- /****************************讀忙狀態**************************************/
- void LCD12864_busy( void )
- {
- do LCD12864_Wbyte( LCD12864_R_COM ); //LCD12864_RW=11111,RW(1),RS(0),0
- while( LCD12864_Rbyte() & 0x80 ); //讀BF,直到BF == 0
- }
- /*************************dat_com=0寫指令,dat_com=1寫數據*****************************************/
- void LCD12864_W (bit dat_com,uchar byte)
- {
- uchar temp;
- if(dat_com == 0) //為零,寫入指令
- temp = LCD12864_W_COM; //11111,RS(0),RW(0),0
- else //否則,寫入數據
- temp = LCD12864_W_DAT; //11111,RS(1),RW(0),0
- LCD12864_CS = 1; //片選使能
- LCD12864_busy(); //LCD忙檢測
- LCD12864_Wbyte(temp); //寫入模式選擇,指令還是數據
- LCD12864_Wbyte(byte&0xf0); //寫入字節
- LCD12864_Wbyte((byte<<4)&0xf0); //寫入字節
- LCD12864_CS = 0; //片選關閉
- }
- /****************************LCD12864初始化**************************************/
- void LCD12864_Init(void)
- {
- LCDRST=1;
- LCD12864_PSB = 0; //選擇串口模式
- LCD12864_W(LCD12864_COM,0x30); //基本指令功能.
- LCD12864_W(LCD12864_COM,0x03); //允許輸入卷動位址
- LCD12864_W(LCD12864_COM,0x0c); //脫離隨眠狀態,顯示打開,關光標,反白關.
- LCD12864_W(LCD12864_COM,0x01); //清屏指令.
- LCD12864_W(LCD12864_COM,0x06); //AC自動加一,光標右移,整體顯示不移動
- }
- /**************************LCD12864字符位置自定義顯示****************************************/
- void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
- {
- uchar addr,i=0;
- switch (x)
- {
- case 0:addr=0x80;break;
- case 1:addr=0x90;break;
- case 2:addr=0x88;break;
- case 3:addr=0x98;break;
- }
- addr=addr+y;
- LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC); //8BitMCU,基本指令集合
- LCD12864_W(LCD12864_COM,addr); //顯示在自定義位置
- while(buff[i]!='\0')[/i][i]
- {
- LCD12864_W(LCD12864_DAT,buff[i++]);
- if(++y==16)
- {
- y=0;
- if(++x==4) x=0;
- switch (x)
- {
- case 0:addr=0x80;break;
- case 1:addr=0x90;break;
- case 2:addr=0x88;break;
- case 3:addr=0x98;break;
- }
- addr=addr+y;
- LCD12864_W(LCD12864_COM,addr);
- }
-
- }
- }
- void Disp_img(unsigned char *img) //圖形方式12864顯示字模221 橫向取膜
- {
- unsigned char i,j;
- unsigned int k = 0;
- LCD12864_W(0,0x36); //圖形方式
- for(i=0;i<32;i++)
- {
- LCD12864_W(0,0x80+i);
- LCD12864_W(0,0x80);
- for(j=0;j<16;j++)
- {
- LCD12864_W(1,img[k++]);
- }
- }
- for(i=0;i<32;i++)
- {
- LCD12864_W(0,0x80+i);
- LCD12864_W(0,0x88);
- for(j=0;j<16;j++)
- {
- LCD12864_W(1,img[k++]);
- }
- }
- }
- /************************顯示1************************************/
- void display1(long temp)
- {
- uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- //temp=12345678;
- dt1 = temp%10;//1位
- dt2 = temp%100/10;//2位
- dt3 = temp%1000/100;//3位
- dt4 = temp%10000/1000;//4位
- dt5 = temp%100000/10000;//5位
- dt6 = temp%1000000/100000;//6位
- dt7 = temp%10000000/1000000;//7位
- dt8 = temp/10000000;//8位 最高位
- LCD12864_WPoss(1,0,"紅色R:");//第1行顯示表1
- // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0寫指令 1寫數據
- // LCD12864_W(1,tabe[dt8]);//6位
- //LCD12864_W(1,tabe[dt7]);//5位
- // LCD12864_W(1,tabe[dt6]);//4位
- // LCD12864_W(1,tabe[dt5]);//3位
- //LCD12864_W(1,0x2e);
- //LCD12864_W(1,tabe[dt4]);//4位
- LCD12864_W(1,tabe[dt3]);//3位
- LCD12864_W(1,tabe[dt2]);//4位
- LCD12864_W(1,tabe[dt1]);//3位
- LCD12864_WPoss(1,7,"%");//第1行顯示表1
- }
- /************************顯示2************************************/
- void display2(long temp)
- {
- uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- //temp=12345678;
- dt1 = temp%10;//1位
- dt2 = temp%100/10;//2位
- dt3 = temp%1000/100;//3位
- dt4 = temp%10000/1000;//4位
- dt5 = temp%100000/10000;//5位
- dt6 = temp%1000000/100000;//6位
- dt7 = temp%10000000/1000000;//7位
- dt8 = temp/10000000;//8位 最高位
- LCD12864_WPoss(2,0,"綠色G:");//第1行顯示表1
- // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0寫指令 1寫數據
- // LCD12864_W(1,tabe[dt8]);//6位
- // LCD12864_W(1,tabe[dt7]);//5位
- // LCD12864_W(1,tabe[dt6]);//4位
- // LCD12864_W(1,tabe[dt5]);//3位
- //LCD12864_W(1,0x2e);
- // LCD12864_W(1,tabe[dt4]);//4位
- LCD12864_W(1,tabe[dt3]);//3位
- LCD12864_W(1,tabe[dt2]);//4位
- LCD12864_W(1,tabe[dt1]);//3位
- LCD12864_WPoss(2,7,"%");//第1行顯示表1
- }
- /************************顯示3************************************/
- void display3(long temp)
- {
- uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- //temp=12345678;
- dt1 = temp%10;//1位
- dt2 = temp%100/10;//2位
- dt3 = temp%1000/100;//3位
- dt4 = temp%10000/1000;//4位
- dt5 = temp%100000/10000;//5位
- dt6 = temp%1000000/100000;//6位
- dt7 = temp%10000000/1000000;//7位
- dt8 = temp/10000000;//8位 最高位
- LCD12864_WPoss(3,0,"蘭色B:");//第1行顯示表1
- // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0寫指令 1寫數據
- //LCD12864_W(1,tabe[dt8]);//6位
- //LCD12864_W(1,tabe[dt7]);//5位
- //LCD12864_W(1,tabe[dt6]);//4位
- //LCD12864_W(1,tabe[dt5]);//3位
- //LCD12864_W(1,0x2e);
- // LCD12864_W(1,tabe[dt4]);//4位
- LCD12864_W(1,tabe[dt3]);//3位
- LCD12864_W(1,tabe[dt2]);//4位
- LCD12864_W(1,tabe[dt1]);//3位
- LCD12864_WPoss(3,7,"%");//第1行顯示表1
- }
- int main(void)
- {
- u8 sum=0,i=0;
- RGB rgb={0,0,0};
- Usart_Int(9600);
- send_com(0x01);//發送讀方位角指令
-
- LCD12864_Init();
- LCD12864_WPoss(0,1,"TCS34725顏色");//第1行顯示表1
-
- timer2_init();//定時器2初始化
-
- while(1)
- {
- if(Receive_ok)//串口接收完畢
- {
- for(sum=0,i=0;i<(rgb_data[3]+4);i++)//rgb_data[3]=3
- sum+=rgb_data[i];[/i][i]
- if(sum==rgb_data[i])//校驗和判斷[/i][i]
- {
- rgb.Red=rgb_data[4];
- rgb.Green=rgb_data[5];
- rgb.Blue=rgb_data[6];
- send_3out(&rgb_data[4],3,0x45);//上傳給上位機
-
-
- display1(rgb.Red);//顯示紅色R:
- display2(rgb.Green);//顯示綠色G:G:
- display3(rgb.Blue);//顯示蘭色B:
-
- //通過TCS34725傳感器感受的光線進行PWM三基色彩還原、、
-
- PWM_IO0_ZKB = 255-rgb.Red; //紅色R:
- PWM_IO1_ZKB = 255-rgb.Green;//綠色G:
- PWM_IO2_ZKB = 255-rgb.Blue;//蘭色B:
-
-
-
- }
- Receive_ok=0;//處理數據完畢標志
- }
- }
- }
復制代碼
全部資料51hei下載地址:
顏色傳感器電腦端程序.zip
(1.28 MB, 下載次數: 152)
2018-12-31 01:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
128顯串STC89TCS34725顏色OK2.zip
(71.07 KB, 下載次數: 183)
2018-12-31 01:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|