找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机mfrc522多功能门禁卡电子密码锁原理图+源码资料

  [复制链接]
跳转到指定楼层
楼主
电路原理图:


pcb布线:


使用说明
一、实现功能:5张卡
1、用户密码以及IC卡号和IC卡刷入序列号,保存到STC12C5A60S2的EEPROM中,掉电数据保存功能。
2、支持非接触式IC卡授权功能,可连续授权(授权需输入管理员密码)。
3、支持手动选卡销卡,支持单卡刷入销卡,支持注销所有卡(注销所有卡需输入管理员密码)
4、自动识别非接触式IC卡功能。如刷授权过的IC卡,提示“欢迎光临”,显示卡号并且开门,5秒后自动关门。如果刷未授权的IC卡,提示“该卡未授权”,显示卡号不开门。
5、如忘记携带IC卡,可通过键盘手动输入用户密码。密码输入错误显示器会出现错误提示且继电器不工作(不开门);若密码输入正确则继电器工作(开门)。
6、支持手动更改用户密码(更改用户密码需输入管理员密码)
7、支持无卡时钟显示功能(功能:显示年月日时分秒周,阴历,天干地支,生肖,温度,可改时间,具有掉电走时功能)
二、按键定义
如图示:采用4X4键盘输入,键盘对应名称如下:
1  2  3  A
4  5  6  B
7  8  9  C
*  0  #  D
其中,    【0—9】为数字键,用于输入相应的密码,
          【*】号键为清除所有卡
          【A】键为返回功能
                          |->长按A键2秒可调时间,此时按下1键为选择修改项,按下2键为加,按下3键为减,再次长按A键退出时间修改。
          【B】键为授权IC卡功能->提示输入管理员密码->输入管理员密码->刷入IC卡号->提示授权成功->是否继续授权->按A键返回
          【C】键为注销IC卡功能->提示刷入IC卡号->提示注销成功->按A键返回
                              |->或按下#键 手动选择卡注销->按D键确认并退出
          【D】键为确认功能
          【#】号键为手动输入密码功能->提示输入密码->输入密码
                                    |->改密码->提示输入管理员密码->输入管理员密码->改用户密码->输入用户密码->确认并再次输入->修改成功
提示:所有的输密码和改密码功能,输入三次错误后则退出输入或修改功能,输入或修改失败。



