找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2682|回复: 11
收起左侧

关于51单片机的RC522门禁程序调试问题

[复制链接]
ID:986464 发表于 2021-12-9 02:34 | 显示全部楼层 |阅读模式
新手小白想用51单片机和rc522做一个门禁识别系统由于按键IO口不够只接了四个,在主程序中通过按键分为管理员模式和用户模式,程序是网上找有lcd12864和直流电机改成的lcd1206和步进电机,实物连接后运行程序一开始有显示屏上有管理员设置,k1,k2,k3键和返回键按了都可以进入相应的模式设置密码上没有问题设置成功后显示屏上有Sucess,但是进入录卡模式时,卡片还没放上去或则把rc522拔掉,显示屏上依然有sucess而且此时按返回没有反应,这是第一个问题还有设置密码后返回到用户模式密码验证时输入8位密码显示屏会直接白屏然后没有反应,这些问题已经困扰我很久了,希望得到解决

这是单片机程序:
<main.c>
  1. #include "reg52.h"
  2. #include "main.h"
  3. #include "uart.h"
  4. #include "timer.h"
  5. #include "rc522.h"
  6. #include "ctrl.h"
  7. #include "motor.h"

  8. #include "beep.h"
  9. #include "key.h"  
  10. #include "EEPROM.h"
  11. #include "1206.h"
  12. int count=1;//全局变量,1代表管理员模式
  13. unsigned int AL=1;
  14. void init_all(void)        //初始化
  15. {
  16.         EA = 0;              //关总中断                 
  17.         init_timer(); //定时器初始化
  18.         init_uart();  //串口初始化
  19.         init_rc522(); //RC522初始化        
  20.         Init_LCD1602();//1602初始化
  21.         EEPROM_READ(0,Card_SN_BUF,4);//EEPROM初始化,取出记录的卡号  
  22.         EEPROM_READ(7,KEY_BUF,8);//EEPROM初始化,取出记录的密码
  23.         EEPROM_READ(5,AdminKEY_BUF,6);
  24.         send_bytes(Card_SN_BUF,4);
  25.         EA = 1;                  //开总中断
  26. }
  27. void main(void)          //主函数
  28. {        
  29.         INT8U key;
  30.         int i=1;
  31.         beep=0;
  32.     Delay_ms(50); //让硬件稳定
  33.         init_all();           //执行初始化函数
  34.         beep1();           //beep test         
  35.         while(1)
  36.         {                if(i==0)
  37.                         {
  38.                                 i=1;
  39.                         }
  40.                         if(AL==0)
  41.                         {
  42.                                 AL=1;
  43.                         }
  44.                 if(count)
  45.                         {
  46.                                 while(i)
  47.                                 {
  48.                                 
  49.                                 LCD1602_Dis_Str(0, 0, &DIS3[0]);        
  50.                                 LCD1602_Dis_Str(0, 1, &DIS5[0]);
  51.                                 key=key_scan(); //按键操作
  52.                                 
  53.                                 if(key==1||key==2||key==3||key==10)
  54.                                         {
  55.                                                 switch(key)
  56.                                                                         {
  57.                                                                                 case 0: break;
  58.                                                                                 case 1: states=4;//设管理员密码
  59.                                                                                                                 break;
  60.                                                                                 case 2: states=2;//录卡
  61.                                                                                                                 break;
  62.                                                                                 case 3: states=3;//设门禁密码
  63.                                                                                                                 break;
  64.                                                                                 case 10: i--;//返回到用户模式
  65.                                                                                                                 break;
  66.                                                                         }
  67.                                                 
  68.                                                 ctrl_process(); //进入RC522操作
  69.                                         }
  70.                                        
  71.                                 }
  72.                                 count--;//退出管理员模式
  73.                         }
  74.                         if(count!=1)//用户模式
  75.                         {
  76.                                 LCD1602_Write_Cmd(0x01); //清除显示
  77.                                 LCD1602_Dis_Str(0, 0, &uct[0]);        
  78.                                 LCD1602_Dis_Str(0, 1, &INI1[0]);
  79.                                 LCD1602_Dis_Str(6, 1, &INI2[0]);
  80.                                 LCD1602_Dis_Str(12, 1, &INI3[0]);
  81.                                 while(AL)
  82.                                 {
  83.                                 key=key_scan(); //按键操作
  84.                                 
  85.                                 if(key==1||key==2||key==3)
  86.                                         {
  87.                                                 switch(key)
  88.                                                                         {
  89.                                                                                 case 0: break;
  90.                                                                                 case 1: states=1;//密码开门
  91.                                                                                                                 break;
  92.                                                                                 case 2: states=0;//刷卡开门
  93.                                                                                                                 break;
  94.                                                                                 case 3: states=5;//管理员模式验证
  95.                                                                                                                 break;
  96.                                                                                 
  97.                                                                         }
  98.                                                 
  99.                                                 ctrl_process(); //进入RC522操作
  100.                                         }
  101.                                        
  102.                         }
  103.                                 count++;
  104.                 }
  105.         }        
  106. }  

  107. //main.h
  108. typedef        unsigned char        BOOLEAN;
  109. typedef        unsigned char        INT8U;
  110. typedef        signed char                INT8S;
  111. typedef        unsigned int        INT16U;
  112. typedef        signed int                INT16S;
  113. typedef        unsigned long          INT32U;
  114. typedef        signed long            INT32S;

  115. #define        FOSC        22118400L//11059200L
  116. #define        BAUD        9600

  117. #define        FALSE        0
  118. #define        TRUE        1

  119. #define        WR                0
  120. #define        RD                1

  121. #define nop() _nop_()

  122. #define        BIT(n)        ( 1 << n )

  123. /******************
  124. UartCmdLen:UartCmd + UartErrCode
  125. UartDataLen:UartDataBuf
  126. *******************/

  127. typedef struct __sUartData
  128. {
  129.         INT8U UartCmdLen;  //命令长度
  130.         INT8U UartDataLen; //数据长度
  131.         INT16U UartCmd;
  132.         INT8U  UartErrCode;
  133.         INT8U  UartDataBuf[1];
  134. } *psUartData;

  135. #define        LED_NONE        0
  136. #define        LED_LONG        1
  137. #define        LED_200MS        2
  138. #define        LED_80MS        3
  139. extern unsigned int AL;

  140. #endif



  141. //<ctrl.c>
  142. #include "reg52.h"
  143. #include "string.h"
  144. #include "main.h"
  145. #include "uart.h"  
  146. #include "rc522.h"
  147. #include "ctrl.h"
  148. #include "beep.h"
  149. #include "timer.h"
  150. #include "EEPROM.h"
  151. #include "key.h"
  152. #include "1206.h"
  153. #include "motor.h"
  154. INT8U states=15;//状态机
  155. unsigned char code READID[] = {"ID:"};
  156. INT8U Card_type[2],        //卡片类型
  157.       Card_SN[4]={0},//IC卡号
  158.           Card_SN_BUF[4]={0xff,0xff,0xff,0xff},//卡号登记缓冲区           
  159.           KEY_BUF[8]={'0','0','0','0','0','0','0','0'};
  160. INT8U AdminKEY_BUF[8]={'0','0','0','0','0','0','0','0'};
  161. INT8U bPass = 0; bWarn = 0;           
  162. //unsigned int ID_BUF[50];//可录50张卡
  163. //NT8U ID_buf[8];               
  164. void uart_over( void )        //串口数据还原
  165. {
  166.         UartCount = 0;
  167.         UartStart = FALSE;
  168.         UartComp = FALSE;
  169. }

  170. void pass( void )
  171. {
  172.    beep1();
  173.    Delay_ms(2000);//让卡片离开
  174. //   LED_BLINK_1();
  175. }

  176. void warn(void)
  177. {
  178.   beep2();
  179. }


  180. INT8U IC_READ( void )
  181. {
  182.     INT8U ID_ASC[8],i;
  183.         
  184.         if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节        
  185.         {
  186.                 if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节        
  187.                 {
  188.                   
  189.                         return FALSE;
  190.                 }        
  191.         }
  192.         
  193.         if( PcdAnticoll( Card_SN ) != MI_OK ) //防冲撞,返回卡的序列号 4字节
  194.         {

  195.                 bWarn = 1;
  196.                 return FALSE;        
  197.         }

  198.         bPass = 1;
  199.         send_bytes(Card_type,2);
  200.         send_bytes(Card_SN,4);
  201.         
  202.         for(i=0;i<4;i++) //卡ID号转化成ASCII
  203.         {
  204.           if(Card_SN[i]/16>9)        ID_ASC[i*2]=Card_SN[i]/16+'7';
  205.             else ID_ASC[i*2]=Card_SN[i]/16+'0';

  206.       if(Card_SN[i]%16>9)        ID_ASC[i*2+1]=Card_SN[i]%16+'7';
  207.             else ID_ASC[i*2+1]=Card_SN[i]%16+'0';
  208.         }
  209. //        display2(3,0,"ID: ",4); //显示卡号
  210. //        display2(3,2,ID_ASC,8);
  211.                 LCD1602_Write_Cmd(0x01); //清除显示
  212.                 LCD1602_Dis_Str(0, 0, &READID[0]);        
  213.                 LCD1602_Dis_Str(0, 1, &ID_ASC[0]);        
  214.         Delay_ms(2000);
  215.         return TRUE;
  216. }

  217. //void buf_BUF()
  218. //{
  219. //        unsigned int ID_[50];
  220. //        
  221. //        for(int i=0;i<4;i++)
  222. //        {
  223. //                for(int j=0;j<50;j++)
  224. //                {
  225. //                        if(ID_BUF[j]!=0)
  226. //                        else
  227. //                        {
  228. //                                break;
  229. //                        }
  230. //                }
  231. //               
  232. //                ID_[i]=ID_buf[i]*
  233. //        }
  234. //}

  235. void ctrl_process( void )
  236. {                  
  237.    INT8U i,key_count,key_value=16,table[8]="--------";        
  238.         int j=1;
  239.         
  240.                 LCD1602_Write_Cmd(0x01); //清除显示
  241.                
  242.         
  243.         
  244.     switch(states)
  245.         {
  246.        case 0:                                 //IC卡读卡输入
  247.                                  while(j){
  248.                             LCD1602_Dis_Str(0, 0, &DIS0[0]);        
  249.                                           key_value=key_scan();         
  250.                                   if(key_value==10)
  251.                                    {                                 
  252.                                                   LCD1602_Write_Cmd(0x01); //清除显示
  253.                                                                         states=15;
  254.                          return;
  255.                                         }
  256.                       if(IC_READ())
  257.                           {
  258.                            j--;
  259.                                        
  260.                 if ((Card_SN[0]==Card_SN_BUF[0])
  261.                               &&(Card_SN[1]==Card_SN_BUF[1])
  262.                                   &&(Card_SN[2]==Card_SN_BUF[2])
  263.                                   &&(Card_SN[3]==Card_SN_BUF[3]))
  264.                                   {
  265.                                                 
  266.                                                 open();
  267.                                          LCD1602_Dis_Str(0, 1, &uctyes[0]);        
  268.                                 
  269.                               }
  270.                                   else          LCD1602_Dis_Str(0, 1, &uctno[0]);        

  271.                            }
  272.                                 
  273.                                 
  274.                          }
  275.                                  LCD1602_Write_Cmd(0x01); //清除显示
  276.                                  states=15;
  277.                           break;

  278.         case 1:               
  279.                       LCD1602_Dis_Str(0, 0, &DIS7[0]);                                //密码输入
  280.                                  LCD1602_Dis_Str(0, 1, &table[0]);
  281.                            key_count=0;
  282.                while(1)
  283.                            {  
  284.                               key_value=key_scan();         
  285.                                   if(key_value==10)
  286.                                    {
  287.                                       LCD1602_Write_Cmd(0x01); //清除显示
  288.                                                                         states=15;
  289.                          return;
  290.                                         }                 
  291.                                   if(key_value>=0 && key_value <=9)//有按键输入
  292.                                   {                                                                                          
  293.                                         table[key_count++]=key_value+'0';
  294.                                          LCD1602_Dis_Str(0, 1, &table[0]);               
  295.                                   }
  296.                                  
  297.                                   if(key_value==11)//退格
  298.                                   {                                                                    
  299.                                         table[--key_count]='-';
  300.                                          LCD1602_Dis_Str(0, 1, &table[0]);                                
  301.                                   }

  302.                                   if(key_count==8)
  303.                                   {
  304.                                      if( table[0]==KEY_BUF[0] &&
  305.                                              table[1]==KEY_BUF[1] &&
  306.                                                   table[2]==KEY_BUF[2] &&
  307.                                                  table[3]==KEY_BUF[3] &&
  308.                                                  table[4]==KEY_BUF[4] &&
  309.                                                  table[5]==KEY_BUF[5] &&
  310.                                                  table[6]==KEY_BUF[6] &&
  311.                                                  table[7]==KEY_BUF[7] )          //密吗正确
  312.                                 
  313.                                      {
  314.                                            bPass=1;
  315. //                                           relay_ON();//灯开关
  316.                                                          open();
  317.                      LCD1602_Dis_Str(0, 1, &uctyes[0]);        
  318.                                           
  319.                                                          
  320.                                            break;                                 
  321.                                        
  322.                                          }
  323.                                           else          //密码错误
  324.                                           {        
  325.                                             
  326.                                                 bWarn=1;
  327.                                              LCD1602_Dis_Str(0, 1, &uctno[0]);        
  328.                                                  break;
  329.                                          }                                          
  330.                                   }

  331.                            }
  332.                                   LCD1602_Write_Cmd(0x01); //清除显示
  333.                                                                         states=15;
  334.                        break ;
  335.                   
  336.                  case 2:        
  337.                                         while(j){
  338.                        LCD1602_Dis_Str(0, 0, &DIS1[0]);//IC卡登记
  339.                                                  key_value=key_scan();        
  340.                                                  if(key_value==10)
  341.                                    {                                 
  342.                                                   LCD1602_Write_Cmd(0x01); //清除显示
  343.                                                                         states=15;
  344.                          return;
  345.                                         }
  346.                    if(IC_READ())  
  347.                            {
  348.                                          j--;
  349.                             for(i=0;i<4;i++)
  350.                             Card_SN_BUF[i] = Card_SN[i];

  351.                                 EEPROM_WRITE(0,Card_SN,4);//写入EEPROM
  352.                            }
  353.                                    beep1();
  354.                                   LCD1602_Dis_Str(0, 1, &uctyes[0]);
  355.                                                 Delay_ms(2000);
  356.                                  
  357.                          }
  358.                                         LCD1602_Write_Cmd(0x01); //清除显示
  359.                                         states=15;
  360.                        break ;

  361.                  case 3:                //门禁密码设置
  362.                       LCD1602_Dis_Str(0, 0, &DIS2[0]);
  363.                                         LCD1602_Dis_Str(0, 1, &table[0]);
  364.                            key_count=0;
  365.                            while(1)
  366.                            {  
  367.                               key_value=key_scan();         
  368.                                   if(key_value==10)
  369.                                    {                                 
  370.                                                  LCD1602_Write_Cmd(0x01); //清除显示
  371.                                                                         states=15;
  372.                          return;
  373.                                         }
  374.                         
  375.                               if(key_value>=0 && key_value <=9)//有按键输入
  376.                                   {                                                                                          
  377.                                         table[key_count++]=key_value+'0';
  378.                                         LCD1602_Dis_Str(0, 1, &table[0]);                        
  379.                                   }
  380.                                  
  381.                                   if(key_value==11)//退格
  382.                                   {                                                                    
  383.                                         table[--key_count]='-';
  384.                                         LCD1602_Dis_Str(0, 1, &table[0]);                                
  385.                                   }

  386.                                    if(key_count==8) //按下确定键
  387.                                  
  388.                                   {
  389.                                  
  390.                                     for(i=0;i<8;i++)
  391.                                      KEY_BUF[i]=table[i];        
  392.                                             EEPROM_WRITE(7,KEY_BUF,8);//写入EEPROM
  393.                                                 LCD1602_Write_Cmd(0x01); //清除显示
  394.                                                  LCD1602_Dis_Str(0, 0, &uctyes[0]);
  395.                                                 Delay_ms(2000);        
  396.                                                 states=15;
  397.                                    break;
  398.                                    }
  399.                 }
  400.                                         LCD1602_Write_Cmd(0x01); //清除显示
  401.                                 states=15;
  402.                        break ;
  403.                  case 4:                                //密码设置
  404.                          LCD1602_Dis_Str(0, 0, &DIS4[0]);
  405.                                  LCD1602_Dis_Str(0, 1, &table[0]);
  406.                            key_count=0;
  407.                            while(1)
  408.                            {  
  409.                               key_value=key_scan();         
  410.                                   if(key_value==10)
  411.                                    {
  412.                                                                         LCD1602_Write_Cmd(0x01); //清除显示
  413.                                                                          states=15;
  414.                          return;
  415.                                         }
  416.                         
  417.                               if(key_value>=0 && key_value <=9)//有按键输入
  418.                                   {                                                                                          
  419.                                         table[key_count++]=key_value+'0';
  420.                                         LCD1602_Dis_Str(0, 1, &table[0]);                        
  421.                                   }
  422.                                  
  423.                                   if(key_value==11)//退格
  424.                                   {                                                                    
  425.                                         table[--key_count]='-';
  426.                                         LCD1602_Dis_Str(0, 1, &table[0]);                                
  427.                                   }

  428.                                    if(key_count==8) //按下确定键
  429.                                  
  430.                                   {
  431.                                  
  432.                                     for(i=0;i<8;i++)
  433.                                      AdminKEY_BUF[i]=table[i];        
  434.                                             EEPROM_WRITE(5,AdminKEY_BUF,6);//写入EEPROM
  435.                                                 LCD1602_Write_Cmd(0x01); //清除显示
  436.                                                  LCD1602_Dis_Str(0, 0, &uctyes[0]);
  437.                                                 Delay_ms(2000);        
  438.                                                 
  439.                                    break;
  440.                                    }
  441.                 }                          
  442.                                 states=15;
  443.                                         LCD1602_Write_Cmd(0x01); //清除显示
  444.                        break ;
  445.                           case 5:                //管理员密码验证
  446.                        LCD1602_Dis_Str(0, 0, &DIS6[0]);  
  447.                            LCD1602_Dis_Str(0, 1, &table[0]);
  448.                            key_count=0;
  449.                while(1)
  450.                            {  
  451.                               key_value=key_scan();         
  452.                                   if(key_value==10)
  453.                                    {
  454.                                                          LCD1602_Write_Cmd(0x01); //清除显示
  455.                                      states=15;
  456.                          return;
  457.                                         }


  458.                                   if(key_value>=0 && key_value <=9)//有按键输入
  459.                                   {                                                                                          
  460.                                         table[key_count++]=key_value+'0';
  461.                                          LCD1602_Dis_Str(0, 1, &table[0]);               
  462.                                   }
  463.                                  
  464.                                   if(key_value==11)//退格
  465.                                   {                                                                    
  466.                                         table[--key_count]='-';
  467.                                         LCD1602_Dis_Str(0, 1, &table[0]);                                
  468.                                   }

  469.                                   if(key_count==8)
  470.                                   {
  471.                                      if( table[0]==AdminKEY_BUF[0] &&
  472.                                              table[1]==AdminKEY_BUF[1] &&
  473.                                                   table[2]==AdminKEY_BUF[2] &&
  474.                                                  table[3]==AdminKEY_BUF[3] &&
  475.                                                  table[4]==AdminKEY_BUF[4] &&
  476.                                                  table[5]==AdminKEY_BUF[5] &&
  477.                                                  table[6]==AdminKEY_BUF[6] &&
  478.                                                  table[7]==AdminKEY_BUF[7] )          //密吗正确
  479.                                 
  480.                                      {
  481.                                            bPass=1;
  482.                                                          
  483.                       LCD1602_Dis_Str(0, 1, &uctyes[0]);        
  484.                                                          AL--;//进入管理员模式
  485.                                           
  486.                                            break;                                 
  487.                                        
  488.                                          }
  489.                                           else          //密码错误
  490.                                           {        
  491.                                             
  492.                                                 
  493.                                                 bWarn=1;
  494.                                             LCD1602_Dis_Str(0, 1, &uctno[0]);        
  495.                                                  break;
  496.                                          }                                          
  497.                                   }

  498.                            }
  499.                                          LCD1602_Write_Cmd(0x01); //清除显示
  500.                                      states=15;
  501.                        break ;
  502.                                 
  503.                 default : break;

  504.          }        //switch                  

  505.         if( bPass )                 //处理成功
  506.         {
  507.                 bPass = 0;
  508.                 pass();        
  509.         
  510.         }

  511.         if( bWarn )             //处理失败
  512.         {
  513.                 bWarn = 0;
  514.                 warn();
  515.         }

  516. }

  517. <key.c>
  518. #include "reg52.h"
  519. #include "timer.h"

  520. #define uchar unsigned char
  521. #define uint unsigned int

  522. uchar num,temp;               
  523. sbit bacK =P1^6;
  524. //sbit delaTe =P1^7;
  525. sbit k1=P1^4;
  526. sbit k2=P1^5;
  527. sbit k3=P1^7;
  528. uchar key_scan(void) //键盘扫描
  529. {
  530.         num=16;//16表示没按键输入
  531.         if(k1!=1)
  532.         {
  533.                 Delay_ms(20);
  534.                 if(k1!=1)
  535.                 {
  536.                         num=1;
  537.                 }
  538.         }
  539.         if(k2!=1)
  540.         {
  541.                 Delay_ms(20);
  542.                 if(k2!=1)
  543.                 {
  544.                         num=2;
  545.                 }
  546.         }
  547.         if(k3!=1)
  548.         {
  549.                 Delay_ms(20);
  550.                 if(k3!=1)
  551.                 {
  552.                         num=3;
  553.                 }
  554.         }
  555.         if(bacK!=1)//返回
  556.                 {
  557.                         Delay_ms(20);
  558.                         if(bacK!=1)
  559.                         {
  560.                                 num=10;
  561.                         }
  562.                 }
  563.         return num;           //返回按键对应编号
  564. }     
