|
本人小白一枚,才接觸單片機,有點單片機基礎(chǔ),這段時間在做個倉庫管理系統(tǒng),用的STC89C52RC芯片加上RFID,第一次刷卡是入庫,第二次刷卡則是出庫,但是我不太懂怎么實現(xiàn),C語言看的懂,就是不知道怎么寫,求大神幫幫忙,只要能在串口調(diào)試助手上能顯示卡號就行了!
謝謝大佬了!單片機代碼如下:
- #include "reg52.h"
- #include "main.h"
- #include "mfrc522.h"
- #include<intrins.h> //函數(shù)處理頭文件
- #include<string.h> //字符串處理頭文件
- #include<stdio.h> // 輸入輸出函數(shù)頭文件
- unsigned char code data1[16] = {0x00,0x00,0x00,0xAA,0xFF,0xFF,0xFF,0x55,0x00,0x00,0x00,0xAA,0x01,0xFE,0x01,0xFE};//
- //M1卡的某一塊寫為如下格式,則該塊為門禁,不同的門修改門碼即可
- //4字節(jié)門碼(低字節(jié)在前)+4字節(jié)門碼取反+4字節(jié)門碼+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
- //unsigned char code data2[16] = {0x00,0x00,0x00,0x55,0xFF,0xFF,0xFF,0xAA,0x00,0x00,0x00,0x55,0x01,0xFE,0x01,0xFE};//
- unsigned char code data2[16] = {0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xff,0x00,0x00,0x00,0x00,0x01,0xFE,0x01,0xFE};
- //M1卡的某一塊寫為如下格式,則該塊為門禁,不同的門修改門碼即可
- //4字節(jié)門碼(低字節(jié)在前)+4字節(jié)門碼取反+4字節(jié)門碼+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
- unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //密碼
- unsigned char TYPE_DATA[2];//類型
- unsigned char ID_DATA[4]; //ID地址
- unsigned char value_DATA[4];//卡里面的值
- unsigned char g_ucTempbuf[20];//
- unsigned char code DIS1[] = {" 倉庫管理系統(tǒng) "};
- unsigned char code DIS2[] = {"貨物ID:"};
- unsigned char code DIS3[] = {"雪花物流歡迎您"};
- unsigned char code DIS4[] = {"請掃描貨物! "};
- unsigned char code DIS6[] = {"0123456789ABCDEF"};
- unsigned char code DIS7[]= {"請入庫! "};
- unsigned char tt=0,key_data,key_olddata,mode,profalg,kaimengtime;
- unsigned int a,b;
- void delay1(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void fengmingqi()
- {
- fmq = 0;
- delay1(100);
- fmq = 1;
- delay1(100);
- fmq = 0;
- delay1(200);
- fmq = 1;
- delay1(600);
- }
- void main( )
- {
- unsigned char status;
- InitializeSystem( );
- ckcsh();
- PcdReset();
- PcdAntennaOff(); //關(guān)閉天線
- PcdAntennaOn(); //開啟天線
- while ( 1 )
- {
- key();//按鍵檢測
- status = PcdRequest(PICC_REQALL, g_ucTempbuf); //尋卡
- if(status!=MI_OK)//沒卡
- {
- ID_DATA[0]=0x00;
- ID_DATA[1]=0x00;
- ID_DATA[2]=0x00;
- ID_DATA[3]=0x00;
- profalg=0;
- b=0;
- }
- if (status == MI_OK)//有卡
- {
- if(profalg==0)
- {
- pro();
- profalg=1;
- }
- TYPE_DATA[0]=g_ucTempbuf[0];
- TYPE_DATA[1]=g_ucTempbuf[1];
- status = PcdAnticoll(g_ucTempbuf); //防沖撞 ,返回卡片ID號 4字節(jié)
- if (status == MI_OK)
- {
- status = PcdSelect(g_ucTempbuf); //選定卡片 ,輸入卡片ID號
- if (status == MI_OK)
- {
- ID_DATA[0]=g_ucTempbuf[0];
- ID_DATA[1]=g_ucTempbuf[1];
- ID_DATA[2]=g_ucTempbuf[2];
- ID_DATA[3]=g_ucTempbuf[3];
- writek();//寫卡
- readk();//讀卡
-
- }
- }
- }
- LCD12864();//顯示處理包括開門處理
- //SendStr();
- PcdHalt();//命令卡片進入休眠狀態(tài),因為尋卡命令是尋找所有的卡包括休眠的卡,這條命令可以去掉
- }
- }
- void InitializeSystem()//輸入輸出口初始化
- {
- P0 = 0xFF;
- P1 = 0xFF;
- P2 = 0xFF;
- P3 = 0xFF;
- }
- void Delay(unsigned int time)//延時函數(shù)
- {
- unsigned int i,k ;
- for(i=0;i<255;i++)
- for(k=0;k<time;k++)
- _nop_();
- }
- void ckcsh() //初始化函數(shù),初始化LCD
- {
- fmq=1;
- lcd_init();
- Delay(1);
- }
- void LCD12864()
- {
- unsigned char i;
- lcd_pos(1,0); //設(shè)置顯示位置為第1行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS1[i]);
- }
- lcd_pos(2,0); //設(shè)置顯示位置為第2行
- for(i=0;i<4;i++)
- {
- lcd_wdat(DIS2[i]);
- }
- lcd_wdat(DIS6[ID_DATA[0]/16]); // ID
- lcd_wdat(DIS6[ID_DATA[0]%16]); //
- lcd_wdat(DIS6[ID_DATA[1]/16]); //
- lcd_wdat(DIS6[ID_DATA[1]%16]); //
- lcd_wdat(DIS6[ID_DATA[2]/16]); //
- lcd_wdat(DIS6[ID_DATA[2]%16]); //
- lcd_wdat(DIS6[ID_DATA[3]/16]); //
- lcd_wdat(DIS6[ID_DATA[3]%16]); //
- lcd_pos(3,0); //設(shè)置顯示位置為第3行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS3[i]);
- }
- lcd_pos(4,0); //設(shè)置顯示位置為第4行
- if(b==0xaa) //請入庫
- {
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS7[i]);
- }
- LED3=0;
- LED4=0; //模擬繼電器開
- kaimengtime=100;
- fengmingqi();
- }
- if(kaimengtime==0) //當(dāng)開門時間到的話 關(guān)掉繼電器
- {
- LED3=1;
- LED4=1; //模擬繼電器關(guān)
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS4[i]);
- }
- }
- }
- bit lcd_busy() //檢查LCD忙狀態(tài) , lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- void lcd_wcmd(unsigned char cmd) //寫指令數(shù)據(jù)到LCD , RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = cmd;
- _nop_();
- _nop_();
- LCD_EN = 1;
- LCD_EN = 0;
- }
- void lcd_wdat(unsigned char dat) //寫顯示數(shù)據(jù)到LCD ,RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- LCD_EN = 1;
- LCD_EN = 0;
- }
- void lcd_init()// LCD初始化設(shè)定
- {
- LCD_PSB =1;
- //LCD_RST = 0; //液晶復(fù)位
- Delay(3);
- LCD_RST = 1;
- Delay(3);
- lcd_wcmd(0x34); //擴充指令操作
- Delay(5);
- lcd_wcmd(0x30); //基本指令操作
- Delay(5);
- lcd_wcmd(0x0C); //顯示開,關(guān)光標(biāo)
- Delay(5);
- lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
- Delay(5);
- }
- void lcd_pos(unsigned char X,unsigned char Y)//設(shè)定顯示位置
- {
- unsigned char pos;
- if (X==1)
- {X=0x80;}
- else if (X==2)
- {X=0x90;}
- else if (X==3)
- {X=0x88;}
- else if (X==4)
- {X=0x98;}
- pos = X+Y ;
- lcd_wcmd(pos); //顯示地址
- }
- void clr_screen()// 清屏函數(shù)
- {
- lcd_wcmd(0x34);//擴充指令操作
- lcd_wcmd(0x30);//基本指令操作
- lcd_wcmd(0x01);//清屏
- }
- void pro()//蜂鳴器啟動函數(shù)
- {
- //fmq=0;
- TMOD=0x11;//設(shè)置定時器0為工作方式1
- TH0=(65536-50000)/256;//給定時器裝初值 高八位
- TL0=(65536-50000)%256;//給定時器裝初值 低八位
- EA=1; //開總中斷
- ET0=1; //
- TR0=1; //
- }
- void delay10ms(void) //延時程序
- {
- unsigned char i,j;
- for(i=20;i>0;i--)
- for(j=248;j>0;j--);
- }
- void key()//16鍵 按鍵掃描檢測
- {
- if(keya==0) //按鍵值更新與否
- {
-
- delay10ms();
- while(keya==0);
- mode=3;
- pro();
- }
- if(keyb==0) //按鍵值更新與否
- {
-
- delay10ms();
- while (keyb==0);
- mode=2;
- pro();
- }
-
- }
- void time0() interrupt 1// 中斷服務(wù)子程序,蜂鳴器聲音進入3次,開門時間-1
- {
- TH0=(65536-50000)/256;//給定時器裝初值 高八位
- TL0=(65536-50000)%256;//給定時器裝初值 低八位
- tt++;
- if(tt==3)
- {
- tt=0;
- fmq=1;
- }
- if(kaimengtime>0)
- {
- kaimengtime--;
- }
- }
- void readk()//讀卡,b的值及為標(biāo)志
- {
- unsigned char status;
- status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
- if (status == MI_OK) //驗證密碼
- {
- status = PcdRead(1, g_ucTempbuf);//讀塊地址“1”的數(shù)據(jù),返回值存在 g_ucTempbuf
- if (status == MI_OK)
- {
- value_DATA[0]=g_ucTempbuf[0];
- value_DATA[1]=g_ucTempbuf[1];
- value_DATA[2]=g_ucTempbuf[2];
- value_DATA[3]=g_ucTempbuf[3];
- b=value_DATA[3];
- //printf("%s",b);
- }
- }
- }
- void writek()//給門禁卡寫入值,00或者aa AA可以開門 00的不可以入庫
- {
- unsigned char status;
- if( mode==3)//寫入0xaa充值
- {
- mode=0;
- status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
- if (status == MI_OK) //驗證密碼
- {
- status = PcdWrite(1, data1);//寫入庫碼
- if (status == MI_OK)
- {
- pro();
- }
- }
- }
- if(mode==2) //寫入0x00
- {
- mode=0;
- status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
- if (status == MI_OK) //驗證密碼
- {
- status = PcdWrite(1, data2);//寫入庫碼
- if (status == MI_OK)
- {
- pro();
- }
- }
- }
- }
復(fù)制代碼
|
|