久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2660|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日操操 | 国产99久久 | 精品国产一区二区三区日日嗨 | 久久精品久久综合 | 亚洲欧美激情国产综合久久久 | 日韩在线小视频 | 日本免费黄色 | 国产亚洲一区二区三区 | 欧美日韩国产高清 | 精品一区二区三区四区五区 | 91精品国产色综合久久 | 一区观看 | 99在线免费视频 | 日日人人 | 国产精品一区二 | 激情婷婷成人 | 欧美在线色 | 久久久久久久久91 | 成人在线精品 | 视频一区 国产精品 | 成人在线不卡 | 天天躁日日躁狠狠躁2018小说 | 一级黄色片在线看 | av在线三级 | 欧洲精品码一区二区三区免费看 | 国产精品久久国产精品 | 国产欧美一区二区三区在线播放 | 黄色毛片在线播放 | 久久激情视频 | 精品国产欧美在线 | 久久久一区二区三区 | 精品熟人一区二区三区四区 | 亚洲一区中文字幕 | 中文字幕不卡在线观看 | 日本超碰 | 天天射网站 | 四虎影院美女 | 一区在线视频 | 婷婷色在线 | 一区二区三区四区在线 | 日韩欧美精品在线 |