复制代码
   

<1206.c>
  1. #include "reg52.h"

  2. sbit LCD1602_RS = P2^6;         //RS端
  3. sbit LCD1602_RW = P2^5;         //RW端
  4. sbit LCD1602_EN = P2^7;         //EN端
  5. /********宏定义***********************************************************/
  6. #define LCD1602_DB P0        //LCD1602数据总线
  7. #define Busy    0x80 //用于检测LCD状态字中的Busy标识

  8. /********数据定义*************************************************************/
  9. unsigned char code uct[] = {"Please Input:"};
  10. unsigned char code INI1[] = {"1CODE"};
  11. unsigned char code INI2[] = {"2READ"};
  12. unsigned char code INI3[] = {"3Admin"};
  13. unsigned char code uctlu[] = {"Recording:"};
  14. unsigned char code uctyes[] = {"Sucess"};
  15. unsigned char code uctno[] = {"ID EOORE"};
  16. unsigned char code net[] = {"Welcome"};
  17. unsigned char code DIS0[] = {"READING IC"};
  18. unsigned char code DIS1[] = {"RECORD IC"};
  19. unsigned char code DIS2[] = {"SET CODEx8:"};
  20. unsigned char code DIS3[] = {"Admin:"};
  21. unsigned char code DIS4[] = {"SET adminCODEx8:"};
  22. unsigned char code DIS5[] = {"1   2   3"};
  23. unsigned char code DIS6[] = {"InputAdmincodex8"};
  24. unsigned char code DIS7[] = {"Inputcodex8"};
  25. typedef unsigned char uchar;
  26. typedef unsigned int uint;
  27. /*=================================================
  28. *函数名称:Read_Busy
  29. *函数功能:判断1602液晶忙,并等待
  30. =================================================*/
  31. void Read_Busy()
  32. {
  33.         uchar busy;
  34.         LCD1602_DB = 0xff;//复位数据总线
  35.         LCD1602_RS = 0;          //拉低RS
  36.         LCD1602_RW = 1;          //拉高RW读
  37.         do
  38.         {
  39.                 LCD1602_EN = 1;//使能EN
  40.                 busy = LCD1602_DB;//读回数据
  41.                 LCD1602_EN = 0;         //拉低使能以便于下一次产生上升沿
  42.         }while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待
  43. }

  44. /*=================================================
  45. *函数名称:LCD1602_Write_Cmd
  46. *函数功能:写LCD1602命令
  47. *调用:Read_Busy();
  48. *输入:cmd:要写的命令
  49. =================================================*/
  50. void LCD1602_Write_Cmd(unsigned char cmd)
  51. {
  52.         Read_Busy();         //判断忙,忙则等待
  53.         LCD1602_RS = 0;
  54.         LCD1602_RW = 0;        //拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节
  55.         LCD1602_DB = cmd;//写入命令
  56.         LCD1602_EN = 1;         //拉高使能端 数据被传输到LCD1602内
  57.         LCD1602_EN = 0;         //拉低使能以便于下一次产生上升沿
  58. }
  59. /*=================================================
  60. *函数名称:LCD1602_Write_Dat
  61. *函数功能:写LCD1602数据
  62. *调用:Read_Busy();
  63. *输入:dat:需要写入的数据
  64. =================================================*/
  65. void LCD1602_Write_Dat(unsigned char dat)
  66. {
  67.         Read_Busy();
  68.         LCD1602_RS = 1;
  69.         LCD1602_RW = 0;
  70.         LCD1602_DB = dat;
  71.         LCD1602_EN = 1;
  72.         LCD1602_EN = 0;
  73. }
  74. /*=================================================
  75. *函数名称:LCD1602_Dis_OneChar
  76. *函数功能:在指定位置显示一个字符
  77. *调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();        
  78. *输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
  79.                 dat:需要显示的数据以ASCLL形式显示
  80. =================================================*/
  81. void LCD1602_Dis_OneChar(unsigned char x,unsigned char y,unsigned char dat)
  82. {
  83.         if(y)        x |= 0x40;
  84.         x |= 0x80;
  85.         LCD1602_Write_Cmd(x);
  86.         LCD1602_Write_Dat(dat);               
  87. }
  88. /*=================================================
  89. *函数名称:LCD1602_Dis_Str
  90. *函数功能:在指定位置显示字符串
  91. *调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
  92. *输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
  93.                 *str:需要显示的字符串
  94. =================================================*/
  95. void LCD1602_Dis_Str(unsigned char x,unsigned char y,unsigned char *str)
  96. {
  97.         if(y) x |= 0x40;
  98.         x |= 0x80;
  99.         LCD1602_Write_Cmd(x);
  100.         while(*str != '\0')
  101.         {
  102.                 LCD1602_Write_Dat(*str++);
  103.         }
  104. }
  105. /*=================================================
  106. *函数名称:Init_LCD1602
  107. *函数功能:1602初始化
  108. *调用:        LCD1602_Write_Cmd();
  109. =================================================*/
  110. void Init_LCD1602()
  111. {
  112.         LCD1602_Write_Cmd(0x38); //        设置16*2显示,5*7点阵,8位数据接口
  113.         LCD1602_Write_Cmd(0x0c); //开显示
  114.         LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1
  115.         LCD1602_Write_Cmd(0x01); //清除显示

  116. }

  117. <rc522.c>
  118. #include "reg52.h"
  119. #include "intrins.h"
  120. #include "main.h"
  121. #include "rc522.h"
  122. #include "string.h"

  123. void delay_ns(unsigned int ns)
  124. {
  125.         unsigned int i;
  126.         for(i=0;i<ns;i++)
  127.         {
  128.                 nop();
  129.                 nop();
  130.                 nop();
  131.         }
  132. }

  133. //------------------------------------------
  134. // 读SPI数据
  135. //------------------------------------------
  136. unsigned char SPIReadByte(void)
  137. {
  138.         unsigned char SPICount;                                       // Counter used to clock out the data
  139.         unsigned char SPIData;
  140.                         
  141.         SPIData = 0;
  142.         for (SPICount = 0; SPICount < 8; SPICount++)                  // Prepare to clock in the data to be read
  143.         {
  144.                 SPIData <<=1;                                               // Rotate the data
  145.                 CLR_SPI_CK; //nop();//nop();                                         // Raise the clock to clock the data out of the MAX7456
  146.                 if(STU_SPI_MISO)
  147.                 {
  148.                          SPIData|=0x01;
  149.                 }
  150.                 SET_SPI_CK;   //nop();//nop();                                               // Drop the clock ready for the next bit
  151.         }                                                             // and loop back
  152.         return (SPIData);                              // Finally return the read data
  153. }
  154. //------------------------------------------
  155. // 写SPI数据
  156. //------------------------------------------
  157. void SPIWriteByte(unsigned char SPIData)
  158. {
  159.         unsigned char SPICount;                                       // Counter used to clock out the data
  160.         for (SPICount = 0; SPICount < 8; SPICount++)
  161.         {
  162.                 if (SPIData & 0x80)
  163.                 {
  164.                         SET_SPI_MOSI;
  165.                 }
  166.                 else
  167.                 {
  168.                         CLR_SPI_MOSI;
  169.                 }
  170.                 nop();nop();
  171.                 CLR_SPI_CK;nop();nop();
  172.                 SET_SPI_CK;nop();nop();
  173.                 SPIData <<= 1;
  174.         }                 
  175. }

  176. /////////////////////////////////////////////////////////////////////
  177. //功    能:读RC632寄存器
  178. //参数说明:Address[IN]:寄存器地址
  179. //返    回:读出的值
  180. /////////////////////////////////////////////////////////////////////
  181. unsigned char ReadRawRC(unsigned char Address)
  182. {
  183.         unsigned char ucAddr;
  184.     unsigned char ucResult=0;
  185.         CLR_SPI_CS;
  186.     ucAddr = ((Address<<1)&0x7E)|0x80;
  187.         SPIWriteByte(ucAddr);
  188.         ucResult=SPIReadByte();
  189.         SET_SPI_CS;
  190.         return ucResult;
  191. }

  192. /////////////////////////////////////////////////////////////////////
  193. //功    能:写RC632寄存器
  194. //参数说明:Address[IN]:寄存器地址
  195. //          value[IN]:写入的值
  196. /////////////////////////////////////////////////////////////////////
  197. void WriteRawRC(unsigned char Address, unsigned char value)
  198. {  
  199.     unsigned char ucAddr;

  200.         CLR_SPI_CS;
  201.     ucAddr = ((Address<<1)&0x7E);
  202.         SPIWriteByte(ucAddr);
  203.         SPIWriteByte(value);
  204.         SET_SPI_CS;
  205. }   

  206. /////////////////////////////////////////////////////////////////////
  207. //功    能:清RC522寄存器位
  208. //参数说明:reg[IN]:寄存器地址
  209. //          mask[IN]:清位值
  210. /////////////////////////////////////////////////////////////////////
  211. void ClearBitMask(unsigned char reg,unsigned char mask)  
  212. {
  213.     char tmp = 0x00;
  214.     tmp = ReadRawRC(reg);
  215.     WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  216. }


  217. /////////////////////////////////////////////////////////////////////
  218. //功    能:置RC522寄存器位
  219. //参数说明:reg[IN]:寄存器地址
  220. //          mask[IN]:置位值
  221. /////////////////////////////////////////////////////////////////////
  222. void SetBitMask(unsigned char reg,unsigned char mask)  
  223. {
  224.     char tmp = 0x00;
  225.     tmp = ReadRawRC(reg);
  226.     WriteRawRC(reg,tmp | mask);  // set bit mask
  227. }

  228. /////////////////////////////////////////////////////////////////////
  229. //用MF522计算CRC16函数
  230. /////////////////////////////////////////////////////////////////////
  231. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  232. {
  233.     unsigned char i,n;
  234.     ClearBitMask(DivIrqReg,0x04);
  235.     WriteRawRC(CommandReg,PCD_IDLE);
  236.     SetBitMask(FIFOLevelReg,0x80);
  237.     for (i=0; i<len; i++)
  238.     {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
  239.     WriteRawRC(CommandReg, PCD_CALCCRC);
  240.     i = 0xFF;
  241.     do
  242.     {
  243.         n = ReadRawRC(DivIrqReg);
  244.         i--;
  245.     }
  246.     while ((i!=0) && !(n&0x04));
  247.     pOutData[0] = ReadRawRC(CRCResultRegL);
  248.     pOutData[1] = ReadRawRC(CRCResultRegM);
  249. }

  250. /////////////////////////////////////////////////////////////////////
  251. //功    能:通过RC522和ISO14443卡通讯
  252. //参数说明:Command[IN]:RC522命令字
  253. //          pInData[IN]:通过RC522发送到卡片的数据
  254. //          InLenByte[IN]:发送数据的字节长度
  255. //          pOutData[OUT]:接收到的卡片返回数据
  256. //          *pOutLenBit[OUT]:返回数据的位长度
  257. /////////////////////////////////////////////////////////////////////
  258. char PcdComMF522(unsigned char Command,
  259.                  unsigned char *pInData,
  260.                  unsigned char InLenByte,
  261.                  unsigned char *pOutData,
  262.                  unsigned int *pOutLenBit)
  263. {
  264.     char status = MI_ERR;
  265.     unsigned char irqEn   = 0x00;
  266.     unsigned char waitFor = 0x00;
  267.     unsigned char lastBits;
  268.     unsigned char n;
  269.     unsigned int i;
  270.     switch (Command)
  271.     {
  272.         case PCD_AUTHENT:
  273.                         irqEn   = 0x12;
  274.                         waitFor = 0x10;
  275.                         break;
  276.                 case PCD_TRANSCEIVE:
  277.                         irqEn   = 0x77;
  278.                         waitFor = 0x30;
  279.                         break;
  280.                 default:
  281.                         break;
  282.     }

  283.     WriteRawRC(ComIEnReg,irqEn|0x80);
  284.     ClearBitMask(ComIrqReg,0x80);
  285.     WriteRawRC(CommandReg,PCD_IDLE);
  286.     SetBitMask(FIFOLevelReg,0x80);

  287.     for (i=0; i<InLenByte; i++)
  288.     {   
  289.                 WriteRawRC(FIFODataReg, pInData[i]);   
  290.         }
  291.     WriteRawRC(CommandReg, Command);

  292.     if (Command == PCD_TRANSCEIVE)
  293.     {   
  294.                 SetBitMask(BitFramingReg,0x80);  
  295.         }

  296.     //i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
  297.         i = 2000;
  298.     do
  299.     {
  300.         n = ReadRawRC(ComIrqReg);
  301.         i--;
  302.     }
  303.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  304.     ClearBitMask(BitFramingReg,0x80);

  305.     if (i!=0)
  306.     {   
  307.         if(!(ReadRawRC(ErrorReg)&0x1B))
  308.         {
  309.             status = MI_OK;
  310.             if (n & irqEn & 0x01)
  311.             {   status = MI_NOTAGERR;   }
  312.             if (Command == PCD_TRANSCEIVE)
  313.             {
  314.                        n = ReadRawRC(FIFOLevelReg);
  315.                       lastBits = ReadRawRC(ControlReg) & 0x07;
  316.                 if (lastBits)
  317.                 {   
  318.                                         *pOutLenBit = (n-1)*8 + lastBits;   
  319.                                 }
  320.                 else
  321.                 {   
  322.                                         *pOutLenBit = n*8;   
  323.                                 }
  324.                 if (n == 0)
  325.                 {   
  326.                                         n = 1;   
  327.                                 }
  328.                 if (n > MAXRLEN)
  329.                 {   
  330.                                         n = MAXRLEN;   
  331.                                 }
  332.                 for (i=0; i<n; i++)
  333.                 {   
  334.                                         pOutData[i] = ReadRawRC(FIFODataReg);   
  335.                                 }
  336.             }
  337.         }
  338.         else
  339.         {   
  340.                         status = MI_ERR;   
  341.                 }

  342.     }

  343.     SetBitMask(ControlReg,0x80);           // stop timer now
  344.     WriteRawRC(CommandReg,PCD_IDLE);
  345.     return status;
  346. }

  347. /////////////////////////////////////////////////////////////////////
  348. //功    能:寻卡
  349. //参数说明: req_code[IN]:寻卡方式
  350. //                0x52 = 寻感应区内所有符合14443A标准的卡
  351. //                0x26 = 寻未进入休眠状态的卡
  352. //          pTagType[OUT]:卡片类型代码
  353. //                0x4400 = Mifare_UltraLight
  354. //                0x0400 = Mifare_One(S50)
  355. //                0x0200 = Mifare_One(S70)
  356. //                0x0800 = Mifare_Pro(X)
  357. //                0x4403 = Mifare_DESFire
  358. //返    回: 成功返回MI_OK
  359. /////////////////////////////////////////////////////////////////////
  360. char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  361. {
  362.         char status;  
  363.         unsigned int unLen;
  364.         unsigned char ucComMF522Buf[MAXRLEN];

  365.         ClearBitMask(Status2Reg,0x08);
  366.         WriteRawRC(BitFramingReg,0x07);
  367.         SetBitMask(TxControlReg,0x03);

  368.         ucComMF522Buf[0] = req_code;

  369.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

  370.         if ((status == MI_OK) && (unLen == 0x10))
  371.         {   
  372.                 *pTagType     = ucComMF522Buf[0];
  373.                 *(pTagType+1) = ucComMF522Buf[1];
  374.         }
  375.         else
  376.         {   
  377.                 status = MI_ERR;   
  378.         }

  379.         return status;
  380. }


  381. /////////////////////////////////////////////////////////////////////
  382. //功    能:防冲撞
  383. //参数说明: pSnr[OUT]:卡片序列号,4字节
  384. //返    回: 成功返回MI_OK
  385. /////////////////////////////////////////////////////////////////////  
  386. char PcdAnticoll(unsigned char *pSnr)
  387. {
  388.     char status;
  389.     unsigned char i,snr_check=0;
  390.     unsigned int unLen;
  391.     unsigned char ucComMF522Buf[MAXRLEN];


  392.     ClearBitMask(Status2Reg,0x08);
  393.     WriteRawRC(BitFramingReg,0x00);
  394.     ClearBitMask(CollReg,0x80);

  395.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  396.     ucComMF522Buf[1] = 0x20;

  397.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

  398.     if (status == MI_OK)
  399.         {
  400.                 for (i=0; i<4; i++)
  401.                 {   
  402.                         *(pSnr+i)  = ucComMF522Buf[i];
  403.                         snr_check ^= ucComMF522Buf[i];
  404.                 }
  405.                 if (snr_check != ucComMF522Buf[i])
  406.                    {   
  407.                         status = MI_ERR;   
  408.                 }
  409.     }

  410.     SetBitMask(CollReg,0x80);
  411.     return status;
  412. }

  413. /////////////////////////////////////////////////////////////////////
  414. //功    能:选定卡片
  415. //参数说明: pSnr[IN]:卡片序列号,4字节
  416. //返    回: 成功返回MI_OK
  417. /////////////////////////////////////////////////////////////////////
  418. char PcdSelect(unsigned char *pSnr)
  419. {
  420.     char status;
  421.     unsigned char i;
  422.     unsigned int unLen;
  423.     unsigned char ucComMF522Buf[MAXRLEN];

  424.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  425.     ucComMF522Buf[1] = 0x70;
  426.     ucComMF522Buf[6] = 0;
  427.     for (i=0; i<4; i++)
  428.     {
  429.             ucComMF522Buf[i+2] = *(pSnr+i);
  430.             ucComMF522Buf[6]  ^= *(pSnr+i);
  431.     }
  432.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);

  433.     ClearBitMask(Status2Reg,0x08);

  434.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);

  435.     if ((status == MI_OK) && (unLen == 0x18))
  436.     {   
  437.                 status = MI_OK;  
  438.         }
  439.     else
  440.     {   
  441.                 status = MI_ERR;   
  442.         }

  443.     return status;
  444. }

  445. /////////////////////////////////////////////////////////////////////
  446. //功    能:验证卡片密码
  447. //参数说明: auth_mode[IN]: 密码验证模式
  448. //                 0x60 = 验证A密钥
  449. //                 0x61 = 验证B密钥
  450. //          addr[IN]:块地址
  451. //          pKey[IN]:密码
  452. //          pSnr[IN]:卡片序列号,4字节
  453. //返    回: 成功返回MI_OK
  454. /////////////////////////////////////////////////////////////////////               
  455. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  456. {
  457.     char status;
  458.     unsigned int unLen;
  459.     unsigned char ucComMF522Buf[MAXRLEN];

  460.     ucComMF522Buf[0] = auth_mode;
  461.     ucComMF522Buf[1] = addr;
  462.         memcpy(&ucComMF522Buf[2], pKey, 6);
  463.         memcpy(&ucComMF522Buf[8], pSnr, 6);

  464.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  465.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  466.     {   
  467.                 status = MI_ERR;   
  468.         }

  469.     return status;
  470. }

  471. /////////////////////////////////////////////////////////////////////
  472. //功    能:读取M1卡一块数据
  473. //参数说明: addr[IN]:块地址
  474. //          pData[OUT]:读出的数据,16字节
  475. //返    回: 成功返回MI_OK
  476. /////////////////////////////////////////////////////////////////////
  477. char PcdRead(unsigned char addr,unsigned char *pData)
  478. {
  479.     char status;
  480.     unsigned int unLen;
  481.     unsigned char ucComMF522Buf[MAXRLEN];

  482.     ucComMF522Buf[0] = PICC_READ;
  483.     ucComMF522Buf[1] = addr;
  484.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  485.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  486.     if ((status == MI_OK) && (unLen == 0x90))
  487.            {   
  488.                 memcpy(pData, ucComMF522Buf, 16);   
  489.         }
  490.     else
  491.     {   
  492.                 status = MI_ERR;   
  493.         }

  494.     return status;
  495. }

  496. /////////////////////////////////////////////////////////////////////
  497. //功    能:写数据到M1卡一块
  498. //参数说明: addr[IN]:块地址
  499. //          pData[IN]:写入的数据,16字节
  500. //返    回: 成功返回MI_OK
  501. /////////////////////////////////////////////////////////////////////                  
  502. char PcdWrite(unsigned char addr,unsigned char *pData)
  503. {
  504.     char status;
  505.     unsigned int unLen;
  506.     unsigned char ucComMF522Buf[MAXRLEN];

  507.     ucComMF522Buf[0] = PICC_WRITE;
  508.     ucComMF522Buf[1] = addr;
  509.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  510.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  511.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  512.     {   
  513.                 status = MI_ERR;   
  514.         }

  515.     if (status == MI_OK)
  516.     {
  517.         memcpy(ucComMF522Buf, pData, 16);
  518.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  519.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  520.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  521.         {   
  522.                         status = MI_ERR;   
  523.                 }
  524.     }

  525.     return status;
  526. }

  527. /////////////////////////////////////////////////////////////////////
  528. //功    能:命令卡片进入休眠状态
  529. //返    回: 成功返回MI_OK
  530. /////////////////////////////////////////////////////////////////////
  531. char PcdHalt(void)
  532. {
  533.     char status;
  534.     unsigned int unLen;
  535.     unsigned char ucComMF522Buf[MAXRLEN];

  536.     ucComMF522Buf[0] = PICC_HALT;
  537.     ucComMF522Buf[1] = 0;
  538.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  539.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  540.     return MI_OK;
  541. }

  542. /////////////////////////////////////////////////////////////////////
  543. //功    能:复位RC522
  544. //返    回: 成功返回MI_OK
  545. /////////////////////////////////////////////////////////////////////
  546. char PcdReset(void)
  547. {
  548.         SET_RC522RST;
  549.     delay_ns(10);
  550.         CLR_RC522RST;
  551.     delay_ns(10);
  552.         SET_RC522RST;
  553.     delay_ns(10);
  554.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  555.     delay_ns(10);

  556.     WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
  557.     WriteRawRC(TReloadRegL,30);           
  558.     WriteRawRC(TReloadRegH,0);
  559.     WriteRawRC(TModeReg,0x8D);
  560.     WriteRawRC(TPrescalerReg,0x3E);
  561.         
  562.         WriteRawRC(TxAutoReg,0x40);//必须要

  563.     return MI_OK;
  564. }
  565. //////////////////////////////////////////////////////////////////////
  566. //设置RC632的工作方式
  567. //////////////////////////////////////////////////////////////////////
  568. char M500PcdConfigISOType(unsigned char type)
  569. {
  570.    if (type == 'A')                     //ISO14443_A
  571.    {
  572.        ClearBitMask(Status2Reg,0x08);
  573.        WriteRawRC(ModeReg,0x3D);//3F
  574.        WriteRawRC(RxSelReg,0x86);//84
  575.        WriteRawRC(RFCfgReg,0x7F);   //4F
  576.               WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
  577.            WriteRawRC(TReloadRegH,0);
  578.        WriteRawRC(TModeReg,0x8D);
  579.            WriteRawRC(TPrescalerReg,0x3E);
  580.            delay_ns(1000);
  581.        PcdAntennaOn();
  582.    }
  583.    else{ return -1; }

  584.    return MI_OK;
  585. }

  586. /////////////////////////////////////////////////////////////////////
  587. //开启天线  
  588. //每次启动或关闭天险发射之间应至少有1ms的间隔
  589. /////////////////////////////////////////////////////////////////////
  590. void PcdAntennaOn(void)
  591. {
  592.     unsigned char i;
  593.     i = ReadRawRC(TxControlReg);
  594.     if (!(i & 0x03))
  595.     {
  596.         SetBitMask(TxControlReg, 0x03);
  597.     }
  598. }


  599. /////////////////////////////////////////////////////////////////////
  600. //关闭天线
  601. /////////////////////////////////////////////////////////////////////
  602. void PcdAntennaOff(void)
  603. {
  604.         ClearBitMask(TxControlReg, 0x03);
  605. }

  606. void init_rc522(void)
  607. {
  608.   PcdReset();
  609.   PcdAntennaOff();  
  610.   PcdAntennaOn();
  611.   M500PcdConfigISOType( 'A' );
  612. }


  613. <time.c>
  614. #include "reg52.h"
  615. #include "main.h"
  616. #include "uart.h"
  617. #include "ctrl.h"

  618. #define        TIME10MS        4
  619. #define        TIME80MS        6
  620. #define        TIME200MS        20

  621. INT16U UartWaitTime = 0, RequestCardTime = 0;        
  622. INT8U TimerTh0, TimerTl0;

  623. //TIMER1 initialize - prescale:8
  624. // desired value: 20mSec
  625. // actual value: 19.999mSec (0.0%)
  626. void init_timer(void)  //20ms
  627. {
  628.         TMOD = 0x21;         //定时器1自动重载  定时器0 普通16位计时

  629.         TH0 = (65535-20000)/256;//0x69;
  630.         TL0 = (65535-20000)%256; //0xFA;
  631.         ET0 = 1;
  632.         TR0 = 1;

  633.         TH1 = 256 - FOSC / 12 / 32 / BAUD;
  634.         TL1 = 256 - FOSC / 12 / 32 / BAUD;
  635.         TR1 = 1;
  636. }

  637. void  time0_routine(void) interrupt 1
  638. {
  639.   //TIMER1 has overflowed
  640.   //TMOD = 0x01;

  641.         TH0 = (65535-20000)/256;//0x69;
  642.         TL0 = (65535-20000)%256; //0xFA;

  643.         RequestCardTime ++;

  644.         if( ( ( UartWaitTime ++ ) >= TIME10MS ) && ( UartStart == TRUE ) )
  645.         {
  646.                 uart_over();
  647.         }                                    
  648. }

  649. void Delay_ms(int ms)         //延时xms
  650. {
  651.     unsigned int i,j;
  652.         for(i=ms;i>0;i--)
  653.            for(j=220;j>0;j--);
  654. }
