找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2194|回复: 0
收起左侧

STM32F107单片机USB驱动磁卡刷卡器的驱动源程序

[复制链接]
ID:332850 发表于 2018-5-18 11:47 | 显示全部楼层 |阅读模式
STM32F107磁卡刷卡器驱动
程序使用说明:
1、本例程通过4个led来指示usb鼠标的功能,仅为演示用,若用户要开发自己的usb鼠标程序,可以参考。
2、将usb鼠标接到J3上(或通过mini usb转接线接到J10上)将程序下载到开发板上,复位单片机,点击鼠标,则可以看到相应的led亮。

单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include <includes.h>
  3. #include "LED.h"
  4. #include "usbh_usr.h"
  5. #include "usbh_core.h"
  6. #include "stmflash.h"
  7. #include "timer.h"
  8. #include "usart.h"
  9. #include "yx5200.h"

  10. #define _2ms 14400
  11. #define _20ms 144000
  12. #define _200ms 1440000
  13. #define _400ms 2880000
  14. #define _1s 7200000

  15. extern USBH_Status USBH_DeInit(void);
  16. extern void clear_buffer(void);
  17. extern HID_Machine_TypeDef HID_Machine;
  18. extern vu8 bDeviceState;                //默认没有连接  
  19. extern unsigned char BUFEER[PASSWORD_DIGITS + 1];
  20. extern unsigned char BUFEER_counter;
  21. extern unsigned char enter_complete;
  22. extern unsigned char _30s_config_count;
  23. void Compare_Process(void);
  24. void ConfigurationMode_judgment(void);
  25. void Password_judgment(void);
  26. unsigned char Judgment_password(unsigned char *buffer,unsigned char *password);
  27. unsigned char Active(void);
  28. unsigned char Setting(void);

  29. unsigned char PASSWORD1[PASSWORD_DIGITS + 1] = {0};
  30. unsigned char PASSWORD2[PASSWORD_DIGITS + 1] = {0};
  31. unsigned char PASSWORD3[PASSWORD_DIGITS + 1] = {0};
  32. unsigned char RESTWORD[PASSWORD_DIGITS + 1] = {0};
  33. unsigned char password1_count;
  34. unsigned char Configuration_mode = 0;
  35. unsigned char active_falg = 0;
  36. unsigned char _30s_flag = 0;
  37. unsigned char ResetMode = 0;
  38. static void LED_Delay(uint32_t nCount)
  39. {
  40.   while(nCount > 0)
  41.   {
  42.             nCount --;   
  43.   }
  44. }
  45. void Start_sound(void) {
  46.         GPIO_SetBits(GPIOA , GPIO_Pin_9);
  47.         LED_Delay(_400ms);
  48.         GPIO_ResetBits(GPIOA , GPIO_Pin_9);
  49. }
  50. int main (void)
  51. {
  52.         unsigned char i;
  53.         LED_Configuration();                                                         //初始化
  54.         uart_init(9600);
  55.         TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
  56.         USBH_Init(&USB_OTG_FS_dev, &HID_cb , &USR_Callbacks);
  57.         StartReadEeprom();                                                                //读密码
  58.         clear_buffer();
  59.         Start_sound();
  60.         LED_Delay(_1s);
  61.         if(Setting() == 1) {
  62.                 Configuration_mode = MODE1;
  63.                 Uart_SendCMD(0x0F , 0 , 0x0202) ;
  64.         } else {               
  65.                 Uart_SendCMD(0x0F , 0 , 0x0201) ;
  66.         }
  67.         LED_Delay(_200ms);
  68.         for(i = 0;i < 50;i ++) {
  69.                 while(!yx5200_play_finish_statu()) {LED_Delay(_2ms);}                //检测是不是播完了
  70.         }
  71.         Uart_SendCMD(0x06 , 0 , 0x0000) ;
  72.         LED_Delay(_200ms);
  73.         Uart_SendCMD(0x0F , 0 , 0x0463) ;
  74.         LED_Delay(_400ms);
  75.         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == 0) {
  76.                 LED_Delay(_20ms);
  77.                 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == 0) {
  78.                         Uart_SendCMD(0x0E , 0 , 0x0000) ;
  79.                         LED_Delay(_200ms);
  80.                         ResetMode = 1;
  81.                 }
  82.         }
  83.         Uart_SendCMD(0x06 , 0 , 0x001E) ;
  84.         LED_Delay(_200ms);
  85.         active_falg = 1;
  86.         while(1) {
  87. //                if(active_falg == 0) {
  88. //                        if(Active() == 1) {
  89. //                                active_falg = 1;
  90. //                                Uart_SendCMD(0x0F , 0 , 0x0301) ;
  91. //                                LED_Delay(_200ms);
  92. //                                for(i = 0;i < 50;i ++) {
  93. //                                        while(!yx5200_play_finish_statu()) {LED_Delay(_2ms);}                //检测是不是播完了
  94. //                                }
  95. //                        }
  96. //                }
  97.                 USBH_Process();                                //USB处理流程
  98.                 Compare_Process();                                                        //密码比较流程
  99.         }
  100. }

  101. //////////////////////////////激活接口/////////////////////////////////
  102. unsigned char Setting(void) {
  103.         if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7) == 0) {//C7
  104.                 LED_Delay(_200ms);
  105.                 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7) == 0) {
  106.                         return 1;
  107.                 }
  108.         }
  109.         return 0;
  110. }
  111. unsigned char Active(void) {
  112.         if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6) == 0) {//C6
  113.                 LED_Delay(_200ms);
  114.                 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6) == 0) {
  115.                         return 1;
  116.                 }
  117.         }
  118.         return 0;
  119. }
  120. ////////////////////////////////密码比较过程//////////////////////////////////
  121. void Compare_Process(void) {
  122.        
  123.         if(enter_complete == 1) {                                                //如果按下了回车
  124.                 enter_complete = 0;
  125.                 if((active_falg) && (BUFEER_counter != 0)) {
  126.                         Password_judgment();                                                //正常密码比较
  127.                 }
  128.                 clear_buffer();                                                                //清buffer
  129.         }
  130. }
  131. //////////////////////////////正常密码比较过程////////////////////////////////
  132. void Password_judgment(void) {                                                //正常密码的比较
  133. /////////////////////////////密码1/////////////////////////////////
  134.         if(BUFEER_counter == password1_count) {
  135.                 if(Judgment_password(BUFEER,PASSWORD1)) {
  136.                                 _30s_flag = 1;
  137.                                 _30s_config_count = 0;
  138.                                 GPIO_SetBits(GPIOA , GPIO_Pin_8);
  139.                                 Uart_SendCMD(0x0F , 0 , 0x0101) ;
  140.                                 LED_Delay(_200ms);
  141.                         return;
  142.                 }
  143.         }
  144.         Uart_SendCMD(0x0F , 0 , 0x0302) ;
  145.         LED_Delay(_200ms);
  146. }

  147. unsigned char Judgment_password(unsigned char *buffer,unsigned char *password) {
  148.         unsigned char i;
  149.        
  150.         for(i = 0;i < PASSWORD_DIGITS;i++) {
  151.                 if(buffer[i] != password[i]) {
  152.                         break;
  153.                 }
  154.         }
  155.         if(i == PASSWORD_DIGITS) {
  156.                 return 1;
  157.         } else {
  158.                 return 0;
  159.         }
  160. }

  161. #ifdef  USE_FULL_ASSERT

  162. /**
  163. ……………………

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

所有资料51hei提供下载:
STM32F107磁卡刷卡器驱动.rar (688.12 KB, 下载次数: 15)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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