Automatic door using RFID SL25m + PIC16F887 + LCD ( Full code)

Hi every body, today , i want introduce a bout RFID techlogy :
This movie demo project
 

and
sourcecode and comment :
//============================================
//PIC C source code
//PIC16F887(8MHz) + PICC 9.70
//============================================
#include // hỗ trợ khai báo dòng pic đươc dùng
#include //thư viện pic 16f887
#include // thư viện các hàm dùng để xử lý chuỗi
#include "lcd.h" // thư viện lcd



__CONFIG(HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & 
SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS);   // cấu hình các thanh ghi khởi tạo cho pic
__CONFIG(DEBUGEN&LVPDIS&FCMEN&IESOEN&BOREN&UNPROTECT&DUNPROTECT&MCLREN&PWRTEN&WDTDIS&INTIO&BORV21); // cấu hình các thanh ghi khởi tạo cho pic

//============================================
//  PIN define
//============================================
#define RX_PIN TRISC7 //khai báo chân RX
#define TX_PIN TRISC6 // khai báo chân TX
#define Buzzer RC3 // khai báo loa báo
#define LED    RA5 // khai báo led báo
#define CARDIN_SL025x    RC0 // khai báo chân State Tag 

//============================================
//  Uart status words define - khai báo các trạng thái truyền của UART
//============================================
#define UARTSTATUS_FREE 0  // trạng thái tự do
#define UARTSTATUS_TX 1 // trạng thái truyền dữ liệu
#define UARTSTATUS_TXSUCC 2 // trạng thái truyền thành công
#define UARTSTATUS_RXSUCC 3 // trạng thái nhận thành công 
#define UARTSTATUS_RXERR 4 // trạng thái nhận bị lỗi

//============================================
//  Card type define - khai báo các loại thẻ
//============================================
#define CARDTYPE_S50 0 // loại thẻ S50
#define CARDTYPE_S70 1 // loại thẻ s70
#define CARDTYPE_ProX 2 // loại thẻ ProX
#define CARDTYPE_Pro 3 // loại thẻ Pro
#define CARDTYPE_UL 4 // loại thẻ UL
#define CARDTYPE_DES 5 // loại thẻ Des
#define CARDTYPE_TAG 6 // loại thẻ tag
#define CARDTYPE_ICODE 7 // loại thẻ ICODE

//============================================
//  global variable define - khai báo biến toàn cục
//============================================
bank1 unsigned int g_iTimer; // ô nhớ cuả giá trị của Timer
bank1 unsigned char g_cTimer_Buzzer; // ô nhớ của giá trị Timer ban đầu cho chuông 
unsigned char g_bOverTime; // biến đánh dấu Timer tràn
bit g_bUartTxHead; // bit header của frame truyền đi
bit g_bUartRxHead;// bit header của frame nhận
const unsigned char *g_pUartTxDat; // biến lưu trữ giá trị data tạm thời truyền đi
unsigned char g_cUartTxCheckSum; // byte kiểm tra lỗi
unsigned char g_cUartRxCnt; // biến đếm số byte trong frame dữ liệu
unsigned char g_cUartStatus; // biến chỉ trạng thái của UART

bank1 unsigned char g_cRxBuf[40]; // mảng các ô nhớ lưu giá trị nhận được (0 --> 39)
bank1 unsigned char g_cUartTxCnt; // ô nhớ dành cho biến đếm
bank1 unsigned char g_cUartTxDataLen; // ô nhớ dành cho biến độ dài data
bank1 unsigned char g_cCardType; // ô nhớ dành cho nhớ loại thẻ