复制代码
IMG_2313.JPG
IMG_2314.JPG
IMG_2315.JPG
IMG_2316.JPG
IMG_2317.JPG
回复

使用道具 举报

ID:96682 发表于 2021-12-9 06:25 来自手机 | 显示全部楼层
怎么板上的流水灯,数码管都还灰亮?
回复

使用道具 举报

ID:986464 发表于 2021-12-9 10:13 来自手机 | 显示全部楼层
wc86110 发表于 2021-12-9 06:25
怎么板上的流水灯,数码管都还灰亮?

那是因为买的开发板,他内部流水灯和数码管已经跟IO口内部连好了,本来自己焊了个开发板,但连lcd显示时很不稳定,然后就改用这种焊好了的开发板
回复

使用道具 举报

ID:986464 发表于 2021-12-9 13:42 | 显示全部楼层
自己在发现了错误后改了代码,主要是<ctr.c>错了错误,部分括号放错了位置以及显示错误提示时没有延时函数就被清屏了,改正后白屏和未放卡先显示Sucess和不可以返回的问题解决了,但又遇到了新的问题,一个是进入录卡模式后把复旦卡放在读卡器上没有反应,二是验证门禁密码或管理员密码显示成功后,显示了sucess但没有开门和不进入管理员模式
修正后的<ctrl.c>文件
  1. #include "reg52.h"
  2. #include "string.h"
  3. #include "main.h"
  4. #include "uart.h"  
  5. #include "rc522.h"
  6. #include "ctrl.h"
  7. #include "beep.h"
  8. #include "timer.h"
  9. #include "EEPROM.h"
  10. #include "key.h"
  11. #include "1206.h"
  12. #include "motor.h"
  13. INT8U states=15;//状态机
  14. unsigned char code READID[] = {"ID:"};
  15. INT8U Card_type[2],        //卡片类型
  16.       Card_SN[4]={0},//IC卡号
  17.           Card_SN_BUF[4]={0xff,0xff,0xff,0xff},//卡号登记缓冲区           
  18.           KEY_BUF[8]={'0','0','0','0','0','0','0','0'};
  19. INT8U AdminKEY_BUF[8]={'0','0','0','0','0','0','0','0'};
  20. INT8U bPass = 0; bWarn = 0;           
  21. //unsigned int ID_BUF[50];//可录50张卡
  22. //NT8U ID_buf[8];               
  23. void uart_over( void )        //串口数据还原
  24. {
  25.         UartCount = 0;
  26.         UartStart = FALSE;
  27.         UartComp = FALSE;
  28. }

  29. void pass( void )
  30. {
  31.    beep1();
  32.    Delay_ms(2000);//让卡片离开
  33. //   LED_BLINK_1();
  34. }

  35. void warn(void)
  36. {
  37.   beep2();
  38. }


  39. INT8U IC_READ( void )
  40. {
  41.     INT8U ID_ASC[8],i;
  42.         
  43.         if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节        
  44.         {
  45.                 if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节        
  46.                 {
  47.                   
  48.                         return FALSE;
  49.                 }        
  50.         }
  51.         
  52.         if( PcdAnticoll( Card_SN ) != MI_OK ) //防冲撞,返回卡的序列号 4字节
  53.         {

  54.                 bWarn = 1;
  55.                 return FALSE;        
  56.         }

  57.         bPass = 1;
  58.         send_bytes(Card_type,2);
  59.         send_bytes(Card_SN,4);
  60.         
  61.         for(i=0;i<4;i++) //卡ID号转化成ASCII
  62.         {
  63.           if(Card_SN[i]/16>9)        ID_ASC[i*2]=Card_SN[i]/16+'7';
  64.             else ID_ASC[i*2]=Card_SN[i]/16+'0';

  65.       if(Card_SN[i]%16>9)        ID_ASC[i*2+1]=Card_SN[i]%16+'7';
  66.             else ID_ASC[i*2+1]=Card_SN[i]%16+'0';
  67.         }
  68. //        display2(3,0,"ID: ",4); //显示卡号
  69. //        display2(3,2,ID_ASC,8);
  70.                 LCD1602_Write_Cmd(0x01); //清除显示
  71.                 LCD1602_Dis_Str(0, 0, &READID[0]);        
  72.                 LCD1602_Dis_Str(0, 1, &ID_ASC[0]);        
  73.         Delay_ms(500);
  74.         return TRUE;
  75. }

  76. //void buf_BUF()
  77. //{
  78. //        unsigned int ID_[50];
  79. //        
  80. //        for(int i=0;i<4;i++)
  81. //        {
  82. //                for(int j=0;j<50;j++)
  83. //                {
  84. //                        if(ID_BUF[j]!=0)
  85. //                        else
  86. //                        {
  87. //                                break;
  88. //                        }
  89. //                }
  90. //               
  91. //                ID_[i]=ID_buf[i]*
  92. //        }
  93. //}

  94. void ctrl_process( void )
  95. {                  
  96.    INT8U i,key_count,key_value=16,table[8]="--------";        
  97.         int j=1;
  98.         
  99.                 LCD1602_Write_Cmd(0x01); //清除显示
  100.                
  101.         
  102.         
  103.     switch(states)
  104.         {
  105.        case 0:                                 //IC卡读卡输入
  106.                                  while(j){
  107.                             LCD1602_Dis_Str(0, 0, &DIS0[0]);        
  108.                                           key_value=key_scan();         
  109.                                   if(key_value==10)
  110.                                    {                                 
  111.                                                   LCD1602_Write_Cmd(0x01); //清除显示
  112.                                                                         states=15;
  113.                          return;
  114.                                         }
  115.                       if(IC_READ())
  116.                           {
  117.                            j--;
  118.                                        
  119.                 if ((Card_SN[0]==Card_SN_BUF[0])
  120.                               &&(Card_SN[1]==Card_SN_BUF[1])
  121.                                   &&(Card_SN[2]==Card_SN_BUF[2])
  122.                                   &&(Card_SN[3]==Card_SN_BUF[3]))
  123.                                   {
  124.                                                 
  125.                                                 open();
  126.                                          LCD1602_Dis_Str(0, 1, &uctyes[0]);        
  127.                                         Delay_ms(1000);
  128.                               }
  129.                                   else          LCD1602_Dis_Str(0, 1, &uctno[0]);        
  130.                                         Delay_ms(1000);
  131.                            }
  132.                                 
  133.                                 
  134.                          }
  135.                                  LCD1602_Write_Cmd(0x01); //清除显示
  136.                                  states=15;
  137.                           break;

  138.         case 1:               
  139.                       LCD1602_Dis_Str(0, 0, &DIS7[0]);                                //密码输入
  140.                                  LCD1602_Dis_Str(0, 1, &table[0]);
  141.                            key_count=0;
  142.                while(1)
  143.                            {  
  144.                               key_value=key_scan();         
  145.                                   if(key_value==10)
  146.                                    {
  147.                                       LCD1602_Write_Cmd(0x01); //清除显示
  148.                                                                         states=15;
  149.                          return;
  150.                                         }                 
  151.                                   if(key_value>=0 && key_value <=9)//有按键输入
  152.                                   {                                                                                          
  153.                                         table[key_count++]=key_value+'0';
  154.                                          LCD1602_Dis_Str(0, 1, &table[0]);               
  155.                                   }
  156.                                  
  157.                                   if(key_value==11)//退格
  158.                                   {                                                                    
  159.                                         table[--key_count]='-';
  160.                                          LCD1602_Dis_Str(0, 1, &table[0]);                                
  161.                                   }

  162.                                   if(key_count==8)
  163.                                   {
  164.                                      if( table[0]==KEY_BUF[0] &&
  165.                                              table[1]==KEY_BUF[1] &&
  166.                                                   table[2]==KEY_BUF[2] &&
  167.                                                  table[3]==KEY_BUF[3] &&
  168.                                                  table[4]==KEY_BUF[4] &&
  169.                                                  table[5]==KEY_BUF[5] &&
  170.                                                  table[6]==KEY_BUF[6] &&
  171.                                                  table[7]==KEY_BUF[7] )          //密吗正确
  172.                                 
  173.                                      {
  174.                                            bPass=1;
  175. //                                           relay_ON();//灯开关
  176.                                                          open();
  177.                      LCD1602_Dis_Str(0, 1, &uctyes[0]);        
  178.                                           Delay_ms(1000);
  179.                                                          
  180.                                            break;                                 
  181.                                        
  182.                                          }
  183.                                           else          //密码错误
  184.                                           {        
  185.                                             
  186.                                                 bWarn=1;
  187.                                              LCD1602_Dis_Str(0, 1, &uctno[0]);
  188.                                                                 Delay_ms(1000);
  189.                                                  break;
  190.                                          }                                          
  191.                                   }

  192.                            }
  193.                                   LCD1602_Write_Cmd(0x01); //清除显示
  194.                                                                         states=15;
  195.                        break ;
  196.                   
  197.                  case 2:        
  198.                                         while(j){
  199.                        LCD1602_Dis_Str(0, 0, &DIS1[0]);//IC卡登记
  200.                                                  key_value=key_scan();        
  201.                                                  if(key_value==10)
  202.                                    {                                 
  203.                                                   LCD1602_Write_Cmd(0x01); //清除显示
  204.                                                                         states=15;
  205.                          return;
  206.                                         }
  207.                    if(IC_READ())  
  208.                            {
  209.                                          j--;
  210.                                           beep1();
  211.                                   LCD1602_Dis_Str(0, 1, &uctyes[0]);
  212.                                                 Delay_ms(2000);
  213.                             for(i=0;i<4;i++)
  214.                             Card_SN_BUF[i] = Card_SN[i];

  215.                                 EEPROM_WRITE(0,Card_SN,4);//写入EEPROM
  216.                            }
  217.                                  
  218.                                  
  219.                          }
  220.                                         LCD1602_Write_Cmd(0x01); //清除显示
  221.                                         states=15;
  222.                        break ;

  223.                  case 3:                //门禁密码设置
  224.                       LCD1602_Dis_Str(0, 0, &DIS2[0]);
  225.                                         LCD1602_Dis_Str(0, 1, &table[0]);
  226.                            key_count=0;
  227.                            while(1)
  228.                            {  
  229.                               key_value=key_scan();         
  230.                                   if(key_value==10)
  231.                                    {                                 
  232.                                                  LCD1602_Write_Cmd(0x01); //清除显示
  233.                                                                         states=15;
  234.                          return;
  235.                                         }
  236.                         
  237.                               if(key_value>=0 && key_value <=9)//有按键输入
  238.                                   {                                                                                          
  239.                                         table[key_count++]=key_value+'0';
  240.                                         LCD1602_Dis_Str(0, 1, &table[0]);                        
  241.                                   }
  242.                                  
  243.                                   if(key_value==11)//退格
  244.                                   {                                                                    
  245.                                         table[--key_count]='-';
  246.                                         LCD1602_Dis_Str(0, 1, &table[0]);                                
  247.                                   }

  248.                                    if(key_count==8) //按下确定键
  249.                                  
  250.                                   {
  251.                                  
  252.                                     for(i=0;i<8;i++)
  253.                                      KEY_BUF[i]=table[i];        
  254.                                             EEPROM_WRITE(7,KEY_BUF,8);//写入EEPROM
  255.                                                 LCD1602_Write_Cmd(0x01); //清除显示
  256.                                                  LCD1602_Dis_Str(0, 0, &uctyes[0]);
  257.                                                 Delay_ms(2000);        
  258.                                                 states=15;
  259.                                    break;
  260.                                    }
  261.                 }
  262.                                         LCD1602_Write_Cmd(0x01); //清除显示
  263.                                 states=15;
  264.                        break ;
  265.                  case 4:                                //管理员密码设置
  266.                          LCD1602_Dis_Str(0, 0, &DIS4[0]);
  267.                                  LCD1602_Dis_Str(0, 1, &table[0]);
  268.                            key_count=0;
  269.                            while(1)
  270.                            {  
  271.                               key_value=key_scan();         
  272.                                   if(key_value==10)
  273.                                    {
  274.                                                                         LCD1602_Write_Cmd(0x01); //清除显示
  275.                                                                          states=15;
  276.                          return;
  277.                                         }
  278.                         
  279.                               if(key_value>=0 && key_value <=9)//有按键输入
  280.                                   {                                                                                          
  281.                                         table[key_count++]=key_value+'0';
  282.                                         LCD1602_Dis_Str(0, 1, &table[0]);                        
  283.                                   }
  284.                                  
  285.                                   if(key_value==11)//退格
  286.                                   {                                                                    
  287.                                         table[--key_count]='-';
  288.                                         LCD1602_Dis_Str(0, 1, &table[0]);                                
  289.                                   }

  290.                                    if(key_count==8) //按下确定键
  291.                                  
  292.                                   {
  293.                                  
  294.                                     for(i=0;i<8;i++)
  295.                                      AdminKEY_BUF[i]=table[i];        
  296.                                             EEPROM_WRITE(5,AdminKEY_BUF,6);//写入EEPROM
  297.                                                 LCD1602_Write_Cmd(0x01); //清除显示
  298.                                                  LCD1602_Dis_Str(0, 0, &uctyes[0]);
  299.                                                 Delay_ms(2000);        
  300.                                                 
  301.                                    break;
  302.                                    }
  303.                 }                          
  304.                                 states=15;
  305.                                         LCD1602_Write_Cmd(0x01); //清除显示
  306.                        break ;
  307.                           case 5:                //管理员密码验证
  308.                        LCD1602_Dis_Str(0, 0, &DIS6[0]);  
  309.                            LCD1602_Dis_Str(0, 1, &table[0]);
  310.                            key_count=0;
  311.                while(1)
  312.                            {  
  313.                               key_value=key_scan();         
  314.                                   if(key_value==10)
  315.                                    {
  316.                                                          LCD1602_Write_Cmd(0x01); //清除显示
  317.                                      states=15;
  318.                          return;
  319.                                         }


  320.                                   if(key_value>=0 && key_value <=9)//有按键输入
  321.                                   {                                                                                          
  322.                                         table[key_count++]=key_value+'0';
  323.                                          LCD1602_Dis_Str(0, 1, &table[0]);               
  324.                                   }
  325.                                  
  326.                                   if(key_value==11)//退格
  327.                                   {                                                                    
  328.                                         table[--key_count]='-';
  329.                                         LCD1602_Dis_Str(0, 1, &table[0]);                                
  330.                                   }

  331.                                   if(key_count==8)
  332.                                   {
  333.                                      if( table[0]==AdminKEY_BUF[0] &&
  334.                                              table[1]==AdminKEY_BUF[1] &&
  335.                                                   table[2]==AdminKEY_BUF[2] &&
  336.                                                  table[3]==AdminKEY_BUF[3] &&
  337.                                                  table[4]==AdminKEY_BUF[4] &&
  338.                                                  table[5]==AdminKEY_BUF[5] &&
  339.                                                  table[6]==AdminKEY_BUF[6] &&
  340.                                                  table[7]==AdminKEY_BUF[7] )          //密吗正确
  341.                                 
  342.                                      {
  343.                                            bPass=1;
  344.                                                          
  345.                       LCD1602_Dis_Str(0, 1, &uctyes[0]);
  346.                                                                                 Delay_ms(1000);
  347.                                                          AL--;//进入管理员模式
  348.                                           
  349.                                            break;                                 
  350.                                        
  351.                                          }
  352.                                           else          //密码错误
  353.                                           {        
  354.                                             
  355.                                                 
  356.                                                 bWarn=1;
  357.                                             LCD1602_Dis_Str(0, 1, &uctno[0]);
  358.                                                                 Delay_ms(1000);
  359.                                                  break;
  360.                                          }                                          
  361.                                   }

  362.                            }
  363.                                          LCD1602_Write_Cmd(0x01); //清除显示
  364.                                      states=15;
  365.                        break ;
  366.                                 
  367.                 default : break;

  368.          }        //switch                  

  369.         if( bPass )                 //处理成功
  370.         {
  371.                 bPass = 0;
  372.                 pass();        
  373.         
  374.         }

  375.         if( bWarn )             //处理失败
  376.         {
  377.                 bWarn = 0;
  378.                 warn();
  379.         }

  380. }
