Trang

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:

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

    ReplyDelete

Cám ơn bạn đã ghé ngonnguc.blogspot.com. Bạn có ý kiến thắc mắc hay bình luận gì về bài viết này vui lòng click nhận xét. Để lưu bài viết vào trình duyệt web hoặc tài khoản lưu trữ và chia sẻ bookmark trực tuyến, hãy nhấn vào đây. Bạn cũng có thể đọc bài viết trên blog thông qua các công cụ đọc tin Feed bằng link này hoặc đăng ký nhận bài viết mới qua email. Ngoài ra bạn cũng có thể cho địa chỉ blog này vào Favorites (Internet Explorer) hoặc Bookmark (Mozilla Firefox) để tiện việc theo dõi. Nếu đang làm blog tại Google Blogger bạn cũng có thể lưu blog này ở chế độ theo dõi trong hồ sơ, đó cũng là cách mang lại nguồn khách viếng thăm blog bạn. Tôi hy vọng bạn tìm thấy những thú vị từ trang này.Bạn có thể gõ tiếng việt bằng công cụ có trên blog