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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4625|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

兆訊1608 RFID芯片N12_SDK_STC_V1.8.0 RC523單片機(jī)源碼下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
非接芯片驅(qū)動(dòng)程序
N12_SDK_STC_V1.8.0-MH523



單片機(jī)源程序如下:
  1. /**
  2. ****************************************************************
  3. * @file main.c
  4. *
  5. * @brief  main entry of test.
  6. *
  7. * @author
  8. *
  9. *
  10. ****************************************************************
  11. */

  12. /*
  13. * INCLUDE FILES
  14. ****************************************************************
  15. */
  16. #include "define.h"

  17. #include<stdlib.h>
  18. #include<stdio.h>
  19. #include<string.h>

  20. #include "stc_new_8051.h"
  21. #include "spi.h"
  22. #include "uart.h"
  23. #include "timer.h"

  24. #include "mh523.h"

  25. #include "rfid.h"
  26. #include "iso14443_4.h"
  27. #include "iso14443a.h"


  28. #define COM_BUF_SIZE 50
  29. #define HEAD 0x68



  30. typedef struct r_w_reg_s
  31. {
  32.         u8 addr;//讀寫的寄存器地址
  33.         u8 rw_dat;//讀寫的寄存器值
  34. }r_w_reg;

  35. typedef struct pc_tx_pkt_s
  36. {
  37.         u8 head;//包頭
  38.         u8 len; //包長(zhǎng):從包頭到校驗(yàn)和
  39.         u8 cmd;        //包命令

  40.         union datu
  41.         {
  42.                 r_w_reg reg;
  43.                 u8 dat[1];//發(fā)送或接收的數(shù)據(jù)
  44.         }datu;
  45. }pc_tx_pkt;

  46. typedef struct lpcd_config_s
  47. {
  48.         u8 delta;
  49.         u32 t_inactivity_ms;
  50.         u8 skip_times;
  51.         u8 t_detect_us;
  52. }lpcd_config_t;

  53. lpcd_config_t XDATA g_lpcd_config;
  54. static u8 XDATA com_tx_buf[ COM_BUF_SIZE ];//pc to stc
  55. static u16 tx_buf_index = 0;
  56. static U8 xdata Snr_RC500[4];

  57. #if (POWERON_POLLING)
  58.         bit g_query_mode = 1; //手動(dòng)操作芯片模式
  59.         bit g_typa_poll = TRUE;
  60.         bit g_typb_poll = TRUE;
  61.         bit g_need_reconfig = TRUE;//需要重新初始化PCD的協(xié)議類型
  62. #else
  63.         bit g_query_mode = 0; //手動(dòng)操作芯片模式
  64.         bit g_typa_poll = FALSE;
  65.         bit g_typb_poll = FALSE;
  66.         bit g_need_reconfig = FALSE;//需要重新初始化PCD的協(xié)議類型
  67. #endif

  68. u32 XDATA g_polling_cnt = 0;
  69. bit g_lpcd_started = FALSE; //LPCD周期自動(dòng)探測(cè)卡功能是否開啟
  70. bit g_lpcd_config_test_start = FALSE;//LPCD周期自動(dòng)探測(cè)卡功能是否開啟
  71. pc_tx_pkt XDATA *recv_packet(void);
  72. char prase_packet(pc_tx_pkt XDATA *ppkt);
  73. void discard_pc_pkt(pc_tx_pkt XDATA *ppkt);






  74. u8 check_sum(u8 XDATA *buf, int len)
  75. {
  76.         u8 sum = 0;

  77.         while (len--)
  78.                 sum += *buf++;

  79.         return sum;
  80. }

  81. void make_packet(u8 cmd, u8 *buf, u8 len)
  82. {
  83.         u8 sum = 0;

  84.         sum += HEAD;
  85.         sendc(HEAD);
  86.         sum += len + 4;
  87.         sendc(len + 4);        
  88.         sum += cmd;
  89.         sendc(cmd);

  90.         while (len--)
  91.         {
  92.                 sendc(*buf);
  93.                 sum += *buf++;
  94.         }
  95.         sendc(sum);
  96. }

  97. pc_tx_pkt XDATA *        recv_packet(void)
  98. {
  99.         pc_tx_pkt *XDATA ppkt;
  100.         
  101.         while(get_bytes() && tx_buf_index < COM_BUF_SIZE )
  102.         {
  103.                 com_tx_buf[tx_buf_index] = _getkey() ;
  104.                 tx_buf_index++;
  105.         }
  106.         if ( tx_buf_index >= 4 )
  107.         {
  108.                 u8 i;
  109.                 u8 rest = 4;
  110.                
  111.                 for (i=0; i<tx_buf_index-3; )//
  112.                 {
  113.                         ppkt = (pc_tx_pkt *)(com_tx_buf + i);
  114.                         if (ppkt->head == 0x68 && ppkt->len > 0
  115.                                 && ppkt->len + i < COM_BUF_SIZE)//判斷是不是能接受完包
  116.                         {
  117.                                 
  118.                                 if (ppkt->len + i <= tx_buf_index)//判斷該包有沒(méi)有接受完包?
  119.                                 {
  120.                                         u8 sum = check_sum((u8 XDATA *)ppkt, ppkt->len - 1);
  121.                                        
  122.                                         if (sum == ppkt->datu.dat[ppkt->len - 4] )
  123.                                         {        
  124.                                                 return ppkt;
  125.                                         }
  126.                                         else
  127.                                         {
  128.                                                 i++;
  129.                                         }
  130.                                 }
  131.                                 else
  132.                                 {
  133.                                          rest = tx_buf_index - i;
  134.                                          break;
  135.                                 }
  136.                         }
  137.                         else
  138.                         {
  139.                                 i++;
  140.                         }
  141.                 }
  142.                 memmove(com_tx_buf, com_tx_buf + tx_buf_index - rest, rest);
  143.                 tx_buf_index = rest;
  144.         }                        

  145.         return NULL;
  146. }

  147. char prase_packet(pc_tx_pkt XDATA *ppkt)
  148. {
  149.         switch(ppkt->cmd)
  150.         {
  151.                 case COM_PKT_CMD_READ_REG:        //要求把地址和值都返回給pc
  152.                 {
  153.                         r_w_reg XDATA reg;                        
  154.                         reg.addr = ppkt->datu.reg.addr;
  155.                         reg.rw_dat = read_reg(ppkt->datu.reg.addr);               
  156.                                 
  157.                         make_packet(COM_PKT_CMD_READ_REG, (u8 *)®, sizeof(reg));
  158.                         break;
  159.                 }
  160.                
  161.                 case COM_PKT_CMD_WRITE_REG:
  162.                 {               
  163.                         write_reg(ppkt->datu.reg.addr, ppkt->datu.reg.rw_dat);
  164.                         break;
  165.                 }

  166.                 case COM_PKT_CMD_QUERY_MODE:
  167.                 {
  168.                         if (ppkt->datu.dat[0] == 1)
  169.                         {
  170.                                 g_query_mode = TRUE;
  171.                                 if (ppkt->datu.dat[1] == 1)
  172.                                 {//typeA poll
  173.                                         pcd_config('A');
  174.                                         g_typa_poll = TRUE;
  175.                                 }
  176.                                 else
  177.                                 {
  178.                                         g_typa_poll = FALSE;
  179.                                 }
  180.                                 if (ppkt->datu.dat[2] == 1)
  181.                                 {//typeB poll
  182.                                         pcd_config('B');
  183.                                         g_typb_poll = TRUE;
  184.                                 }
  185.                                 else
  186.                                 {
  187.                                         g_typb_poll = FALSE;
  188.                                 }
  189.                                 if (g_typa_poll && g_typb_poll)
  190.                                 {
  191.                                         g_need_reconfig = TRUE;
  192.                                 }
  193.                                 else
  194.                                 {
  195.                                         g_need_reconfig = FALSE;
  196.                                 }
  197.                                 g_polling_cnt = *((u32*)&ppkt->datu.dat[3]);
  198.                                 printf("g_polling_cnt=%lu\n", g_polling_cnt);
  199.                         }
  200.                         else
  201.                         {
  202.                                 g_query_mode = FALSE;
  203.                         }

  204.                         break;
  205.                 }
  206.                 case COM_PKT_CMD_CHIP_RESET:
  207.                 {
  208.                         pcd_reset();
  209.                         mdelay(7);//carrier off 7ms
  210.                         pcd_antenna_on();
  211.                 break;
  212.                 }
  213.                 case COM_PKT_CMD_HALT:
  214.                 {
  215.                         pcd_hlta();
  216.                         printf("HltA\n");
  217.                          break;
  218.                 }
  219.                 case COM_PKT_CMD_LPCD:
  220.                 {
  221.                         g_lpcd_started = TRUE;
  222.                         pcd_lpcd_start();
  223.                         break;
  224.                 }
  225.                 case COM_PKT_CMD_LPCD_CONFIG_TEST:
  226.                 {
  227.                         int XDATA z;
  228.                         memcpy(&g_lpcd_config, &ppkt->datu.dat[0], sizeof(g_lpcd_config));
  229.                         for (z = 0; z < sizeof(g_lpcd_config);z++)
  230.                         {
  231.                                 printf(" %02x", ppkt->datu.dat[z]);
  232.                         }
  233.                         pcd_lpcd_config_start(g_lpcd_config.delta, g_lpcd_config.t_inactivity_ms, g_lpcd_config.skip_times, g_lpcd_config.t_detect_us);        
  234.                         printf("config=%bd,%lu,%bd,%bd\n",g_lpcd_config.delta, g_lpcd_config.t_inactivity_ms, g_lpcd_config.skip_times, g_lpcd_config.t_detect_us);
  235.                         g_lpcd_config_test_start = TRUE;
  236.                         break;
  237.                 }
  238.                 case COM_PKT_CMD_LPCD_CONFIG_TEST_STOP:
  239.                 {
  240.                         pcd_lpcd_end();
  241.                         g_lpcd_config_test_start = FALSE;
  242.                         break;
  243.                 }
  244.         
  245.                 default:
  246.                         return FALSE;
  247.                         //break;
  248.         }
  249.         return TRUE;
  250. }


  251. void discard_pc_pkt(pc_tx_pkt XDATA *ppkt)
  252. {
  253.         int bytes;
  254.         u8 XDATA *p = ((u8 XDATA *)ppkt) + ppkt->len;

  255.         bytes = (p - com_tx_buf);
  256.         if (bytes <= tx_buf_index)
  257.         {
  258.                 memmove(com_tx_buf, com_tx_buf + bytes, tx_buf_index - bytes);
  259.                 tx_buf_index -= bytes;
  260.         }
  261.         else
  262.         {
  263.                 tx_buf_index = 0;
  264.         }
  265. }




  266. void main()
  267. {
  268.         pc_tx_pkt XDATA *ppkt;
  269.         tick XDATA g_statistic_last_t = 0;
  270.         u8 XDATA status;

  271.         //復(fù)位鍵下載功能支持代碼
  272.     if((PCON&0x10)==0) //如果POF位=0
  273.     {
  274.        PCON=PCON|0x10;  //將POF位置1
  275.        IAP_CONTR=0x60;  //軟復(fù)位,從ISP監(jiān)控區(qū)啟動(dòng)
  276.     }
  277.     else
  278.     {
  279.        PCON=PCON&0xef;  //將POF位清零
  280.     }

  281.         led_success_on();
  282.         led_fail_on();
  283.         
  284.         init_uart();
  285.         init_timer0();
  286.         EA = 1;
  287.         init_spi();
  288.         EA = 1;
  289.         
  290.         printf("NFC_SDK_STC_V%s start...\n", VERSION);
  291.         
  292.         pcd_init();//初始化pcd寄存器
  293.         rfid_init();//初始化rfid本地變量

  294.         while(1)
  295.         {
  296.                
  297.                 ppkt = recv_packet();
  298.                 if (ppkt)
  299.                 {
  300.                         //檢查是否是調(diào)試命令包
  301.                         if (FALSE == prase_packet(ppkt))
  302.                         {
  303.                                 //RFID命令包
  304.                                 rfid_operation(&ppkt->cmd);
  305.                         }
  306.                         discard_pc_pkt(ppkt);
  307.                 }

  308.                 //自動(dòng)輪詢尋卡模式
  309.                 if (g_query_mode && (g_typa_poll || g_typb_poll))
  310.                 {
  311.                         u8 cmd[2];
  312.                         u8 status_a = 1, status_b = 1;

  313.                         pcd_antenna_off();
  314.                         mdelay(10);
  315.                         pcd_antenna_on();
  316.                         mdelay(10);
  317.                         
  318.                         if (g_typa_poll == TRUE)
  319.                         {
  320.                                 if (g_typa_poll & g_typb_poll)
  321.                                 {
  322.                                         pcd_config('A');
  323.                                 }
  324.                                 cmd[1] = 0x52;

  325.                                 //pcd_default_info();
  326.                                        
  327.                                 status_a = com_reqa(&cmd);//詢所有A卡                                
  328.                         }
  329.                
  330.                         if (g_typb_poll == TRUE)
  331.                         {        
  332.                                 if (g_typa_poll & g_typb_poll)
  333.                                 {
  334.                                         pcd_config('B');
  335.                                 }                        
  336.                                 cmd[1] = 0x08;
  337.                                 status_b = com_reqb(&cmd);//詢所有B卡
  338.                         }
  339.                
  340.                         //點(diǎn)亮對(duì)應(yīng)燈
  341.                         if (status_a == MI_OK || status_b == MI_OK)
  342.                         {
  343.                                 led_success_on();//成功
  344.                         }
  345.                         else
  346.                         {
  347.                                 led_fail_on();//失敗
  348.                         }
  349.                
  350.                 }

  351.                 //cos指令輪詢操作
  352.                 if (g_cos_loop == TRUE)
  353.                 {
  354.                         if (g_cos_loop_times > 0)
  355.                         {
  356.                                 com_exchange(g_loop_buf);
  357.                                 g_cos_loop_times--;
  358.                                 mdelay(20);
  359.                         }
  360.                         else
  361.                         {
  362.                                 mdelay(200);
  363.                                 g_cos_loop = FALSE;
  364.                                 g_statistic_refreshed = TRUE;
  365.                                 statistic_print();
  366.                                 make_packet(COM_PKT_CMD_TEST_STOP, NULL, NULL);
  367.                         }
  368.                 }
  369.                
  370.                 //自動(dòng)卡檢測(cè)
  371.                 if (g_lpcd_started == TRUE)
  372.                 {
  373.                         if (TRUE == pcd_lpcd_check())
  374.                         {
  375.                                 g_lpcd_started = FALSE;
  376.                                 make_packet(COM_PKT_CMD_LPCD, NULL, NULL);
  377.                         }
  378.                 }
  379.                 //自動(dòng)卡檢測(cè)參數(shù)測(cè)試
  380.                 if (g_lpcd_config_test_start == TRUE)
  381.                 {
  382.                         if (TRUE == pcd_lpcd_check())
  383.                         {
  384.                                 u8 XDATA tag_type[2];
  385.                                        
  386.                                 g_statistics.lpcd_cnt++;
  387.                                 g_statistic_refreshed = TRUE;
  388.                                 statistic_print();
  389.                                 
  390.                                 //驗(yàn)證是否有卡入場(chǎng)
  391.                                 pcd_config('A');
  392.                                 status = pcd_request(0x52, tag_type);
  393.                                 //剛檢測(cè)到卡時(shí)可能處于距離邊緣,有可能第一次尋卡失敗,所以增加第二次尋卡驗(yàn)證
  394.                                 if (status != MI_OK)
  395.                                 {                                       
  396.                                         status = pcd_request(0x52, tag_type);
  397.                                 }
  398.                                 ///剛檢測(cè)到卡時(shí)可能處于距離邊緣,如果前兩次尋卡失敗,則第三次尋卡驗(yàn)證
  399.                                 if (status != MI_OK)
  400.                                 {                                       
  401.                                         status = pcd_request(0x52, tag_type);
  402.                                 }
  403.                                 
  404.                                 if (status == MI_OK)
  405.                                 {//有卡片入場(chǎng)
  406.                                         //可添加具體的應(yīng)用功能代碼
  407.                                         /*



  408.                                         */
  409.                                         //等待卡離場(chǎng),應(yīng)用代碼中可不必等待離場(chǎng)
  410.                                         while(1)
  411.                                         {
  412.                                                 pcd_antenna_off();
  413.                                                 mdelay(10);
  414.                                                 pcd_antenna_on();
  415.                                                 mdelay(10);        
  416.                                                 status = pcd_request(0x52, tag_type);
  417.                                                 if(status != MI_OK)
  418.                                                 {//一次驗(yàn)證卡離場(chǎng)
  419.                                                         mdelay(100);
  420.                                                         status = pcd_request(0x52, tag_type);
  421.                                                         if(status != MI_OK)
  422.                                                         {//二次驗(yàn)證卡離場(chǎng)
  423.                                                                 mdelay(100);
  424.                                                                 status = pcd_request(0x52, tag_type);
  425.                                                                 if(status != MI_OK)
  426.                                                                 {//三次驗(yàn)證卡離場(chǎng)
  427.                                                                         mdelay(100);
  428.                                                                         pcd_lpcd_config_start(g_lpcd_config.delta, g_lpcd_config.t_inactivity_ms, g_lpcd_config.skip_times, g_lpcd_config.t_detect_us);        
  429.                                                                         break;        
  430.                                                                 }
  431.                                                         }
  432.         
  433.                                                 }
  434.                                         }
  435.                                 }
  436.                                 else
  437.                                 {
  438.                                         g_statistics.lpcd_fail++;
  439.                                         g_statistic_refreshed = TRUE;
  440.                                         pcd_lpcd_config_start(g_lpcd_config.delta, g_lpcd_config.t_inactivity_ms, g_lpcd_config.skip_times, g_lpcd_config.t_detect_us);        
  441.                                 }
  442.                         }
  443.                 }
  444.                 //輸出統(tǒng)計(jì)信息
  445.                 if (is_timeout(g_statistic_last_t, 100))
  446.                 {
  447.                         g_statistic_last_t = get_tick();
  448.                         statistic_print();
  449.                 }
  450.         }               
  451. }