复制代码


<main.c>
  1. #include "reg52.h"
  2. #include "main.h"
  3. #include "uart.h"
  4. #include "timer.h"
  5. #include "rc522.h"
  6. #include "ctrl.h"
  7. #include "motor.h"

  8. #include "beep.h"
  9. #include "key.h"  
  10. #include "EEPROM.h"
  11. #include "1206.h"
  12. int count=1;//全局变量,1代表管理员模式
  13. unsigned int AL=1;
  14. //sbit P14=P1^4;
  15. //sbit P15=P1^5;
  16. //sbit P16=P1^6;
  17. //sbit P17=P1^7;
  18. //sbit P30=P3^0;
  19. //sbit P31=P3^1;
  20. void init_all(void)        //初始化
  21. {
  22.         EA = 0;              //关总中断                 
  23.         init_timer(); //定时器初始化
  24.         init_uart();  //串口初始化
  25.         init_rc522(); //RC522初始化        
  26.         Init_LCD1602();//1602初始化
  27.         EEPROM_READ(0,Card_SN_BUF,4);//EEPROM初始化,取出记录的卡号  
  28.         EEPROM_READ(7,KEY_BUF,8);//EEPROM初始化,取出记录的密码
  29.         EEPROM_READ(5,AdminKEY_BUF,6);
  30.         send_bytes(Card_SN_BUF,4);
  31.         EA = 1;                  //开总中断
  32. }
  33. //void keyinit()
  34. //{
  35. //        P14=1;
  36. //        P15=1;
  37. //        P16=1;
  38. //        P17=1;
  39. //        P30=1;
  40. //        P31=1;
  41. //        
  42. //}
  43. void main(void)          //主函数
  44. {        
  45.         INT8U key;
  46.         int i=1;
  47.         beep=0;
  48.     Delay_ms(50); //让硬件稳定
  49.         init_all();           //执行初始化函数
  50.         beep1();           //beep test         

  51. //        keyinit();
  52.         while(1)
  53.         {
  54. //           key=key_scan(); //按键操作
  55.                 if(i==0)
  56.                         {
  57.                                 i=1;
  58.                         }
  59.                         if(AL==0)
  60.                         {
  61.                                 AL=1;
  62.                         }
  63.                 if(count)
  64.                         {
  65.                                 while(i)
  66.                                 {
  67.                                 
  68.                                 LCD1602_Dis_Str(0, 0, &DIS3[0]);        
  69.                                 LCD1602_Dis_Str(0, 1, &DIS5[0]);
  70.                                 key=key_scan(); //按键操作
  71.                                 
  72.                                 if(key==1||key==2||key==3||key==10)
  73.                                         {
  74.                                                 switch(key)
  75.                                                                         {
  76.                                                                                 case 0: break;
  77.                                                                                 case 1: states=4;//设管理员密码
  78.                                                                                                                 break;
  79.                                                                                 case 2: states=2;//录卡
  80.                                                                                                                 break;
  81.                                                                                 case 3: states=3;//设门禁密码
  82.                                                                                                                 break;
  83.                                                                                 case 10: i--;//返回到用户模式
  84.                                                                                                                 break;
  85.                                                                         }
  86.                                                 
  87.                                                 ctrl_process(); //进入RC522操作
  88.                                         }
  89.                                        
  90.                                 }
  91.                                 count--;//退出管理员模式
  92.                         }
  93.                         if(count!=1)//用户模式
  94.                         {
  95.                                 LCD1602_Write_Cmd(0x01); //清除显示
  96.                                 
  97.                                 while(AL)
  98.                                 {
  99.                                 LCD1602_Dis_Str(0, 0, &uct[0]);        
  100.                                 LCD1602_Dis_Str(0, 1, &INI1[0]);
  101.                                 LCD1602_Dis_Str(6, 1, &INI2[0]);
  102.                                 LCD1602_Dis_Str(12, 1, &INI3[0]);
  103.                                 key=key_scan(); //按键操作
  104.                                 
  105.                                 if(key==1||key==2||key==3)
  106.                                         {
  107.                                                 switch(key)
  108.                                                                         {
  109.                                                                                 case 0: break;
  110.                                                                                 case 1: states=1;//密码开门
  111.                                                                                                                 break;
  112.                                                                                 case 2: states=0;//刷卡开门
  113.                                                                                                                 break;
  114.                                                                                 case 3: states=5;//管理员模式验证
  115.                                                                                                                 break;
  116.                                                                                 
  117.                                                                         }
  118.                                                 
  119.                                                 ctrl_process(); //进入RC522操作
  120.                                         }
  121.                                        
  122.                         }
  123.                                 count++;
  124.                 }
  125.         }        
  126. }  
