Tải bản đầy đủ (.docx) (5 trang)

Code mô hình bộ đếm sản phẩm phân loại theo màu sắc sử dụng PIC 16F887

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (53.81 KB, 5 trang )

#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;
1


#INT_EXT
void 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
2


sv_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);
3


show_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);
4


show_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();
}
}

5



×