//====================================a========
//  Command List - Danh sách các lệnh của đầu đọc, xem báo cáo phụ lục 1, preamble + length + command 
//============================================
const unsigned char SelectCard[] = {0xBA,0x02,0x01 };       
const unsigned char LoginSector0[] = {0xBA,0x0A,0x02,0x00,0xAA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};  
const unsigned char LoginSector1[] = {0xBA,0x0A,0x02,0x01,0xAA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
const unsigned char ReadBlock1[] = {0xBA,0x03,0x03,0x01};                                     
const unsigned char WriteBlock1[] = {0xBA,0x13,0x04,0x01,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};                                
const unsigned char ReadValue[] = {0xBA,0x03,0x05,0x05};  
const unsigned char InitializeValue[]  = {0xBA,0x07,0x06,0x04,0x00,0x00,0x00,0x01};                                
const unsigned char IncrementValue[] = {0xBA,0x07,0x08,0x04,0x00,0x00,0x00,0x20};                                
const unsigned char DecrementValue[] = {0xBA,0x07,0x09,0x04,0x03,0x00,0x00,0x00};                                          
const unsigned char CopyValue[] = {0xBA,0x04,0x0A,0x04,0x05};
const unsigned char ReadULPage5[] = {0xBA,0x03,0x10,0x05};                                          
const unsigned char WriteULPage5[] = {0xBA,0x07,0x11,0x05,0x11,0x22,0x33,0x44};
const unsigned char TurnOnRedLed[] = {0xBA,0x03,0x40,0x01};     
const unsigned char TurnOffRedLed[] = {0xBA,0x03,0x40,0x00};             

//============================================
//  procedure define - khai báo các chương trình con
//============================================
void Init_Hardware(void); //hàm khởi tạo phần cứng ban đầu
void BuzzerOn(void); // hàm loa báo
void Start_Time(unsigned int ms); // hàm khởi tạo Timer
void SendBuf_UART(const unsigned char *dat,unsigned char len); // hàm truyền UART
void SL025M(void); //hàm xử lý của SL025M
void delay(unsigned int time); //chương trình con hàm delay
void Open_Close_Door(void); // Chương trình đóng - mở cửa
//==============================================
// Open - close door program - Chương trình đóng - mở cửa
//==============================================
void Open_Close_Door(void)
{
   
    int state_1; // trạng thái của SW1 ( =1 khi Switch hở mạch, =0 khi Switch kín mạch)
    int state_2;//trạng thái của SW2 ( =1 khi Switch hở mạch, =0 khi Switch kín mạch)
    ANSEL=0; // khai báo 8 bit thâp là các chân digital
    ANSELH=0; //khai báo 8 bit cao là các chân digital
    TRISA0=0;//khai chân A0 là output
    TRISA1=0;// khai báo chân A1 là output
    TRISE1=1;// khai báo chân E1 là input
    TRISE2=1;//khai báo chân E2 là input
    RA0 = 0; // tắt chiều quay ngược của động cơ - đóng cửa
    RA1 = 1;//điều khiển động cơ quay thuận - mở cửa
    if(RE1) // khi SW1 hở mạch thì 
        state_1 =1; // trạng thái SW1 hở mạch
    while(state_1) // trong khi SW1 hở mạch
    {
    if(!RE1) // kiểm tra SW1 có được nhấn hay không, nếu được nhấn thì 
        state_1 =0; // nhảy ra khỏi vòng lặp While
        lcd_gotoxy(0,0); // nhảy tới cột 0, dòng 0 LCD
        lcd_puts("Door Opening..."); // hiển thị ra lcd
        delay(150); // delay 150 xung clock
        // chương trình Led nháy
        RC3=0; // đèn led sáng
        __delay_ms(100); // delay 100ms
        RC3=1; //led tắt
        // kết thúc ct led nháy
        RA1 = 1;// điều khiển động cơ mở cửa
        __delay_ms(100); //delay 1s
    };
   
   
    RA1 = 0;//ngừng động cơ quay mở cửa
    __delay_ms(100); //delay 1s
    if(RE2) // khi SW2 hở mạch thì 
        state_2 =1; // trạng thái SW2 hở mạch
    while(state_2) // trong khi trong khi SW2 hở mạch
    {
    if(!RE2) //  nhảy ra khỏi vòng lặp While
        lcd_gotoxy(0,0); // nhảy tới cột 0, dòng 0 LCD
        lcd_puts("Door Closing...."); // hiển thị ra lcd
        delay(150); // delay 150 xung clock
        // chương trình led nháy
        RC3=0;// sáng led
        __delay_ms(100); // delay 100ms
        RC3=1; //led tắt
        //kết thúc ct led nháy
        RA0 = 1; // điều khiển động cơ đóng cửa
        __delay_ms(100); //delay 1s
    };

    RA0 = 0; // ngừng động cơ đóng cửa
};
//============================================
//  initialize system hardware config - hàm khởi tạo phần cứng ban đầu
//  timer,uart,port
//============================================
void Init_Hardware(void)
{   
  OSCCON=0x71;        //8M
  while(HTS==0);    //     trong khi Pic chưa xác định được tần số thì chờ 
  ANSEL=0x00;//khai bao digital 8 bit thap
  ANSELH=0x00;  //khai bao digital 8 bit cao
  TRISB2=0;//khai bao chan số 2 port B là  output
  TRISC3=0; // khai bao chan số 3 port C là  output
  TRISA5=0; //khai bao chan số 5 port A là  output
  OPTION=0x07;//Prescaler Rate=1:256
  TMR0=0xb1; // nap gia tri Timer ban dau
  T0IE=1; // bat ngat Timer 0 (datasheet xem 76, muc 5.1.4)
  RX_PIN=1; // khai bao chan RX
  TX_PIN=1;// khai bao chan TX
  Buzzer=1; // khai bao loa bao dong
  LED=0; // khai bao trang thai ban dau led tat
  TXSTA=0x04; // lua chon mode High speed
  RCSTA=0x90; // enable serial port,cho phep nhan tin hieu lien tuc
  BAUDCTL=0x08; // khoi tao gia tri thanh ghi dieu khien Baud rate, su dung bo tao dao dong 16bit
  SPBRG=0x10; // khai bao thanh ghi tinh toan Baud rate, 8 bit thap cua thanh ghi 16 bit
  SPBRGH=0; // khai bao thanh ghi tinh toan Baud rate, 8 bit cao cua thanh ghi 16 bit
  RCIE=1; // cho phep ngat UART (xem tr34)
  TXEN=1; //cho phep truyen (tr 160)
  PEIE=1; // cho phep ngat ngoai vi
  GIE=1; // cho phep ngat trong
}

//============================================
//  interrupt service - các dịch vụ hàm ngắt
//  timer interrupt - hàm ngắt timer
//  uart rx interrupt - hàm ngắt UART
//============================================
void interrupt isr(void)
{
  unsigned char dat; // biến data
  unsigned char CheckSum; // biến kiểm tra lỗi
  unsigned char counter; // biến đếm
  if(T0IF)  // nếu cờ ngắt Timer 0 được bật lên (TOIF=1) thì 
  {
    T0IF=0; // xóa cờ ngắt
    TMR0=0xb1; // nạp lại giá trị cho Timer 0
    if(g_iTimer!=0) // nếu giá trị của Timer 0 mà khác 0 (đếm ngược giá trị Timer từ 30 ms về 0) thì
    {
      g_iTimer--; // giá trị Timer giảm đi 1 đơn vị
      if(g_iTimer==0) g_bOverTime=1; // nếu giá trị Timer 0 = 0 thì bit đánh dấu Timer 0 tràn sẽ được bật lên
    }
    // phục vu cho chương trình con "BuzzerOn"
    if(g_cTimer_Buzzer!=0)  // kiểm tra giá trị Timer_Buzzer có khác 0 không?
    {
      g_cTimer_Buzzer--; // giảm biến này đi 1 đơn vị
      if(g_cTimer_Buzzer==0) //nếu biến này =0 thì 
        {
            Buzzer=1; // bật chuông báo
            LED = 0; //led sáng
        }
// kết thúc ct pv ct con "BuzzerOn"
    }   
  }
  //PHẦN XỬ LÝ NGẮT UART
  if(RCIF)// khi nào có dữ liệu thì cờ ngắt nhận bật lên
  {
    dat=RCREG; //data được nhận từ thanh ghi Recieve
    {
      g_cRxBuf[g_cUartRxCnt]=dat; // từng bit data nhận được sẽ được lưu vào từng ô nhớ Buffer
      g_cUartRxCnt++; // tăng thứ tự ô nhớ

      if(g_cUartRxCnt==g_cRxBuf[1]+2) //lấy ID từ bit thứ 3
      {
        lcd_putc(g_cUartRxCnt[g_cRxBuf]+0x30);// hiển thị ID của thẻ trên LCD
        CheckSum=0; // gán biến checksum là không có lỗi xảy ra
        for(counter=0;counter        if(CheckSum==0) g_cUartStatus=UARTSTATUS_RXSUCC; // nếu kiểm tra lỗi của frame dữ liệu nhận được là không có lỗi thì báo là nhận thành công
        else g_cUartStatus=UARTSTATUS_RXERR; // ngược lại thì báo việc nhận bị lỗi

      }
    }
  }
}




//============================================
//  turn on buzzer about 100mS - hàm loa báo
//============================================
void BuzzerOn(void)
{
  Buzzer=0; // sáng led
  LED = 1; // chuông kêu
  g_cTimer_Buzzer=16; // thời gian chuông kêu là 16ms
}

//============================================
//  start timer - hàm khởi tạo Timer
//============================================
void Start_Time(unsigned int ms)
{
  g_iTimer=ms; // điền giá trị cho Timer
  g_bOverTime=0; // đưa bit đánh dấu Timer tràn về 0
}

//============================================
//  send buffer by uart - hàm truyền UART
//============================================
void SendBuf_UART(const unsigned char *dat,unsigned char len)
{
  unsigned char tmp; // khai báo biến tạm
  // chuẩn bị dữ liệu để truyền đi
  g_cUartStatus=UARTSTATUS_TX; 
  g_pUartTxDat=dat;
  g_cUartTxDataLen=len;
  g_cUartTxCnt=0;
  g_cUartTxCheckSum=0;
  g_bUartTxHead=0;
  
  while(g_cUartTxCnt!=g_cUartTxDataLen) //kiểm tra xem đã truyền hết dữ liệu chưa
  {
    tmp=g_pUartTxDat[g_cUartTxCnt]; //biến tạm = dữ liệu truyền di
    g_cUartTxCheckSum=g_cUartTxCheckSum^tmp; // tính giá trị của biến CheckSum
    g_cUartTxCnt++; // tăng biến đếm lên 1 đơn vị
   
    while(TXIF==0); // kiểm tra cờ ngắt truyền
    TXREG=tmp; // bắt đầu truyền dữ liệu
  }
  g_cUartStatus=UARTSTATUS_TXSUCC; // báo trạng thái đã truyền hết dữ liệu
  g_cUartRxCnt=0; //sau khi truyền hết 1 frame, gán lại giá trị biến đếm = 0
  while(TXIF==0); // trong khi cờ ngắt tắt thì
  TXREG=g_cUartTxCheckSum; // truyền checksum
}

// chương trình con hàm delay - "time" clock
void delay(unsigned int time)
{
    unsigned int i,j; // khai báo biến i,j
    // vòng lặp time*time xung clock
    for(i=0;i

}
 Download

Schematic + Code

More information plz contact me !
Thank u !

1 comment:

guevas said...

hello, how you a doing?
please send the diagram of RFID sl025.
thank you.

Related Posts Plugin for WordPress, Blogger...

Cùng tôi học Điện Tử ..(http://ilovec.tk)..