This movie demo project
sourcecode and comment :
//============================================Download
//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;counterif(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
}
Schematic + Code
More information plz contact me !
Thank u !
1 comment:
hello, how you a doing?
please send the diagram of RFID sl025.
thank you.
Post a Comment