復(fù)制代碼

所有資料51hei提供下載:
N12_SDK_STC_V1.8.0-MH523.zip (191.79 KB, 下載次數(shù): 37)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:396791 發(fā)表于 2018-9-15 09:04 | 只看該作者
樓主有沒(méi)有這資料對(duì)應(yīng)實(shí)物的淘寶鏈接,求分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天干天天爱天天 | 久久三级影院 | 毛片区 | 欧美aaaaaaaa| 国产一区二区三区在线免费观看 | 国产一区二区三区欧美 | 日日爽| 国产欧美一区二区三区在线播放 | 五月天综合影院 | 日韩欧美国产一区二区 | 91av视频在线免费观看 | 日韩综合在线视频 | 中国大陆高清aⅴ毛片 | 国产精品99久久久久久大便 | 日韩色视频 | 亚洲欧美一区二区三区在线 | 男女精品网站 | 亚洲啪啪 | 午夜一级做a爰片久久毛片 精品综合 | 精品视频免费 | 成人精品国产一区二区4080 | 成人福利网站 | 日本欧美在线 | 国产黄色一级电影 | 热久久免费视频 | 全部免费毛片在线播放网站 | 国产黄色av电影 | 天天操天天射综合网 | 精品9999 | 国产亚洲欧美在线视频 | 国产一区二区三区 | 欧美啊v在线观看 | 亚洲www | 久久一区二区三区电影 | h视频在线免费 | 精品久久免费 | 91精品国产一区二区在线观看 | 男人天堂色| 久久久久久久久久久福利观看 | 亚洲色图网址 | 国产日韩一区二区三免费高清 |