标题:
单片机仓库管理下位机 C语言程序看的懂,就是不知道怎么写
[打印本页]
作者:
q1106499240
时间:
2018-10-23 18:07
标题:
单片机仓库管理下位机 C语言程序看的懂,就是不知道怎么写
本人小白一枚,才接触单片机,有点单片机基础,这段时间在做个仓库管理系统,用的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();
}
}
}
}
复制代码
作者:
jsh7758521
时间:
2021-3-29 10:45
你这个弄明白了没
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1