复制代码


<main.h>
  1. #ifndef  __main_h__
  2. #define  __main_h__

  3. typedef        unsigned char        BOOLEAN;
  4. typedef        unsigned char        INT8U;
  5. typedef        signed char                INT8S;
  6. typedef        unsigned int        INT16U;
  7. typedef        signed int                INT16S;
  8. typedef        unsigned long          INT32U;
  9. typedef        signed long            INT32S;

  10. #define        FOSC        22118400L//11059200L
  11. #define        BAUD        9600

  12. #define        FALSE        0
  13. #define        TRUE        1

  14. #define        WR                0
  15. #define        RD                1

  16. #define nop() _nop_()

  17. #define        BIT(n)        ( 1 << n )

  18. /******************
  19. UartCmdLen:UartCmd + UartErrCode
  20. UartDataLen:UartDataBuf
  21. *******************/

  22. typedef struct __sUartData
  23. {
  24.         INT8U UartCmdLen;  //命令长度
  25.         INT8U UartDataLen; //数据长度
  26.         INT16U UartCmd;
  27.         INT8U  UartErrCode;
  28.         INT8U  UartDataBuf[1];
  29. } *psUartData;

  30. #define        LED_NONE        0
  31. #define        LED_LONG        1
  32. #define        LED_200MS        2
  33. #define        LED_80MS        3
  34. extern unsigned int AL;

  35. #endif