单片机源程序如下:
  1. /*********************************
  2. 按键分布
  3. 1  2  3  A
  4. 4  5  6  B
  5. 7  8  9  C
  6. *  0  #  D
  7. 其中,    【0—9】为数字键,用于输入相应的密码,
  8.           【*】号键为清除所有卡
  9.           【A】键为返回功能
  10.           【B】键为授权IC卡功能
  11.           【C】键为注销IC卡功能
  12.           【D】键为确认功能
  13.           【#】号键为手动输入密码功能
  14. 时钟功能调时说明:长按A键2秒可调时间,此时按下1键为选择修改项,按下2键为加,按下3键为减,再次长按A键退出时间修改
  15. ********************************************************************************************************/
  16. #include <stc12c5a60s2.h>
  17. #include <stdio.h>
  18. #include "spi.h"  
  19. #include "12864.h"  
  20. #include "eeprom.h"
  21. #include "mfrc522.h"  
  22. #include "uart.h"
  23. #include "KEYBOARD.h"
  24. #include "clock.h"
  25. #include "ds1302.h"

  26. #define IAP_ADDRESS1 0x0100        //用户密码起始地址
  27. #define IAP_ADDRESS  0x0200        //IC卡序列号起始地址

  28. uchar code administer_key[]={0,0,0,};//管理员卡密码
  29. static uchar xdata IC_EEPROM[5][5];//存入EEPROM密码 每行前4位为卡号 第5位为卡片输入顺序号
  30. static uchar xdata User_len; //用户密码长度
  31. static uchar xdata Userpassword[16];//用户密码
  32. static uchar xdata ICCODE[4];//返回卡号4位
  33. static uchar xdata Rec_Buffer[REC_BUFFER_SIZE];//串口接收缓冲区
  34. static uchar xdata RELAY_NUM=0;//开门计时变量
  35. static uchar xdata IC_NUM=0;//刷入卡的顺序
  36. static uchar Recvd_Count;//串口已接收数据的个数
  37. bit  lock_ok=0;//密码匹配标记
  38. bit  shouquan_flag=0;//授权标记
  39. bit  shoudongshuru_flag=0; //手动输入密码标记
  40. bit  IC_flag=0; //寻卡标记
  41. //bit  shanshuo;//较表时闪烁用                                                                                                                                                       
  42. void io_init()                                                                                                                                 
  43. {
  44. //P0M1=0XFF;//开漏模式
  45. //P0M0=0XFF;
  46. P1M1=0XFF;//P1.7-P1.3开漏模式用于RC522;
  47. P1M0=0XFF;
  48. P2M1=0X00;//P2.7,P2.0推挽输出模式
  49. P2M0=0X81;
  50. //P3M1=0X00;
  51. //P3M0=0XFF;
  52. P4SW=0x70;
  53. P4M1=0X00;//推挽模式
  54. P4M0=0XFF;
  55. }
  56. /****************************************************
  57. 函数名称:bit Auto_Reader(void)
  58. 入口参数:无
  59. 出口参数:有卡返回0,无卡返回1
  60. 功能:寻卡
  61.        寻卡并在液晶屏上显示序列号
  62. ****************************************************/
  63. bit Auto_Reader(void)
  64. {
  65. uchar temp[4];
  66. // uchar g_ucTempbuf1[16];
  67. // uchar code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //初始密码
  68. uchar i;
  69. uchar ID_ASC[8];                                                  
  70. if (MI_OK==PcdRequest(PICC_REQALL,temp))//寻卡,输出为卡类型//*PICC_REQALL=0x52:寻天线区内所有符合14443A标准的卡  PICC_REQIDL=0x26:只寻未进入休眠状态的卡                     
  71. {
  72.         if (MI_OK==PcdAnticoll(temp))//防冲撞处理,输出卡片序列号,4字节
  73.         if (MI_OK==PcdSelect(temp)) //选择卡片,输入卡片序列号,4字节
  74.    //if (MI_OK==PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, temp)) //验证密码 输出卡片序列号
  75.         //if(MI_OK==PcdRead(0, g_ucTempbuf1))//卡中第一块数据内容
  76.         {
  77.             IC_flag=1;
  78.                 lcd_clear();
  79.         display_GB2312_string(3,1,"IC序列号:");
  80.                 for(i=0;i<4;i++) //卡ID号转化成ASCII
  81.                 { ICCODE[i]=temp[i];
  82.                   if(temp[i]/16>9)        ID_ASC[i*2]=temp[i]/16+'7';
  83.                     else ID_ASC[i*2]=temp[i]/16+'0';       
  84.               if(temp[i]%16>9)        ID_ASC[i*2+1]=temp[i]%16+'7';
  85.                     else ID_ASC[i*2+1]=temp[i]%16+'0';
  86.                 }
  87.                 display_GB2312_string(5,1,ID_ASC);                          
  88.         }
  89.    return 0;
  90. }
  91. else
  92. {
  93.   BELL=0;return 1;
  94. }
  95. }
  96. /****************************************************
  97. 函数名称:bit administer(void)  
  98. 入口参数:无
  99. 出口参数:密码正确返回0,错误返回1
  100.            全局变量shouquan_flag :允许授权shouquan_flag=0;   不允许授权shouquan_flag=1;
  101. 功能:管理员
  102.        验证系统密码 用于授权管理、注销全部卡管理、修改用户密码,三次输入错误返回
  103. 调用函数:EEPROM.C   12864.c  KeyPro();  bit Auto_Reader(void);
  104. ****************************************************/
  105. bit administer(void)
  106. {
  107. uchar asterisk='*';
  108. uchar spacing =' ';
  109.     uchar temp=0,error=0,j=0,num=0,i=0,k=0;//
  110.         bit Flag; //比较位置
  111.         unsigned char passwordlength,PLEN;     //输入密码长度,实际密码长度
  112.         unsigned char passwordtemp[16];        //最大输入16个
  113.         PLEN=sizeof(administer_key)/sizeof(administer_key[0]);//用于计算出实际密码长度
  114.         display_GB2312_string(1,1,"请输入管理员密码");
  115.     while(shouquan_flag==1)
  116.         {
  117.            temp=KeyPro();
  118.            if(temp!=0xff)
  119.            {
  120.                         if(i==0)    //输入是第一个字符的时候需要把改行清空,方便观看密码
  121.                           display_GB2312_string(3,1,"                ");//清除该行
  122.                         if((i<16)&&(temp<=9))
  123.                           {
  124.                        passwordtemp[i]=temp;
  125.                        display_GB2312_string(3,i*8+1,&asterisk);//输入的密码用"*"代替
  126.                            i++;   //输入数值累加
  127.                           }       
  128.                         if('*'==temp&&i>0)
  129.                           {
  130.                            i--;
  131.                            for(k=i;k<16;k++)
  132.                        display_GB2312_string(3,k*8,&spacing);//输入用空格代替                          
  133.                           }       
  134.                         if('A'==temp)//退出
  135.                         {
  136.                           display_GB2312_string(3,1,"                ");//清除该行
  137.                           shouquan_flag=1;
  138.                           return 0;
  139.                         }               
  140.                         if(('D'==temp)|| (i==16))//输入按键值D或者密码输入到最大值16,表示输入结束,需要进行比对
  141.                          {
  142.                         passwordlength=i;  //计算输入密码长度
  143.                             i=0;  //计数器复位
  144.                             if(passwordlength==PLEN)//长度相等则比较,否则直接输出错误
  145.                             {
  146.                              Flag=1;//先把比较位置1
  147.                                  
  148.                              for(j=0;j<PLEN;j++)//循环比较8个数值,如果有一个不等 则最终Flag值为0
  149.                                 Flag=Flag&&(passwordtemp[j]==administer_key[j]);//比较输入值和已有密码
  150.                          }
  151.                        if(Flag)//如果比较全部相同,标志位置1
  152.                            {
  153.                                 pass();
  154.                                 lcd_clear();
  155.                         error=0;//输入正确则次数清零,重新计数
  156.                         Flag=0;      //清除正确标志
  157.                                 shouquan_flag=0;
  158.                                 return 0;
  159.                                 }
  160.                            else
  161.                             {
  162.                                  display_GB2312_string(3,1,"                ");//清除该行
  163.                                  display_GB2312_string(3,1,"Wrong! Retry!");//密码错误,提示重新输入
  164.                                  error++;//连续输入错误,则次数累加
  165.                                  if(error==3)
  166.                                   {
  167.                                    display_GB2312_string(3,1,"                ");//清除该行
  168.                                    display_GB2312_string(3,1,"Wrong 3 times!");//密码错误,提示重新输入
  169.                                    delayms(1500);
  170.                                    shouquan_flag=1;
  171.                                    return 0;
  172.                                    //while(1);//停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。
  173.                                   }
  174.                                 }               
  175.                          }
  176.                  }
  177.        }               
  178. }                                                                                  
  179. /****************************************************
  180. 函数名称:void shouquan(uchar key)
  181. 入口参数:key->按键值
  182. 出口参数:无
  183. 功能:授权
  184.        按下B键进入授权
  185.        流程->提示输入系统密码->输入系统密码->刷入IC卡号->提示是否继续授权->按A键返回  (授权期间均可按A键返回)
  186. 调用函数:EEPROM.C   12864.c  KeyPro(); bit administer(); bit Auto_Reader(void);
  187. ****************************************************/
  188. void shouquan(uchar key)
  189. {
  190. uchar j=0,k=0,flag,flag1;
  191. if(key=='B')//授权检测
  192. {
  193.    lcd_clear();
  194.    //Sent_Byte(IC_NUM);
  195.    shouquan_flag=1;   
  196.     while(administer());  //管理员返回0,密码正确shouquan_flag=0
  197.          display_GB2312_string(1,1,"请刷入授权IC卡号");//密码正确显示的信息
  198.          if(IC_EEPROM[4][4]==5&&(shouquan_flag==0))//如果最后一位不是0XFF说明有卡刷入
  199.                 {
  200.                  display_GB2312_string(1,1,"IC卡超出5张请按C");
  201.                  display_GB2312_string(3,1,"IC卡超出5张请按*");
  202.                  shouquan_flag=1;
  203.                  delayms(2000);
  204.                 }          
  205.          else if(shouquan_flag==0) //刷卡授权
  206.           {       
  207.             flag1=1;
  208.             while(IC_NUM<5&&flag1==1)
  209.             {
  210.                     flag=1;
  211.                     while(flag) //刷入卡号,正确返回0,退出 并在LCD显示
  212.                         {
  213.                            flag=Auto_Reader();
  214.                            if('A'==KeyPro())//退出
  215.                            {
  216.                                   flag=1;
  217.                                   flag1=0;
  218.                                   break;
  219.                            }
  220.                         }
  221.                         if(flag==0)
  222.                          {
  223.                              //delayms(1000);
  224.                                  IC_NUM++;
  225.                                  for(j=0;j<5;j++)
  226.                                  {
  227.                                   if(j<4)IC_EEPROM[IC_NUM-1][j]=ICCODE[j];//卡号
  228.                                   else   IC_EEPROM[IC_NUM-1][j]=IC_NUM;//刷入的顺序
  229.                                   //Sent_Byte(IC_EEPROM[IC_NUM-1][j]);
  230.                                  }
  231.                                  IapEraseSector(IAP_ADDRESS);//清除数据
  232.                                  for(j=0;j<5;j++)//5行
  233.                                   for(k=0;k<5;k++)//5列
  234.                                   {       
  235.                                    IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//写入数据
  236.                                    //Sent_Byte(IC_EEPROM[j][k]);
  237.                                   }
  238.                                  for(j=0;j<5;j++)//5行
  239.                                   for(k=0;k<5;k++)//5列
  240.                                   {
  241.                                           IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//读出数据
  242.                                         //Sent_Byte(IC_EEPROM[j][k]);
  243.                                   }
  244.                                  pass();
  245.                                  if(IC_NUM<5)
  246.                                  {
  247.                                           delayms(1000);
  248.                                           lcd_clear();
  249.                                           display_GB2312_string(1,1,"IC卡授权成功   ");       
  250.                                           display_GB2312_string(3,1,"是否继续刷入   ");
  251.                                           display_GB2312_string(5,1,"继续请刷卡     ");
  252.                                           display_GB2312_string(7,1,"停止请按’A‘键  ");                                  
  253.                                  }
  254.                                  else
  255.                                  {
  256.                                   delayms(1000);
  257.                                   lcd_clear();
  258.                                   display_GB2312_string(1,1,"IC卡存储到5张  ");
  259.                                   delayms(2000);
  260.                                  }
  261.                          }            
  262.             }          
  263.           }
  264.         }                      
  265. }
  266. /****************************************************
  267. 函数名称:void zhuxiao_all(uchar key)
  268. 入口参数:key->按键值
  269. 出口参数:无
  270. 功能:注销所有IC卡
  271.    按下*键为注销IC卡功能->提示输入系统密码->输入系统密码->确定注销全部卡->注销成功->自动返回  (注销期间均可按A键返回)
  272. 调用函数:EEPROM.C   12864.c  KeyPro(); administer();
  273. ****************************************************/
  274. void zhuxiao_all(uchar key)
  275. {
  276.   uchar j,k;
  277.    if(key=='*')
  278.    {       
  279.     lcd_clear();
  280.     shouquan_flag=1;   
  281.     while(administer());  //管理员返回0,密码正确shouquan_flag=0
  282.         key=0xff;
  283.         while(key!='*'&&shouquan_flag==0)
  284.         {
  285.           if(key=='A') break;
  286.           key=KeyPro();
  287.           display_GB2312_string(1,1,"是否注销所有IC卡");
  288.           display_GB2312_string(3,1,"确定请按'*'号键");
  289.         }
  290.          if(shouquan_flag==0&&key=='*')
  291.          {          lcd_clear();
  292.                           IC_NUM=0;
  293.                           pass();
  294.                           display_GB2312_string(1,1,"注销所有IC卡  ");
  295.                           delayms(1000);
  296.                           IapEraseSector(IAP_ADDRESS);//清除数据
  297.                                  for(j=0;j<5;j++)//5行
  298.                                   for(k=0;k<5;k++)//4列
  299.                                    IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*4+k);//读出数据
  300.                           display_GB2312_string(1,1,"注销成功    ");
  301.                           delayms(1000);
  302.          }                        
  303.    }
  304. }
  305. /****************************************************
  306. 函数名称:void shoudong_zhuxiao_one(uchar key)
  307. 入口参数:key->按键值
  308. 出口参数:无
  309. 功能:手动注销单张IC卡
  310.       按#号键手动销卡
  311.       流程->提示按下对应刷入的卡顺序号->按下1-5按键选择对应卡->提示确认注销按相应按键->按D键确认并返回   (期间按A键不可退出手动销卡模式)
  312. 调用函数:EEPROM.C   12864.c  KeyPro();
  313. ****************************************************/
  314. void shoudong_zhuxiao_one(uchar key)
  315. {
  316.    uchar key2,j,k,v,i;
  317.    uchar ID_ASC[9]={1,1,};
  318.    if(key=='#')
  319.    {
  320.         for(j=0;j<5;j++)//5行
  321.          for(k=0;k<5;k++)//5列
  322.          {
  323.                   IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//读出数据
  324.                 //Sent_Byte(IC_EEPROM[j][k]);
  325.          }
  326.          lcd_clear();
  327.     key2=0xff;
  328.         display_GB2312_string(1,1,"按对应顺序号销卡");       
  329.     while(key2!='D')//确认
  330.         {         
  331.          display_GB2312_string(3,1,"确认并退出请按D");
  332.          key2=KeyPro();
  333.          if(key2==1)     
  334.          {
  335.                 for(i=0;i<4;i++) //卡ID号转化成ASCII
  336.                 {
  337.                   if(IC_EEPROM[0][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[0][i]/16+'7';
  338.                     else ID_ASC[i*2]=IC_EEPROM[0][i]/16+'0';       
  339.               if(IC_EEPROM[0][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[0][i]%16+'7';
  340.                     else ID_ASC[i*2+1]=IC_EEPROM[0][i]%16+'0';
  341.                 }
  342.                 //Sent_Buffer(ID_ASC,8);
  343.                 display_GB2312_string(5,1,ID_ASC);   
  344.                 display_GB2312_string(7,1,"注销按1,返回按A ");
  345.                 key2=0xff;
  346.                 while(key2!=1)
  347.                 {
  348.                  key2=KeyPro();
  349.                  if(key2=='A')break;//退出
  350.                 }
  351.                 pass();
  352.                 if(key2==1)for(j=0;j<5;j++)IC_EEPROM[0][j]=0xff;
  353.          }
  354.          else if(key2==2)
  355.          {
  356.                 for(i=0;i<4;i++) //卡ID号转化成ASCII
  357.                 {
  358.                   if(IC_EEPROM[1][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[1][i]/16+'7';
  359.                     else ID_ASC[i*2]=IC_EEPROM[1][i]/16+'0';       
  360.               if(IC_EEPROM[1][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'7';
  361.                     else ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'0';
  362.                 }
  363.                 //Sent_Buffer(ID_ASC,8);
  364.                 display_GB2312_string(5,1,ID_ASC);  
  365.                 display_GB2312_string(7,1,"注销按2,返回按A ");
  366.                 key2=0xff;
  367.                 while(key2!=2)
  368.                 {
  369.                  key2=KeyPro();
  370.                  if(key2=='A')break;//退出
  371.                 }
  372.                 pass();
  373.                 if(key2==2)for(j=0;j<5;j++)IC_EEPROM[1][j]=0xff;
  374.          }
  375.          else if(key2==3)
  376.          {
  377.                 for(i=0;i<4;i++) //卡ID号转化成ASCII
  378.                 {
  379.                   if(IC_EEPROM[2][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[2][i]/16+'7';
  380.                     else ID_ASC[i*2]=IC_EEPROM[2][i]/16+'0';       
  381.               if(IC_EEPROM[2][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[2][i]%16+'7';
  382.                     else ID_ASC[i*2+1]=IC_EEPROM[2][i]%16+'0';
  383.                 }
  384.                 //Sent_Buffer(ID_ASC,8);
  385.                 display_GB2312_string(5,1,ID_ASC);
  386.                 display_GB2312_string(7,1,"注销按3,返回按A ");
  387.                 key2=0xff;
  388.                 while(key2!=3)
  389.                 {
  390.                  key2=KeyPro();
  391.                  if(key2=='A')break;//退出
  392.                 }
  393.                 pass();
  394.                 if(key2==3)for(j=0;j<5;j++)IC_EEPROM[2][j]=0xff;
  395.          }
  396.          else if(key2==4)
  397.          {
  398.                 for(i=0;i<4;i++) //卡ID号转化成ASCII
  399.                 {
  400.                   if(IC_EEPROM[3][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[3][i]/16+'7';
  401.                     else ID_ASC[i*2]=IC_EEPROM[3][i]/16+'0';       
  402.               if(IC_EEPROM[3][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[3][i]%16+'7';
  403.                     else ID_ASC[i*2+1]=IC_EEPROM[3][i]%16+'0';
  404.                 }
  405.                 //Sent_Buffer(ID_ASC,8);
  406.                 display_GB2312_string(5,1,ID_ASC);
  407.                 display_GB2312_string(7,1,"注销按4,返回按A ");
  408.                 key2=0xff;
  409.                 while(key2!=4)
  410.                 {
  411.                  key2=KeyPro();
  412.                  if(key2=='A')break;//退出
  413.                 }
  414.                 pass();
  415.                 if(key2==4)for(j=0;j<5;j++)IC_EEPROM[3][j]=0xff;
  416.          }
  417.          else if(key2==5)
  418.          {
  419.                 for(i=0;i<4;i++) //卡ID号转化成ASCII
  420.                 {
  421.                   if(IC_EEPROM[4][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[4][i]/16+'7';
  422.                     else ID_ASC[i*2]=IC_EEPROM[4][i]/16+'0';       
  423.               if(IC_EEPROM[4][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[4][i]%16+'7';
  424.                     else ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'0';
  425.                 }
  426.                 //Sent_Buffer(ID_ASC,8);
  427.                 display_GB2312_string(5,1,ID_ASC);
  428.                 display_GB2312_string(7,1,"注销按5,返回按A ");
  429.                 key2=0xff;
  430.                 while(key2!=5)
  431.                 {
  432.                  key2=KeyPro();
  433.                  if(key2=='A')break;//退出
  434.                 }
  435.                 pass();
  436.                 if(key2==5)for(j=0;j<5;j++)IC_EEPROM[4][j]=0xff;
  437.          }
  438.          display_GB2312_string(5,1,"                ");
  439.          display_GB2312_string(7,1,"                ");
  440.         }       
  441.         for(v=0,j=0;j<5;j++)//得到刷入的卡顺序号
  442.          {
  443.                  if(0xff!=IC_EEPROM[j][4])       
  444.                  {
  445.                           for(k=0;k<5;k++)
  446.                           {                                  
  447.                        IC_EEPROM[v][k]=IC_EEPROM[j][k];//重新排列卡号
  448.                            //Sent_Byte(IC_EEPROM[v][k]);  
  449.                           }
  450.                           v++;                                            
  451.                  }                      
  452.          }       
  453.          IC_NUM=v;//Sent_Byte(IC_NUM);
  454.          for(j=0;j<5;j++)
  455.           for(k=0;k<5;k++)
  456.           {
  457.            if(j>=IC_NUM)IC_EEPROM[j][k]=0XFF;
  458.            else         IC_EEPROM[j][4]=j+1;
  459.           }
  460.          IapEraseSector(IAP_ADDRESS);//清除数据
  461.          delayms(10);
  462.          for(j=0;j<5;j++)//5行
  463.           for(k=0;k<5;k++)//5列
  464.           {       
  465.            IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//写入数据
  466.            //Sent_Byte(IC_EEPROM[j][k]);
  467.           }
  468.          delayms(10);
  469.          for(j=0;j<5;j++)//5行
  470.           for(k=0;k<5;k++)//5列
  471.           {
  472.            IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//读出卡数据
  473.            //Sent_Byte(IC_EEPROM[j][k]);
  474.           }       
  475.           pass();
  476.    }
  477. }
  478. /****************************************************
  479. 函数名称:void zhuxiao_one(uchar key)
  480. 入口参数:key->按键值
  481. 出口参数:无
  482. 功能:持卡或手动注销单张IC卡
  483.       按下C键进入持卡或手动注销单张IC卡
  484. 调用函数:EEPROM.C   12864.c  KeyPro();   shoudong_zhuxiao_one();
  485. ****************************************************/
  486. void zhuxiao_one(uchar key)
  487. {
  488. uchar i,j,k,ok,flag,m=0,key1;
  489. if(key=='C')
  490. {          
  491.            // while(administer());  //管理员返回0,密码正确shouquan_flag=0
  492.       lcd_clear();
  493.       display_GB2312_string(1,1,"   刷入注销卡    ");
  494.           display_GB2312_string(3,1,"或按#键手动注销  ");
  495.           flag=1;
  496.           key1=0xff;
  497.           while(flag==1&&key1!='A'&&key1!='#') //刷入卡号,正确返回0,退出 并在LCD显示
  498.           {
  499.            flag=Auto_Reader();
  500.            key1=KeyPro();
  501.            if('A'==key1&&key1=='#')//退出
  502.            {
  503.                   flag=1;
  504.                   break;
  505.            }
  506.           }
  507.           if(key1=='#')
  508.           {
  509.            shoudong_zhuxiao_one(key1);
  510.            key1=0xff;
  511.           }
  512.           if(flag==0)//刷卡标记
  513.           {       
  514.             //IC_flag=0;  
  515.                 for(j=0;j<5;j++)//5行///比较刷入的是哪张卡
  516.                 {
  517.                   ok=1;
  518.               for(k=0;k<4;k++)//4列
  519.                   {         
  520.                     ok=ok&&(IC_EEPROM[j][k]==ICCODE[k]);
  521.                    //Sent_Byte(IC_EEPROM[j][k]);                  
  522.                   }
  523.                   if(ok==1)
  524.                   {
  525.                    ok=0;
  526.                    m=IC_EEPROM[j][4]+0X30;
  527.                    display_GB2312_string(7,1,"注销卡序列号:     ");
  528.                    display_GB2312_string(7,105,&m);
  529.                    pass();
  530.                    delayms(1000);
  531.                    m=IC_EEPROM[j][4];
  532.                    //Sent_Byte(n);
  533.                    break;
  534.                    //goto addr1;
  535.                   }                  
  536.                  }
  537.                 //addr1:
  538.                 if(ok==0) //重新排列对齐数据
  539.                 {
  540.                   ok=1;
  541.                   i=0;
  542.                   //Sent_Byte(n);
  543.                   for(j=0;j<5;j++)//5行
  544.                   for(k=0;k<5;k++)//5列
  545.                   {
  546.                           IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//读出数据
  547.                         //Sent_Byte(IC_EEPROM[j][k]);
  548.                   }
  549.                   if(m==5)//如果是最后一张卡直接替换最后一个数据 前4个不用移位
  550.                           for(j=0;j<5;j++)
  551.                        IC_EEPROM[4][j]=0xff;//最后一个数据补oxff
  552.                   else        //不是最后一个卡   则进行数据移位
  553.                   {
  554.                           for(j=0;j<5;j++)//得到刷入的卡顺序号
  555.                             {
  556.                                  if(m==IC_EEPROM[j][4])i+=1;                     
  557.                                   for(k=0;k<5;k++)
  558.                                   {                                  
  559.                            IC_EEPROM[j][k]=IC_EEPROM[i][k];//重新排列卡号
  560.                                    //Sent_Byte(IC_EEPROM[j][k]);
  561.                                   }       
  562.                                   i++;          
  563.                             }
  564.                           for(j=0;j<5;j++)IC_EEPROM[4][j]=0xff;//最后一个数据补oxff                        
  565.                           ok=1;
  566.                           for(j=0;j<5;j++)
  567.                           {
  568.                            ok=1;
  569.                            for(k=0;k<4;k++)
  570.                              ok=ok&&(IC_EEPROM[j][k]==0xff);
  571.                        if(ok==1)        IC_NUM=IC_EEPROM[j][4]=0xff;//无数据的存储地址卡序号初始为0xff
  572.                            else         IC_NUM=IC_EEPROM[j][4]=j+1;          
  573.                           }                                    
  574.                   }         
  575.                    IapEraseSector(IAP_ADDRESS);//清除数据
  576.                  delayms(10);
  577.                  for(j=0;j<5;j++)//5行
  578.                   for(k=0;k<5;k++)//5列
  579.                   {       
  580.                    IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//写入数据
  581.                    //Sent_Byte(IC_EEPROM[j][k]);
  582.                   }
  583.                  delayms(10);
  584.                 for(j=0;j<5;j++)//5行
  585.                   for(k=0;k<5;k++)//5列
  586.                   {
  587.                    IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//读出卡数据
  588.                    //Sent_Byte(IC_EEPROM[j][k]);
  589.                   }                    
  590.                 for(j=0;j<5;j++)
  591.                  if(IC_EEPROM[j][4]!=0xff)        IC_NUM=IC_EEPROM[j][4];//读出卡刷入顺序
  592.                  if(IC_NUM==0xff)IC_NUM=0;
  593.                  //Sent_Byte(IC_NUM);
  594.                 }                        
  595.           }  
  596. }
  597. }
  598. /****************************************************
  599. 函数名称:bit shudongshuru(uchar key)
  600. 入口参数:key->按键值
  601. 出口参数:正确返回0,错误返回1
  602. 功能:手动输入用户密码、可改用户密码
  603.       按#键手动输入密码   *键后退清除一位   D键确定   A键退出  改用户密码时按B键授权后 方可更改
  604. 调用函数:EEPROM.C   12864.c  KeyPro();
  605. ***************************************************/
  606. bit shudongshuru(uchar key)
  607. {
  608. uchar asteris='*';
  609. uchar spacin =' ';
  610.     uchar key2=0,error=0,j=0,num=0,i=0,k=0,n=0;
  611.         bit Flag; //比较相等标记
  612.         unsigned char passwordlength;     //输入密码长度,实际密码长度
  613.         unsigned char passwordtemp[16];        //最大输入16个
  614.     unsigned char passwordlast[16];
  615.         if(key=='#')
  616.         {
  617.             lcd_clear();
  618.                 display_GB2312_string(1,1,"  请输入密码    ");
  619.                 display_GB2312_string(3,1,"或按B授权改密码 ");
  620.             shoudongshuru_flag=1;
  621.             while(shoudongshuru_flag==1)
  622.                 {
  623.                    key2=KeyPro();
  624.                    if(key2=='A') return 1;
  625.                    if(key2!=0xff)
  626.                    {
  627.                                 if(i==0)    //输入是第一个字符的时候需要把改行清空,方便观看密码
  628.                                   display_GB2312_string(5,1,"                ");//清除该行
  629.                                 if((i<16)&&(key2<=9))
  630.                                   {
  631.                                passwordtemp[i]=key2;
  632.                                   // Sent_Byte(key2);
  633.                                //display_graphic_5x7(5,i*8+1,xing);//输入的密码用"*"代替
  634.                                    display_GB2312_string(5,i*8+1,&asteris);//输入的密码用"*"代替
  635.                                    i++;   //输入数值累加
  636.                                   }       
  637.                                 if('*'==key2&&i>0)
  638.                                   {
  639.                                    i--;
  640.                                    for(k=i;k<16;k++)
  641.                                display_GB2312_string(5,k*8,&spacin);//输入用空格代替                          
  642.                                   }       
  643.                                 if('A'==key2)//退出
  644.                                   {
  645.                                     lcd_clear();
  646.                                     shoudongshuru_flag=0;
  647.                                     return 0;
  648.                                   }               
  649.                                 if(('D'==key2)|| (i==16))//输入按键值15或者密码输入到最大值16,表示输入结束,需要进行比对
  650.                                  {
  651.                                 passwordlength=i;  //计算输入密码长度
  652.                                     if(passwordlength==User_len)//长度相等则比较,否则直接输出错误
  653.                                     {
  654.                                       Flag=1;//先把比较位置1                                         
  655.                                       for(j=0;j<User_len;j++)//循环比较数值,如果有一个不等 则最终Flag值为0
  656.                                           {
  657.                                              Flag=Flag&&(passwordtemp[j]==Userpassword[j]);//比较输入值和已有密码
  658.                                           }
  659.                                 }
  660.                                         i=0;  //计数器复位
  661.                                 if(Flag)//如果比较全部相同,标志位置1
  662.                                     {
  663.                                                   pass();
  664.                                              display_GB2312_string(5,1,"                ");//清除该行
  665.                                                  TR0=1;
  666.                                                  RELAY=0;
  667.                                          error=0;//输入正确则次数清零,重新计数
  668.                                          Flag=0;      //清除正确标志
  669.                                                  shoudongshuru_flag=1;
  670.                                                  return 0;
  671.                                         }
  672.                                     else
  673.                                     {
  674.                                          display_GB2312_string(5,1,"                ");//清除该行
  675.                                          display_GB2312_string(5,1,"Wrong! Retry!   ");//密码错误,提示重新输入
  676.                                          error++;//连续输入错误,则次数累加
  677.                                          if(error==3)
  678.                                           {
  679.                                            error=0;
  680.                                            lcd_clear();
  681.                                            display_GB2312_string(5,1,"禁止入内        ");//密码错误,提示重新输入
  682.                                            delayms(1500);
  683.                                            shoudongshuru_flag=0;
  684.                                            return 1;
  685.                                           }
  686.                                         }               
  687.                                  }
  688.                                  if(key2=='B') //授权修改用户密码
  689.                                  {
  690.                                    shouquan_flag=1;
  691.                                    lcd_clear();
  692.                                    while(administer()) //管理员返回0,密码正确shouquan_flag=0
  693.                                    {
  694.                                      if(KeyPro()=='A')
  695.                                          {                                                   
  696.                                                 shoudongshuru_flag=0;
  697.                                                 return 1;
  698.                                          }                                     
  699.                                    }
  700.                                    if(shouquan_flag==0)display_GB2312_string(1,1,"  请输入新密码   ");//管理员密码正确后的提示
  701.                                    if(shouquan_flag==1)//管理员密码错误,或退出管理员时的提示
  702.                                    {
  703.                                         display_GB2312_string(1,1,"  请输入密码    ");
  704.                                         display_GB2312_string(3,1,"或按B授权改密码 ");                                    
  705.                                    }
  706.                                    num=0;//输入次数计数清零
  707.                                    n=0;        //输入密码长度计数清零
  708.                                    while(shouquan_flag==0)//管理员密码正确进入密码修改
  709.                                    {
  710.                                   key2=KeyPro();       
  711.                                           if(key2=='A')return 1;
  712.                                           if(key2!=0xff)
  713.                                           {
  714.                                                      if(n==0&&num==0)//第一次输入并且是第一位密码
  715.                                                   {
  716.                                                    display_GB2312_string(1,1,"  请输入新密码  ");
  717.                                                    display_GB2312_string(3,1,"                ");
  718.                                                   }
  719.                                                   if((n<16)&&(key2<=9))//按键为1-9 且密码长度小于16位
  720.                                                   {
  721.                                                passwordtemp[n]=key2;
  722.                                                    Sent_Byte(key2);
  723.                                                display_GB2312_string(3,n*8+1,&asteris);//输入的密码用"*"代替
  724.                                                    n++;   //输入数值累加
  725.                                                   }
  726.                                                   if('*'==key2&&n>0)//清除、后退一位
  727.                                                   {
  728.                                                    n--;
  729.                                                    for(k=n;k<16;k++)
  730.                                                display_GB2312_string(3,k*8,&spacin);//输入用空格代替                          
  731.                                                   }       
  732.                                                   if(('D'==key2)||(n==16))//输入按键值D或者密码输入到最大值16,表示输入结束,需要进行比对       
  733.                                                   {
  734.                                                                if(num==0) //第一次输入密码
  735.                                                                 {
  736.                                                                 passwordlength=n;  //计算输入密码长度
  737.                                                                         for(n=0;n<passwordlength;n++)//暂时存储
  738.                                                                         {
  739.                                                                           passwordlast[n]=passwordtemp[n];//转存密码
  740.                                                                           passwordtemp[n]=0;//清空当前
  741.                                                                         }
  742.                                                                         n=0;//计数器复位
  743.                                                                 display_GB2312_string(1,1," 请再次输入密码 ");
  744.                                                                         display_GB2312_string(3,1,"                ");//清除
  745.                                                                         num++;
  746.                                                                 }
  747.                                                             else if(passwordlength==n&&num==1)//第二次输入密码 长度相等则比较,否则直接输出错误   
  748.                                                             {
  749.                                                                       Flag=1;//先把比较位置1                                         
  750.                                                                       for(j=0;j<passwordlength;j++)//循环比较数值,如果有一个不等 则最终Flag值为0
  751.                                                                         Flag=Flag&&(passwordlast[j]==passwordtemp[j]);//比较上次输入值和现在密码是否一样
  752.                                                                           if(Flag==1)
  753.                                                                           {
  754.                                                                            //pass();
  755.                                                                            num=0;
  756.                                                                            shouquan_flag=0;
  757.                                                                            IapEraseSector(IAP_ADDRESS1); //清除
  758.                                                                            delayms(10);
  759.                                                                            IapProgramByte(IAP_ADDRESS1,n);//写入密码个数
  760.                                                                            for(n=1;n<=passwordlength;n++)//存储
  761.                                                                                 {
  762.                                                                              IapProgramByte(IAP_ADDRESS1+n,passwordtemp[n-1]);//写入密码
  763.                                                                                  Sent_Byte(passwordtemp[n-1]);                                                                 
  764.                                                                                 }
  765.                                                                                 delayms(10);
  766.                                                                                 User_len=IapReadByte(IAP_ADDRESS1);//读取密码个数       
  767.                                                                                 Sent_Byte(User_len);                                                         
  768.                                                                                 for(n=1;n<=User_len;n++)
  769.                                                                                 {
  770.                                                                                  Userpassword[n-1]=IapReadByte(IAP_ADDRESS1+n); //读取 密码
  771.                                                                                  Sent_Byte(Userpassword[n-1]);                                                                 
  772.                                                                                 }
  773.                                                                            n=0;
  774.                                                                            display_GB2312_string(1,1,"  修改密码成功   ");
  775.                                                                            delayms(1500);
  776.                                                                            num=0;
  777.                                                                            return 0;
  778.                                                                           }
  779.                                                                           else if(Flag==0)
  780.                                                                           {
  781.                                                                                   display_GB2312_string(3,1,"   请重新输入   ");//清除
  782.                                                                                   display_GB2312_string(1,1,"  两次输入不同  ");//清除该行
  783.                                                                                   num=0;
  784.                                                                                   n=0;
  785.                                                                                   error++;//连续输入错误,则次数累加
  786.                                                                                   if(error==3)
  787.                                                                                   {
  788.                                                    display_GB2312_string(3,1,"                ");//清除
  789.                                                                                    display_GB2312_string(1,1,"错误3次,修改失败");//密码错误,返回界面
  790.                                                                                    delayms(1500);
  791.                                                                                    shouquan_flag=1;
  792.                                                                                    return 1;
  793.                                                                                    //while(1);//停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。
  794.                                                                                   }
  795.                                                                           }       
  796.                                                          }
  797.                                                                  else if(num==1)
  798.                                                                  {
  799.                                                                           display_GB2312_string(3,1,"   请重新输入   ");//清除
  800.                                                                           display_GB2312_string(1,1,"  两次输入不同  ");//清除该行
  801.                                                                           num=0;
  802.                                                                           n=0;
  803.                                                                           error++;//连续输入错误,则次数累加
  804.                                                                           if(error==3)
  805.                                                                           {
  806.                                            display_GB2312_string(3,1,"                ");//清除
  807.                                                                            display_GB2312_string(1,1,"错误3次,修改失败");//密码错误,返回界面
  808.                                                                            delayms(1500);
  809.                                                                            shouquan_flag=1;
  810.                                                                            return 1;
  811.                                                                            //while(1);//停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。
  812.                                                                           }
  813.                                                                 }
  814.                                                   }
  815.                                           }
  816.                                    }
  817.                                  }
  818.                          }
  819.                }         
  820.         }
  821. }                                                                                                 
  822. /****************************************************
  823. 函数名称:Timer0Init(void)
  824. 入口参数:无
  825. 出口参数:无
  826. 功能:          用于定时关闭门
  827. 调用函数:无
  828. ****************************************************/

  829. void Timer0Init(void)                //50毫秒@11.0592MHz
  830. {
  831.         AUXR &= 0x7F;                //定时器时钟12T模式
  832.         TMOD &= 0xF0;                //设置定时器模式
  833.         TMOD |= 0x01;                //设置定时器模式
  834.         TL0 = 0x00;                //设置定时初值
  835.         TH0 = 0x4C;                //设置定时初值
  836.         TF0 = 0;                //清除TF0标志
  837.         ET0        = 1;                //允许定时器0中断
  838.         TR0 = 0;                //定时器0开始计时
  839. }
  840. void Timer1Init(void)                //50毫秒@11.0592MHz
  841. {
  842.         AUXR &= 0xBF;                //定时器时钟12T模式
  843.         TMOD &= 0x0F;                //设置定时器模式
  844.         TMOD |= 0x10;                //设置定时器模式
  845.         TL1 = 0x00;                //设置定时初值
  846.         TH1 = 0x4C;                //设置定时初值
  847.         TF1 = 0;                //清除TF1标志
  848.     ET1        = 1;                //允许定时器0中断
  849.         TR1 = 0;                //定时器1开始计时
  850. }

  851. /****************************************************
  852. 函数名称:主函数
  853. ****************************************************/
  854. main()
  855. {  
  856.     uchar key,j=0,k=0,n,i,sel=0;
  857.         unsigned long int display_data=0;
  858.         BELL=0;//关闭
  859.         RELAY=1;
  860.         io_init();//初始化引脚
  861.         UART_Init();//初始化UART通讯
  862.         rom_cs=1;
  863.     lcd_init();//初始化液晶屏
  864.         init_spi();//初始化SPI通讯
  865.         Timer0Init();//初始化定时器0关门用
  866.         Timer1Init();//初始化定时器1时钟闪烁用
  867.         Ds1302_Init();
  868.         EA   =1;  //单片机中断允许
  869.         //IapEraseSector(IAP_ADDRESS);//清除数据   卡数据
  870.         //IapEraseSector(IAP_ADDRESS1);//清除数据        用户密码
  871.         for(j=0;j<5;j++)//5行
  872.           for(k=0;k<5;k++)//4列
  873.             IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//读出卡数据
  874.         for(j=0;j<5;j++)
  875.          if(IC_EEPROM[j][4]!=0xff)        IC_NUM=IC_EEPROM[j][4];//读出卡刷入顺序

  876.         User_len=IapReadByte(IAP_ADDRESS1);//读取用户密码个数
  877.         //Sent_Byte(User_len);
  878.         if(User_len==0xff)User_len=6;//初始化用户密码长度6位
  879.         //Sent_Byte(User_len);                                                                 
  880.         for(k=1;k<=User_len;k++) //读取用户密码
  881.         {
  882.                   i=IapReadByte(IAP_ADDRESS1+k); //读取用户密码
  883.                 if(i==0xff)Userpassword[k-1]=0;//初始话用户密码为000000
  884.                 else Userpassword[k-1]=i;
  885.         }
  886.         // for(j=0;j<6;j++)Sent_Byte(Userpassword[j]);       

  887.         PcdReset();        //初始化射频芯片
  888.         PcdAntennaOff();
  889.         PcdAntennaOn();  
  890.         delayms(100);
  891.         PcdReset();//复位芯片,打开天线   
  892.         PcdAntennaOff();
  893.         PcdAntennaOn();  
  894.     //M500PcdConfigISOType( 'A' );//设置RC632的工作方式
  895.     //Delay_ms(100);
  896.         lcd_clear();
  897.     while(1)
  898.         {                    
  899.                   key=KeyPro();//按键检测          
  900.                   if(key!=0xff)
  901.                   {
  902.                     IC:if(key=='#')shudongshuru(key);//手动输入密码
  903.                            if(key=='C')zhuxiao_one(key);//注销单张卡 持卡注销
  904.                            if(key=='*')zhuxiao_all(key);//注销所有卡
  905.                            if(key=='B')shouquan(key);//授权卡
  906.                            IC_flag=0;
  907.                            lcd_clear();           
  908.                   }                  
  909.                   Auto_Reader();
  910.                   if(IC_flag==1)//刷卡标记
  911.                   {               
  912.                         display_GB2312_string(1,1,"   欢迎光临 ! ");
  913.                             IC_flag=0;  
  914.                                 //for(n=0;n<4;n++)Sent_Byte(ICCODE[n]);       
  915.                                 for(j=0;j<5;j++)//5行
  916.                                 {
  917. ……………………

  918. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:

代码.rar (197.69 KB, 下载次数: 509)
RFID.pdf (626.12 KB, 下载次数: 321)


评分

参与人数 2黑币 +55 收起 理由
北风摇曳 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:353057 发表于 2018-8-25 09:26 | 只看该作者
厉害了,
回复

使用道具 举报

板凳
ID:32627 发表于 2018-8-28 06:29 | 只看该作者
下载下来看看。
回复

使用道具 举报

地板
ID:450873 发表于 2018-12-20 17:35 | 只看该作者
资料很好,很全就是有些地方不是很懂。。。
回复

使用道具 举报

5#
ID:452539 发表于 2018-12-23 12:19 | 只看该作者
厉害了,这个我更需要。管理给我金币让我下载一个吧
回复

使用道具 举报

6#
ID:452539 发表于 2019-1-14 22:44 | 只看该作者
怎么把软件中特殊的12864改成普通的20脚的12864呢?
回复

使用道具 举报

7#
ID:481841 发表于 2019-2-27 22:08 | 只看该作者
厉害厉害学习一下
回复

使用道具 举报

8#
ID:481841 发表于 2019-2-27 22:08 | 只看该作者
这个资料很好有价值
回复

使用道具 举报

9#
ID:236645 发表于 2019-4-3 09:07 | 只看该作者
很有价值 看一看
回复

使用道具 举报

10#
ID:164146 发表于 2019-4-17 12:16 | 只看该作者
厉害了。正好需要,下载一个看看。
回复

使用道具 举报

11#
ID:226505 发表于 2019-5-12 01:40 来自手机 | 只看该作者
好   eeprom部分的授权  注销借用了一下  能用 谢谢楼主
回复

使用道具 举报

12#
ID:258222 发表于 2019-9-11 14:08 | 只看该作者
好东西,大家验证过么?好用不?
回复

使用道具 举报

13#
ID:726617 发表于 2020-4-14 15:53 来自手机 | 只看该作者
楼主能加个联系方式提供下代码嘛?
回复

使用道具 举报

14#
ID:879662 发表于 2021-1-26 08:50 | 只看该作者
楼主这个代码实现需要什么型号的单片机
回复

使用道具 举报

15#
ID:1025855 发表于 2022-5-14 17:38 | 只看该作者
下来看看。希望有效
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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