www.thachdt.com www.thachdt.com www.thachdt.com www.thachdt.com Điện thoại: 0901965800

Thứ Tư, 18 tháng 10, 2017

Filled Under:

Mạch phân loại màu dùng cảm biến màu TCS3200 hiển thị LCD 16x2




Video test mạch : 





Code của mạch : viết trên phần mềm CCS
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
///////// 220von.blogspot.com        /////////////
///////// 220von.com                       /////////////
///////// 220von.com@gmail.com  /////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
#include <16F877A.h>
#include <string.h>
#include <stdlib.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=12000000)
#byte T1CON   = 0x10        
#define S2 PIN_C2
#define S3 PIN_C3
float tanso=0,F_R=0,F_B=0,F_G=0,F_C=0;
char R=0,B=0,G=0;
int1 chopheptinh=0;
void mau();
char menu=1;
////////////////////////////////////////////////////////
#define lcd_type 2         
#define lcd_line_two 0x40   
#define  RS PIN_A0
#define  RW PIN_A1
#define ENABLE PIN_A2 
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//////////////////////////////////////////////////////////////////////////
void lcd_send_nibble( BYTE n ) {
      if(n&0x01)output_high(PIN_A3);
      else output_low(PIN_A3);
      if(n&0x02)output_high(PIN_A4);
      else output_low(PIN_A4);
      if(n&0x04)output_high(PIN_A5);
      else output_low(PIN_A5);
      if(n&0x08)output_high(PIN_E0);
      else output_low(PIN_E0);     
      delay_us(50);
      output_high(ENABLE);
      delay_us(50);
      output_low(ENABLE);
      delay_ms(1);
}
void lcd_send_byte( BYTE address, BYTE n ) {

      output_low(RS);
      if(address)output_high(RS);
      else output_low(RS);
      delay_us(50);
      output_low(RW);
      delay_us(50);
      output_low(ENABLE);
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
      delay_ms(1);
}
void lcd_init() {
    BYTE i;
    output_low(RS);
    output_low(RW);
    output_low(ENABLE);
    delay_ms(50);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(10);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);     break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}
//////////////////////////////////////////////////////////////////////////
#INT_RTCC
void  RTCC_isr(void)
{
tanso=get_timer1()*45.87156;
mau();
set_timer1(0);
set_timer0(0);
}
void main()
{
set_tris_a(0x00);
set_tris_c(0xff);
output_a(0x00);
output_low(S2);
output_low(S3);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);      //21.8 ms overflow
T1CON=0x0B;
set_timer0(0);
set_timer1(0);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("....TSC3200.....\n");
lcd_putc("Phan Hoang Thach");
delay_ms(1000);
output_low(S2);
output_low(S3);
lcd_putc("\f");
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
char str[3];
char so=0;
while(true)
 {

   if(chopheptinh==1)
         {
          R=(F_R*100)/F_C;
          B=(F_B*100)/F_C;
          G=(F_G*100)/F_C;
          if((R>=69)&&(R<=79)&&(B>=18)&&(B<=25)&&(G>=13)&&(G<=18))so=1;//do
          else if((R>=50)&&(R<=68)&&(B>=17)&&(B<=25)&&(G>=20)&&(G<=25))so=2;//cam
          else if((R>=7)&&(R<=14)&&(B>=58)&&(B<=66)&&(G>=27)&&(G<=32))so=3;//xanh duong
          else if((R>=45)&&(R<=51)&&(B>=17)&&(B<=22)&&(G>=33)&&(G<=37))so=4;//vang
          else if((R>=20)&&(R<=25)&&(B>=31)&&(B<=37)&&(G>=40)&&(G<=54))so=5;//xanh la
          else so=0;
                   
          chopheptinh=0;
         }

 if(so==1) {lcd_gotoxy(1,0);lcd_putc("     Mau Do     ");}
 else if(so==2) {lcd_gotoxy(1,0);lcd_putc("     Mau Cam    ");}
 else if(so==3) {lcd_gotoxy(1,0);lcd_putc(" Mau Xanh Duong ");}
 else if(so==4) {lcd_gotoxy(1,0);lcd_putc("    Mau Vang    ");}
 else if(so==5) {lcd_gotoxy(1,0);lcd_putc("   Mau Xanh La  ");}
 else {lcd_gotoxy(1,0);lcd_putc(" Khong xac dinh ");}

 sprintf(str,"%u",R);
 if(R<100)str[2]=' ';
 if(R<10){str[2]=' ';str[1]=' ';}
 lcd_gotoxy(1,1);
 lcd_putc("R=");
 lcd_gotoxy(3,1);
 lcd_putc(str[0]);
 lcd_gotoxy(4,1);
 lcd_putc(str[1]);
 lcd_gotoxy(5,1);
 lcd_putc(str[2]);

 sprintf(str,"%u",B);
 if(B<100)str[2]=' ';
 if(B<10){str[2]=' ';str[1]=' ';}
 lcd_gotoxy(6,1);
 lcd_putc("B=");
 lcd_gotoxy(8,1);
 lcd_putc(str[0]);
 lcd_gotoxy(9,1);
 lcd_putc(str[1]);
 lcd_gotoxy(10,1);
 lcd_putc(str[2]);

 sprintf(str,"%u",G);
 if(G<100)str[2]=' ';
 if(G<10){str[2]=' ';str[1]=' ';}
 lcd_gotoxy(11,1);
 lcd_putc("G=");
 lcd_gotoxy(13,1);
 lcd_putc(str[0]);
 lcd_gotoxy(14,1);
 lcd_putc(str[1]);
 lcd_gotoxy(15,1);
 lcd_putc(str[2]);
 }
}
void mau()
{
switch(menu)
    {
    case 1://red
       {
         output_low(S2);
         output_low(S3);
         F_R=tanso;
         menu=2;
         output_low(S2);
         output_high(S3);        
         break;
        }
    case 2://blue
        {
         output_low(S2);
         output_high(S3);
         F_B=tanso;
         menu=3;
         output_high(S2);
         output_high(S3);        
         break;
        }
    case 3://green
        {
         output_high(S2);
         output_high(S3);
         F_G=tanso;
         menu=4;
         output_high(S2);
         output_low(S3);
         break;
        }       
    case 4:
        {
         output_high(S2);
         output_low(S3);
         F_C=tanso;
         chopheptinh=1;
         menu=1;
         output_low(S2);
         output_low(S3);
         break;
        }

    }


Mạch phân biệt được 5 màu khác nhau , các bạn có thể mở rộng để phân biệt được nhiều màu khác nhau

Nếu các bạn muốn hợp tác với mình để mở rộng chức năng cho ứng dụng này hoặc chia sẻ ý tưởng ứng dụng vào cuộc sống thì gửi mail cho mình theo địa chỉ : 220von.com@gmail.com

9 nhận xét:

Unknown nói...

thanks add rất nhiều

Ahihidongox nói...

ad có thể chỉ cho e, tính 2 cái timer đó như thế nào đc ko ạ

Unknown nói...

cho em hỏi mạch này dùng bao nhiêu vol ạ

thachdt nói...

12V bạn nha

Unknown nói...

em lấy 12v từ adapter được không ạ

Cau hoi nói...

có ai giải thích code cho mình với ạ

Văn Tài nói...

sao em làm tương tự mà lcd cứ hiện '
" R = 0 B=0 G=0
khong xac dinh"
khong có thay đổi gì, giá trị R, B,G cứ 0

ad giúp với ạ

Nặc danh nói...

chắc do sai chân cắm

sang phạm nói...

mình cũng bị vậy. ko biết sửa sao