复制代码


步进电机
<motor.c>
  1. /*******************************************************
  2. ULN2003驱动5V减速步进电机程序
  3. Target:STC89C52RC-40C
  4. Crystal:12MHz
  5. Author:战神单片机工作室
  6. Platform:51&avr单片机最小系统板+ULN2003步进电机驱动套件
  7. *******************************************************
  8. 接线方式:
  9. IN1 ---- P00
  10. IN2 ---- P01
  11. IN3 ---- P02
  12. IN4 ---- P03
  13. +   ---- +5V
  14. -   ---- GND
  15. *********************/
  16. #include<reg52.h>
  17. #define uchar unsigned char
  18. #define uint  unsigned int
  19. #define MotorData P1                   //步进电机控制接口定义
  20. uchar phasecw[4] ={0xF8,0xF4,0xF2,0xF1};//正转 电机导通相序 D-C-B-A
  21. uchar phaseccw[4]={0xF1,0xF2,0xF4,0xF8};//反转 电机导通相序 A-B-C-D
  22. //ms延时函数
  23. //sbit k1=P1^4;
  24. //sbit k2=P1^6;
  25. void Delay_xms(uint x)
  26. {
  27. uint i,j;
  28. for(i=0;i<x;i++)
  29.   for(j=0;j<112;j++);
  30. }
  31. //顺时针转动
  32. void MotorCW(void)
  33. {
  34. uchar i;
  35. for(i=0;i<4;i++)
  36.   {
  37.    MotorData=phasecw[i];
  38.    Delay_xms(2);//转速调节
  39.   }
  40. }
  41. //逆时针转动
  42. void MotorCCW(void)
  43. {
  44. uchar i;
  45. for(i=0;i<4;i++)
  46.   {
  47.    MotorData=phaseccw[i];
  48.    Delay_xms(2);//转速调节
  49.   }
  50. }
  51. //停止转动
  52. void MotorStop(void)
  53. {
  54. MotorData=0xF0;
  55. }
  56. void open()
  57. {
  58.         uint i;
  59.          for(i=0;i<500;i++)
  60.   {
  61.    MotorCW();   //顺时针转动
  62.   }
  63.   MotorStop();  //停止转动
  64.   Delay_xms(500);
  65.   for(i=0;i<500;i++)
  66.   {
  67.    MotorCCW();  //逆时针转动
  68.   }
  69.   MotorStop();  //停止转动
  70.   Delay_xms(500);

  71. }
