找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1636|回复: 1
打印 上一主题 下一主题
收起左侧

单片机仓库管理下位机 C语言程序看的懂,就是不知道怎么写

[复制链接]
跳转到指定楼层
楼主
ID:210728 发表于 2018-10-23 18:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人小白一枚,才接触单片机,有点单片机基础,这段时间在做个仓库管理系统,用的STC89C52RC芯片加上RFID,第一次刷卡是入库,第二次刷卡则是出库,但是我不太懂怎么实现,C语言看的懂,就是不知道怎么写,求大神帮帮忙,只要能在串口调试助手上能显示卡号就行了!
谢谢大佬了!单片机代码如下:
  1. #include "reg52.h"
  2. #include "main.h"
  3. #include "mfrc522.h"
  4. #include<intrins.h>         //函数处理头文件        
  5. #include<string.h>          //字符串处理头文件  
  6. #include<stdio.h>           // 输入输出函数头文件

  7. unsigned char code data1[16] = {0x00,0x00,0x00,0xAA,0xFF,0xFF,0xFF,0x55,0x00,0x00,0x00,0xAA,0x01,0xFE,0x01,0xFE};//
  8. //M1卡的某一块写为如下格式,则该块为门禁,不同的门修改门码即可
  9. //4字节门码(低字节在前)+4字节门码取反+4字节门码+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
  10. //unsigned char code data2[16] = {0x00,0x00,0x00,0x55,0xFF,0xFF,0xFF,0xAA,0x00,0x00,0x00,0x55,0x01,0xFE,0x01,0xFE};//
  11. unsigned char code data2[16] = {0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xff,0x00,0x00,0x00,0x00,0x01,0xFE,0x01,0xFE};
  12. //M1卡的某一块写为如下格式,则该块为门禁,不同的门修改门码即可
  13. //4字节门码(低字节在前)+4字节门码取反+4字节门码+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
  14. unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //密码
  15. unsigned char TYPE_DATA[2];//类型
  16. unsigned char ID_DATA[4];  //ID地址
  17. unsigned char value_DATA[4];//卡里面的值                                                                                                                                 
  18. unsigned char g_ucTempbuf[20];//

  19. unsigned char code  DIS1[] = {"  仓库管理系统  "};
  20. unsigned char code  DIS2[] = {"货物ID:"};
  21. unsigned char code  DIS3[] = {"雪花物流欢迎您"};
  22. unsigned char code  DIS4[] = {"请扫描货物!    "};
  23. unsigned char code  DIS6[] = {"0123456789ABCDEF"};
  24. unsigned char code  DIS7[]=  {"请入库!          "};
  25. unsigned char tt=0,key_data,key_olddata,mode,profalg,kaimengtime;  
  26. unsigned int  a,b;      
  27. void delay1(unsigned int z)
  28. {
  29.         unsigned int x,y;
  30.         for(x=z;x>0;x--)
  31.         for(y=110;y>0;y--);        
  32. }  
  33. void fengmingqi()
  34. {
  35.         fmq = 0;
  36.                 delay1(100);
  37.                 fmq = 1;
  38.                 delay1(100);
  39.                 fmq = 0;
  40.                 delay1(200);
  41.                 fmq = 1;                        
  42.                 delay1(600);               

  43. }            
  44. void main( )
  45. {   
  46.      unsigned char status;
  47.      InitializeSystem( );
  48.          ckcsh();
  49.      PcdReset();
  50.      PcdAntennaOff(); //关闭天线
  51.      PcdAntennaOn();  //开启天线
  52.      while ( 1 )
  53.      {                           
  54.                key();//按键检测
  55.          status = PcdRequest(PICC_REQALL, g_ucTempbuf); //寻卡
  56.                  if(status!=MI_OK)//没卡
  57.                  {
  58.                          ID_DATA[0]=0x00;
  59.                         ID_DATA[1]=0x00;
  60.                         ID_DATA[2]=0x00;
  61.                         ID_DATA[3]=0x00;
  62.                         profalg=0;
  63.                         b=0;

  64.                  }
  65.          if (status == MI_OK)//有卡
  66.          {                                   
  67.                          if(profalg==0)
  68.                                  {  
  69.                                  pro();
  70.                                  profalg=1;
  71.                                  }
  72.                                  TYPE_DATA[0]=g_ucTempbuf[0];
  73.                                  TYPE_DATA[1]=g_ucTempbuf[1];
  74.                                  status = PcdAnticoll(g_ucTempbuf);       //防冲撞 ,返回卡片ID号 4字节
  75.                          if (status == MI_OK)
  76.                          {
  77.                                                  status = PcdSelect(g_ucTempbuf);    //选定卡片  ,输入卡片ID号
  78.                                          if (status == MI_OK)
  79.                                          {
  80.                                                         ID_DATA[0]=g_ucTempbuf[0];
  81.                                                         ID_DATA[1]=g_ucTempbuf[1];
  82.                                                         ID_DATA[2]=g_ucTempbuf[2];
  83.                                                         ID_DATA[3]=g_ucTempbuf[3];
  84.                                                         writek();//写卡
  85.                                                         readk();//读卡
  86.                                                         
  87.                                          }           
  88.                          }
  89.                  }               
  90.                                  LCD12864();//显示处理包括开门处理        
  91.                                  //SendStr();
  92.                                  PcdHalt();//命令卡片进入休眠状态,因为寻卡命令是寻找所有的卡包括休眠的卡,这条命令可以去掉        
  93.          }      
  94. }
  95. void InitializeSystem()//输入输出口初始化
  96. {     
  97.      P0 = 0xFF;
  98.          P1 = 0xFF;
  99.          P2 = 0xFF;
  100.          P3 = 0xFF;

  101. }
  102. void Delay(unsigned int time)//延时函数
  103. {
  104.   unsigned int i,k  ;
  105.   for(i=0;i<255;i++)
  106.     for(k=0;k<time;k++)
  107.       _nop_();         
  108. }

  109. void ckcsh()       //初始化函数,初始化LCD
  110. {
  111.         fmq=1;
  112.         lcd_init();                                       
  113.         Delay(1);
  114. }

  115. void LCD12864()
  116. {
  117.         unsigned char i;
  118.         lcd_pos(1,0);              //设置显示位置为第1行
  119.         for(i=0;i<16;i++)
  120.         {
  121.                 lcd_wdat(DIS1[i]);
  122.          }
  123.         lcd_pos(2,0);             //设置显示位置为第2行
  124.         for(i=0;i<4;i++)
  125.         {
  126.                 lcd_wdat(DIS2[i]);
  127.         }
  128.         lcd_wdat(DIS6[ID_DATA[0]/16]);        // ID
  129.         lcd_wdat(DIS6[ID_DATA[0]%16]);        //
  130.         lcd_wdat(DIS6[ID_DATA[1]/16]);        //
  131.         lcd_wdat(DIS6[ID_DATA[1]%16]);        //
  132.         lcd_wdat(DIS6[ID_DATA[2]/16]);        //
  133.         lcd_wdat(DIS6[ID_DATA[2]%16]);        //
  134.         lcd_wdat(DIS6[ID_DATA[3]/16]);        //
  135.         lcd_wdat(DIS6[ID_DATA[3]%16]);        //
  136.         lcd_pos(3,0);             //设置显示位置为第3行
  137.         for(i=0;i<16;i++)
  138.         {
  139.                 lcd_wdat(DIS3[i]);
  140.         }
  141.         lcd_pos(4,0);             //设置显示位置为第4行
  142.         if(b==0xaa)        //请入库
  143.         {
  144.                 for(i=0;i<16;i++)
  145.                 {
  146.                 lcd_wdat(DIS7[i]);
  147.                 }
  148.                 LED3=0;
  149.                 LED4=0; //模拟继电器开
  150.             kaimengtime=100;
  151.         fengmingqi();
  152.         }
  153.         if(kaimengtime==0) //当开门时间到的话 关掉继电器
  154.         {
  155.         LED3=1;
  156.             LED4=1; //模拟继电器关
  157.                  for(i=0;i<16;i++)
  158.                 {
  159.                 lcd_wdat(DIS4[i]);
  160.                 }
  161.         }

  162. }
  163. bit lcd_busy() //检查LCD忙状态 , lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
  164. {                          
  165.     bit result;
  166.     LCD_RS = 0;
  167.     LCD_RW = 1;
  168.     LCD_EN = 1;
  169.     result = (bit)(P0&0x80);
  170.     LCD_EN = 0;
  171.     return(result);
  172. }
  173. void lcd_wcmd(unsigned char cmd) //写指令数据到LCD , RS=L,RW=L,E=高脉冲,D0-D7=指令码。
  174. {                          
  175.     while(lcd_busy());
  176.     LCD_RS = 0;
  177.     LCD_RW = 0;
  178.     LCD_EN = 0;
  179.     P0 = cmd;
  180.     _nop_();
  181.     _nop_();     
  182.     LCD_EN = 1;
  183.     LCD_EN = 0;
  184. }
  185. void lcd_wdat(unsigned char dat) //写显示数据到LCD ,RS=H,RW=L,E=高脉冲,D0-D7=数据。
  186. {                          
  187.     while(lcd_busy());
  188.     LCD_RS = 1;
  189.     LCD_RW = 0;
  190.     LCD_EN = 0;
  191.         P0 = dat;   
  192.     LCD_EN = 1;
  193.     LCD_EN = 0;
  194. }
  195. void lcd_init()// LCD初始化设定
  196. {
  197.     LCD_PSB =1;
  198.     //LCD_RST = 0;                 //液晶复位
  199.     Delay(3);                  
  200.     LCD_RST = 1;      
  201.     Delay(3);
  202.     lcd_wcmd(0x34);      //扩充指令操作
  203.     Delay(5);
  204.     lcd_wcmd(0x30);      //基本指令操作
  205.     Delay(5);
  206.     lcd_wcmd(0x0C);      //显示开,关光标
  207.     Delay(5);
  208.     lcd_wcmd(0x01);      //清除LCD的显示内容
  209.     Delay(5);
  210. }
  211. void lcd_pos(unsigned char X,unsigned char Y)//设定显示位置
  212. {                          
  213.    unsigned char  pos;
  214.    if (X==1)
  215.      {X=0x80;}
  216.    else if (X==2)
  217.      {X=0x90;}
  218.    else if (X==3)
  219.      {X=0x88;}
  220.    else if (X==4)
  221.      {X=0x98;}
  222.    pos = X+Y ;
  223.    lcd_wcmd(pos); //显示地址
  224. }
  225. void  clr_screen()// 清屏函数   
  226. {
  227.    lcd_wcmd(0x34);//扩充指令操作
  228.    lcd_wcmd(0x30);//基本指令操作
  229.    lcd_wcmd(0x01);//清屏   
  230. }
  231. void pro()//蜂鸣器启动函数
  232. {
  233. //fmq=0;
  234. TMOD=0x11;//设置定时器0为工作方式1
  235. TH0=(65536-50000)/256;//给定时器装初值 高八位
  236. TL0=(65536-50000)%256;//给定时器装初值 低八位
  237. EA=1;   //开总中断
  238. ET0=1;  //
  239. TR0=1;  //
  240. }
  241. void delay10ms(void) //延时程序

  242. {

  243.       unsigned char i,j;

  244.       for(i=20;i>0;i--)

  245.       for(j=248;j>0;j--);

  246. }
  247. void key()//16键 按键扫描检测
  248. {
  249.         if(keya==0)        //按键值更新与否
  250.         {
  251.                
  252.          delay10ms();
  253.          while(keya==0);
  254.                  mode=3;
  255.          pro();
  256.         }
  257.             if(keyb==0)        //按键值更新与否
  258.         {
  259.                
  260.         delay10ms();
  261.          while (keyb==0);
  262.              mode=2;
  263.          pro();
  264.         }                  
  265.         
  266. }
  267. void time0() interrupt 1// 中断服务子程序,蜂鸣器声音进入3次,开门时间-1
  268. {

  269. TH0=(65536-50000)/256;//给定时器装初值 高八位
  270. TL0=(65536-50000)%256;//给定时器装初值 低八位
  271. tt++;
  272. if(tt==3)
  273.         {        
  274.         tt=0;
  275.                 fmq=1;
  276.         }
  277. if(kaimengtime>0)
  278.         {        
  279.      kaimengtime--;  
  280.         }        
  281. }
  282. void readk()//读卡,b的值及为标志
  283. {        
  284. unsigned char status;
  285. status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 验证密码模式60A密码 61B密码,“1”块地址,DefaultKey初始密码,g_ucTempbuf ID号
  286.          if (status == MI_OK) //验证密码
  287.          {                                                                                                                                                                                                                                                                                                                                                                                          
  288.         status = PcdRead(1, g_ucTempbuf);//读块地址“1”的数据,返回值存在        g_ucTempbuf
  289.                 if (status == MI_OK)
  290.                           {
  291.                                 value_DATA[0]=g_ucTempbuf[0];
  292.                                 value_DATA[1]=g_ucTempbuf[1];
  293.                                 value_DATA[2]=g_ucTempbuf[2];
  294.                                 value_DATA[3]=g_ucTempbuf[3];        
  295.                                 b=value_DATA[3];
  296.                                 //printf("%s",b);                                                                                                                                                            
  297.                           }   
  298.      }
  299. }        
  300. void writek()//给门禁卡写入值,00或者aa AA可以开门 00的不可以入库
  301. {
  302.     unsigned char status;
  303.       if( mode==3)//写入0xaa充值
  304.                 {        
  305.                         mode=0;
  306.                     status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 验证密码模式60A密码 61B密码,“1”块地址,DefaultKey初始密码,g_ucTempbuf ID号
  307.                         if (status == MI_OK) //验证密码
  308.                           {                                                                                                                                                                                                                                                                                                                                          
  309.                                   status = PcdWrite(1, data1);//写入库码
  310.                                   if (status == MI_OK)
  311.                                         {
  312.                                         pro();
  313.                                     }
  314.                           }
  315.                 }
  316.                 if(mode==2) //写入0x00                  
  317.                 {
  318.                         mode=0;
  319.                 status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 验证密码模式60A密码 61B密码,“1”块地址,DefaultKey初始密码,g_ucTempbuf ID号
  320.                     if (status == MI_OK) //验证密码
  321.                     {                                                                                                                                                                                                                                                                                                                                          
  322.                                   status = PcdWrite(1, data2);//写入库码
  323.                                   if (status == MI_OK)
  324.                                          {
  325.                                                   pro();
  326.                                          }
  327.                     }
  328.                 }
  329. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:897941 发表于 2021-3-29 10:45 | 只看该作者
你这个弄明白了没
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表