Code dùng cho mô hình đếm và phân loại sản phẩm theo màu sắc lập trình cho con PIC 16F887 .Code dùng cho mô hình đếm và phân loại sản phẩm theo màu sắc lập trình cho con PIC 16F887 .Code dùng cho mô hình đếm và phân loại sản phẩm theo màu sắc lập trình cho con PIC 16F887 .Code dùng cho mô hình đếm và phân loại sản phẩm theo màu sắc lập trình cho con PIC 16F887 .
Trang 1#include <16f887.h>
#include <DEF_16F887.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, NOBROWNOUT
#use delay(clock=20000000)
//khai bao cac port su dung
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
//khai bao dia chi port
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
#byte porte=0x09
//khai bao cac thu vien su dung
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#bit bt1 = portd.7
#bit bt2 = portd.6
#bit bt3 = portd.5
#bit relay = portd.3
#bit sv_r = porte.0
#bit sv_g = porte.1
#bit sv_b = porte.2
#bit data = portc.2
#bit stcp = portc.1
#bit shcp = portc.0
#bit s2 = portb.1
#bit s3 = portb.2
#bit s1 = portb.3
#bit s0 = portb.4
#bit led = portb.5
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; unsigned int16 pulse=0, pulse_r=0, pulse_g=0, pulse_b=0;
unsigned int val_r=0, val_g=0, val_b=0;
unsigned int step=0, color=0;
Trang 2void ngat()
{
pulse++;
}
#INT_TIMER1
void ngat_time()
{
step++;
switch(step)
{
case 1: //1.5ms
sv_r=1; sv_g=1; sv_b=1;
set_timer1(59535);
break;
case 2: //0.3ms
switch(color)
{
case 1:
sv_r=0;
break;
case 2:
sv_g=0;
break;
case 3:
sv_b=0;
break;
default:
break;
}
set_timer1(63035);
break;
case 3: //8.2ms
sv_r=0; sv_g=0; sv_b=0;
set_timer1(24535);
break;
case 4: //10ms
Trang 3sv_r=0; sv_g=0; sv_b=0;
set_timer1(15535);
step=0;
break;
default:
break;
}
}
void IC_74hc595(int val)
{
unsigned char i;
shcp = 0;
for(i=0;i<=7;i++)
{
if((val & 0x80)==0) data=0;
else data=1;
val=val<<1;
shcp=1;
shcp=0;
}
}
void show_led(unsigned int val1, unsigned int val2, unsigned int val3)
{
IC_74hc595(Code7Seg[val1]);
IC_74hc595(Code7Seg[val2]);
IC_74hc595(Code7Seg[val3]);
stcp=0;
delay_us(5);
stcp=1;
stcp=0;
}
void read_color()
{
s2=0; s3=0; pulse=0; delay_ms(10); pulse_r = pulse; // doc tin ieu mau do
s2=1; s3=1; pulse=0; delay_ms(10); pulse_g = pulse; // doc tin ieu mau xanh la s2=0; s3=1; pulse=0; delay_ms(10); pulse_b = pulse; // doc tin ieu mau xanh duong
if((pulse_r>pulse_g)&&(pulse_r>pulse_b)&&(pulse_r>100))
{
if(val_r++>9) val_r=0;
write_eeprom(0x00, val_r);
Trang 4show_led(val_b,val_g,val_r);
color=1;
delay_ms(8000);
}
if((pulse_g>pulse_r)&&(pulse_g>pulse_b)&&(pulse_g>50)) {
if(val_g++>9) val_g=0;
write_eeprom(0x01, val_g);
show_led(val_b,val_g,val_r);
color=2;
delay_ms(10000);
}
if((pulse_b>pulse_g)&&(pulse_b>pulse_r)&&(pulse_b>100)) {
if(val_b++>9) val_b=0;
write_eeprom(0x02, val_b);
show_led(val_b,val_g,val_r);
color=3;
delay_ms(12000);
}
if((pulse_r<100)&&(pulse_g<100)&&(pulse_b<100))
{
color=0;
}
}
void pulsh_button()
{
if(bt1==0)
{
delay_ms(1000);
relay =~ relay;
while(bt1==0){};
}
if(bt2==0)
{
delay_ms(100);
val_r=0; val_g=0; val_b=0;
write_eeprom(0x00, val_r);
write_eeprom(0x01, val_g);
write_eeprom(0x02, val_b);
Trang 5show_led(val_b,val_g,val_r);
while(bt2==0){};
}
}
void main()
{
set_tris_a(0b000110);
set_tris_b(0b00000001);
set_tris_d(0b11100000);
set_tris_c(0b10000000);
set_tris_e(0b000);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
set_timer1(55035);
enable_interrupts(INT_TIMER1);
s0=1; s1=0; //f=100%
led=1;
val_r = read_eeprom(0x00);
val_g = read_eeprom(0x01);
val_b = read_eeprom(0x02);
show_led(val_b,val_g,val_r);
while(TRUE)
{
read_color();
pulsh_button();
}
}