复制代码

录卡没有反应

录卡没有反应

管理员密码验证成功后不进入管理员模式,而是等一会儿又显用户模式示,另外密码验证成功后没有开门

管理员密码验证成功后不进入管理员模式,而是等一会儿又显用户模式示,另外密码验证成功后没有开门
回复

使用道具 举报

ID:986464 发表于 2021-12-9 14:03 | 显示全部楼层
开门不了应该是P1口驱动电流小,之前测试时用的是P0口,换了个口驱动模块灯亮了很多
回复

使用道具 举报

ID:624769 发表于 2021-12-9 14:17 | 显示全部楼层
写卡后,回读一次,数据核对 吻合,再提示写卡成功,反之提示失败。
回复

使用道具 举报

ID:986464 发表于 2021-12-9 15:45 来自手机 | 显示全部楼层
188610329 发表于 2021-12-9 14:17
写卡后,回读一次,数据核对 吻合,再提示写卡成功,反之提示失败。

修改了代码后,这些问题已经解决了,现在主要问题是录卡或则读卡时读卡程序返还不了MI_OK然后后续操作也无法进行,放了卡没反应
回复

使用道具 举报

ID:844772 发表于 2021-12-9 16:53 | 显示全部楼层
我就是觉得,如果不插上522,159行会返回0,那196行  ucResult=SPIReadByte(); 也返回0;327行  ReadRawRC(ErrorReg)==0时,status = MI_OK; 那返回了MI_OK,岂不就是读卡成功了。所以第一个问题在327行。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:844772 发表于 2021-12-9 17:06 | 显示全部楼层
又是个小错误啊,MotorData=phasecw; 忘记加[i]了吧。
回复

使用道具 举报

ID:986464 发表于 2021-12-10 03:05 | 显示全部楼层
glinfei 发表于 2021-12-9 16:53
我就是觉得,如果不插上522,159行会返回0,那196行  ucResult=SPIReadByte(); 也返回0;327行  ReadRawRC( ...

这里我特意对照了rc522卖家给的源rc522.c程序,不是那里的问题,那里与原厂程序一样这样给的
回复

使用道具 举报

ID:986464 发表于 2021-12-10 03:09 | 显示全部楼层
glinfei 发表于 2021-12-9 17:06
又是个小错误啊,MotorData=phasecw; 忘记加了吧。

这里应该是少粘了我的程序,我先加了10k上拉电阻发现还是驱不动改成1k后验证密码后就能驱动了就是转的比较慢
回复

使用道具 举报

ID:791181 发表于 2022-5-7 15:32 | 显示全部楼层
IRQ引脚不用接线吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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