本人小白一枚,才接触单片机,有点单片机基础,这段时间在做个仓库管理系统,用的STC89C52RC芯片加上RFID,第一次刷卡是入库,第二次刷卡则是出库,但是我不太懂怎么实现,C语言看的懂,就是不知道怎么写,求大神帮帮忙,只要能在串口调试助手上能显示卡号就行了!
谢谢大佬了!单片机代码如下:
- #include "reg52.h"
- #include "main.h"
- #include "mfrc522.h"
- #include<intrins.h> //函数处理头文件
- #include<string.h> //字符串处理头文件
- #include<stdio.h> // 输入输出函数头文件
- unsigned char code data1[16] = {0x00,0x00,0x00,0xAA,0xFF,0xFF,0xFF,0x55,0x00,0x00,0x00,0xAA,0x01,0xFE,0x01,0xFE};//
- //M1卡的某一块写为如下格式,则该块为门禁,不同的门修改门码即可
- //4字节门码(低字节在前)+4字节门码取反+4字节门码+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
- //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字节门码(低字节在前)+4字节门码取反+4字节门码+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
- 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[] = {" 仓库管理系统 "};
- 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(); //关闭天线
- 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字节
- 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();//命令卡片进入休眠状态,因为寻卡命令是寻找所有的卡包括休眠的卡,这条命令可以去掉
- }
- }
- void InitializeSystem()//输入输出口初始化
- {
- P0 = 0xFF;
- P1 = 0xFF;
- P2 = 0xFF;
- P3 = 0xFF;
- }
- void Delay(unsigned int time)//延时函数
- {
- unsigned int i,k ;
- for(i=0;i<255;i++)
- for(k=0;k<time;k++)
- _nop_();
- }
- void ckcsh() //初始化函数,初始化LCD
- {
- fmq=1;
- lcd_init();
- Delay(1);
- }
- void LCD12864()
- {
- unsigned char i;
- lcd_pos(1,0); //设置显示位置为第1行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS1[i]);
- }
- lcd_pos(2,0); //设置显示位置为第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); //设置显示位置为第3行
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS3[i]);
- }
- lcd_pos(4,0); //设置显示位置为第4行
- if(b==0xaa) //请入库
- {
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS7[i]);
- }
- LED3=0;
- LED4=0; //模拟继电器开
- kaimengtime=100;
- fengmingqi();
- }
- if(kaimengtime==0) //当开门时间到的话 关掉继电器
- {
- LED3=1;
- LED4=1; //模拟继电器关
- for(i=0;i<16;i++)
- {
- lcd_wdat(DIS4[i]);
- }
- }
- }
- bit lcd_busy() //检查LCD忙状态 , lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
- {
- 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) //写指令数据到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) //写显示数据到LCD ,RS=H,RW=L,E=高脉冲,D0-D7=数据。
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- LCD_EN = 1;
- LCD_EN = 0;
- }
- void lcd_init()// LCD初始化设定
- {
- LCD_PSB =1;
- //LCD_RST = 0; //液晶复位
- Delay(3);
- LCD_RST = 1;
- Delay(3);
- lcd_wcmd(0x34); //扩充指令操作
- Delay(5);
- lcd_wcmd(0x30); //基本指令操作
- Delay(5);
- lcd_wcmd(0x0C); //显示开,关光标
- Delay(5);
- lcd_wcmd(0x01); //清除LCD的显示内容
- Delay(5);
- }
- void lcd_pos(unsigned char X,unsigned char Y)//设定显示位置
- {
- 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()// 清屏函数
- {
- lcd_wcmd(0x34);//扩充指令操作
- lcd_wcmd(0x30);//基本指令操作
- lcd_wcmd(0x01);//清屏
- }
- void pro()//蜂鸣器启动函数
- {
- //fmq=0;
- TMOD=0x11;//设置定时器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// 中断服务子程序,蜂鸣器声音进入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的值及为标志
- {
- 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”的数据,返回值存在 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();
- }
- }
- }
- }
复制代码
|