trunghanh810346
Newbie level 4
I don't know where the error is? I'm a newbie about this and and i just have 1 day later to complete this project, please help me
sorry about my english ability, thank you everybody.
This video shows it work:
https://www.youtube.com/watch?v=scD4xu0PQT4&t=2s
This is my circuit
This is my code
sorry about my english ability, thank you everybody.
This video shows it work:
https://www.youtube.com/watch?v=scD4xu0PQT4&t=2s
This is my circuit
This is my code
Code:
#include <stdio.h>
#include <pic18f4550.h> // dinh kem thu vien dinh nghia cua PIC18f4550
#include <xc.h>
//turn off watchdog timer, ext crystal without PLL, activate MLCR pin
#pragma config WDT = OFF, PLLDIV = 2, CPUDIV = OSC1_PLL2, FOSC = HS, MCLRE = ON , LVP = OFF
//define crystal frequency for dalay function
#define _XTAL_FREQ 8000000
short int so_dem; // khai bao bien gia tri so dem duoc
float ty_le_cb=0; // ty le cam bien dan
int muc=0; // muc xac dinh cua cam bien
int co_vat=0; // bao co vat can hay khong
short int cham=0xff; // dau cham hien thi tren LED 7 doan bao có vat hay khong
// 0 1 2 3 4 5 6 7 8 9
unsigned char ma7doan[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int ADC_Read(unsigned char channel)
{
if(channel > 7) //Channel range is 0 ~ 7
return 0;
ADCON0 &= 0xC5; //Clearing channel selection bits
ADCON0 |= channel<<3; //Setting channel selection bits
__delay_ms(2); //Acquisition time to charge hold capacitor
GO_nDONE = 1; //Initializes A/D conversion
while(GO_nDONE); //Waiting for conversion to complete
return ((ADRESH<<8)+ADRESL); //Return result
}
void main(void)
{
TRISB = 0; //PORTB la output
TRISD = 0; //PORTD la output
LATB = 0;
LATD = 0;
/*TRISC = 1; //PORTD la output
LATB = 1;*/
so_dem = Read_b_eep (0); // doc so dem cu duoc luu trong eeprom tai dia chi 0
ADCON1 = 0x0E; // RA0 is analog, reference voltage is Vdd,Vss
TRISAbits.TRISA0 = 1; // AN0 is input
/*ADCON2bits.ADFM = 1; //right justified
ADCON2bits.ACQT = 2; //ACQT = 4*Tad*/
ADCON2bits.ADCS = 11; //ADCS = Fosc/8, Tad = 1us internal
ADCON0bits.CHS = 0; // select channel 0
ADCON0bits.ADON = 1; //enable ADC
while(1) // vong lap vo han
{
LATB = (ma7doan[so_dem/10%10]&cham);
LATD = ma7doan[so_dem%10];
__delay_us(25);
ty_le_cb=(ADC_Read(0)*0.39); // doc ty lê % tín hieu tu mat thu hông ngoai (0-100); gia tri adc max=255; 0,39=100/255;
if(ty_le_cb>70) // khi ty le dan cua mat thu lon hon nguong (70) th́ do là muc 1, tuc khong co vat can
{
muc=1; // xac dinh muc 1;
cham=0xff; // tat LED bao co vat can
}
if(ty_le_cb<30) // khi ty le dan cua mat thu nho hon nguong (30) th́ do là muc 0, tuc co vat can
{
muc=0; // xac dinh muc 0;
cham=0x7f; // bat led bao co vat can
co_vat=1; // bao co vat can
}
if(muc==1&&co_vat==1) // neu muc = 1 và co vat can // tuc vat can da di qua cam bien
{
co_vat=0; // bao khong co vat
so_dem++; // tang so dem
if(so_dem>99) // gioi han so dem den 99
{
so_dem=0; // dat lai so dem = 0 khi so dem > 99
}
Write_b_eep(0, so_dem); // ghi so dem vao EEPROM tai dia chi 0
}
//----------------------------------------
if(TRISCbits.TRISC2==0) // khi nút reset so dem duoc nhan
{
while(TRISCbits.TRISC2==0); // tao vong lap chowf nut duoc nha
so_dem=0; // dat so dem ve 0;
Write_b_eep(0, so_dem); // ghi so dem vao EEPROM tai dia chi 0
}
if(TRISCbits.TRISC0==0) // khi nut giam duoc nhan
{
while(TRISCbits.TRISC0==0); // tao vong lap chowf nut duoc nha
so_dem--; // giam gia tri so dem
if(so_dem>99) // neu so dem > 99
{
so_dem=99; // nap lai so dem = 99
}
Write_b_eep(0, so_dem); // ghi so dem vao EEPROM tai dia chi 0
}
if(TRISCbits.TRISC1==0) // khi nut tang duoc nhan
{
while(TRISCbits.TRISC1==0); // tao vong lap chowf nut duoc nha
so_dem++; // tang gia tri so dem
if(so_dem>99) // neu so dem > 99
{
so_dem=0; // nap lai so dem = 0
}
Write_b_eep(0, so_dem); // ghi so dem vao EEPROM tai dia chi 0
}
}
}