STM8单片机+RC522电路原理图+读写卡源代码

发布者:haoying最新更新时间:2021-11-12 来源: eefocus关键字:STM8  单片机  RC522  读写卡 手机看文章 扫描二维码
随时随地手机看文章

基于stm8的ds1302模块千万别把数据写在第3个区,不然卡就锁住了,只能写在第2个区

电路原理图如下:
0.jpg

IMG_20180322_145435.jpg IMG_20180322_145440.jpg IMG_20180322_145505.jpg IMG_20180322_145513.jpg

stm8单片机源码:

  1. /* Includes ------------------------------------------------------------------*/

  2. /* Includes ------------------------------------------------------------------*/

  3. #include "stm8s.h"

  4. #include "stm8s_clk.h"

  5. #include "intrinsics.h"

  6. #include "stm8s_uart1.h"

  7. #include "uart.h"

  8. #include "rc522.h"

  9. #include "string.h"

  10. #include "IWDG.h"

  11. #include "tim2.h"

  12. #include "1602i2c.h"

  13. void Delay(u32 nCount);

  14. extern u8 RxBuffer[RxBufferSize];

  15. extern u8 UART_RX_NUM;

  16. extern int time2;

  17. extern int tim2test;

  18. extern int tim2test1;

  19. unsigned char CT[2];//卡类型

  20. unsigned char SN[4]; //卡号

  21. unsigned char M1UID[8]={0x2e,0x55,0,0,0,0,0,0};//读卡器向上发送,读到卡后自动发

  22. extern unsigned char controlflag;//接收到控制LED beep指令标志   01表示收到

  23. extern unsigned char sendflag;//发送标志  =1表示还未发送过 =0表示已经发送一次  等待回复  如果超时重新发送

  24. unsigned char write[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};

  25. unsigned char read[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

  26. extern unsigned char receive[8];

  27. u8 read_flag=0;//读卡标志位  1;读到卡  0;还没读到卡

  28. u8 time_flag=0;//超时标志 0;未超时   1:超时

  29. //unsigned char key[6] = {0x19,0x84,0x07,0x15,0x76,0x14};

  30. unsigned char key[6] = {0xff,0xff,0xff,0xff,0xff,0xff};

  31. int sum=0;

  32. //unsigned char key[6] = {0x00,0x00,0x00,0x00,0x00,0x00};

  33. /* Private macro -------------------------------------------------------------*/

  34. #define countof(a) (sizeof(a) / sizeof(*(a)))

  35. #define  BufferSize (countof(Tx_Buffer)-1)

  36. /* Private variables ---------------------------------------------------------*/

  37. u8 Tx_Buffer[] = "请刷卡";

  38. u8 Rx_Buffer[BufferSize];

  39. u32 FLASH_ID ;

  40. /* Private defines -----------------------------------------------------------*/

  41. /* Private function prototypes -----------------------------------------------*/

  42. void cardNo2String(u8 *cardNo, u8 *str);

  43. /* Private functions ---------------------------------------------------------*/

  44. #define ReadWriteAddr 3                       //读写扇区

  45. void SN_UID(void)

  46. {

  47.   unsigned int tempUID;

  48.    M1UID[2]=SN[0];

  49.    M1UID[3]=SN[1];

  50.    M1UID[4]=SN[2];

  51.    M1UID[5]=SN[3];

  52.    tempUID=M1UID[1]+M1UID[2]+M1UID[3]+M1UID[4]+M1UID[5];

  53.    M1UID[6]=tempUID&0x00ff;

  54.    M1UID[7]=tempUID>>8;

  55.   

  56. }

  57. void rxfromPIC(void)

  58. {

  59.   

  60.   u8 i;

  61.   sum=receive[1]+receive[2]+receive[3]+receive[4]+receive[5];


  62.   if((receive[0]==0x7e)&&(receive[1]==0x55)&&(receive[6]==(sum&0x00ff))&&(receive[7]==(sum&0xff00)>>8))

  63.   {

  64.    

  65.     read_flag=0;

  66.     if(receive[2]==0x01)

  67.     {


  68.     }

  69.     else if(receive[2]!=0x01)

  70.     {

  71.      

  72.     }

  73.      if(receive[3]==0x01)

  74.      {

  75.      

  76.      }

  77.     else if(receive[3]!=0x01)

  78.     {

  79.       


  80.     }

  81.    

  82.     if(receive[4]==0x01)

  83.     {

  84.       

  85.     }

  86.       receive[0]=0x7e;

  87.      UART1_SendString(receive, 8);

  88.      for(i=2;i<8;i++)

  89.         {

  90.          M1UID[i]=0;

  91.         }

  92.      tim2test1=0;//启动计时

  93.   }

  94.   

  95.   for(i=0;i<8;i++)

  96.   {

  97.     receive[i]=0;

  98.   }

  99.   if(tim2test1>5000)//超时全部关闭

  100.   {

  101.     tim2test1=0;

  102.           //  GPIO_HIGH(GPIOD, GPIO_PIN_3);

  103.       //  GPIO_HIGH(GPIOD, GPIO_PIN_7);

  104.         // GPIO_LOW(GPIOD, GPIO_PIN_2);

  105.   }

  106. }

  107. void main(void)

  108. {

  109.   unsigned char  status;


  110.   /*设置内部时钟16M为主时钟*/

  111.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);


  112.   status = memcmp(read,write,16);//清0

  113.   InitRc522();//rc522初始化

  114.   sendflag=1;

  115.   I2C1602_Configuration();

  116.   init1602_i2c();

  117.   __enable_interrupt();//开启总中断

  118.   

  119.   //////////////

  120.   write[0] =1;//

  121.   write[1] =3;//

  122.   write[2] =2;//

  123.   write[3] =6;//

  124.   write[4] =7;//

  125.   write[5] =7;//

  126.   write[6] =6;//

  127.   write[7] =0;//

  128.   write[8] =2;//

  129.   write[9] =8;//

  130. write[10] =5;//

  131. ///////////////// 要写入的值,最多16个///////


  132.   while(1)

  133.   {


  134.     status = PcdRequest(PICC_REQALL,CT);     // 扫描卡

  135.     status= PcdAnticoll(SN);  

  136.     //防冲撞

  137.      rxfromPIC();

  138.    if (status==MI_OK)

  139.     {

  140.         SN_UID();

  141.         status = PcdSelect(SN);               //选择要操作的卡

  142.         if (status==MI_OK)

  143.         {   

  144.             if( MI_OK == PcdAuthState(0x61,ReadWriteAddr,key,SN) )        //验证A密码   

  145.              {     

  146.               //    status =  PcdWrite(2,write);//写入M1卡第2块块数据

  147.              status = PcdRead(2,read);//读取M1卡第2块块数据

  148.                 if(MI_OK == status)

  149.                 {


  150.               zl_i2c(0x80);

  151.               sj_i2c(0x30+ read[0]);

  152.               sj_i2c(0x30+ read[1]);

  153.               sj_i2c(0x30+ read[2]);

  154.               sj_i2c(0x30+ read[3]);

  155.               sj_i2c(0x30+ read[4]);

  156.               sj_i2c(0x30+ read[5]);

  157.               sj_i2c(0x30+ read[6]);

  158.               sj_i2c(0x30+ read[7]);

  159.               sj_i2c(0x30+ read[8]);

  160.               sj_i2c(0x30+ read[9]);

  161.               sj_i2c(0x30+ read[10]);

  162.                 }

  163.              }

  164.         }

  165.     }


  166.      

  167.    

  168. }

  169.   

  170.   

  171.   

  172. }


  173. void Delay(u32 nCount)

  174. {

  175.   /* Decrement nCount value */

  176.   while (nCount != 0)

  177.   {

  178.     nCount--;

  179.   }

  180. }



  181. void Hex2String(u8 hex,u8 *str)

  182. {

  183.   str[0] = (hex / 100) + '0';

  184.   str[1] = (hex % 100 / 10) + '0';

  185.   str[2] = (hex % 10) + '0';

  186. }


  187. void cardNo2String(u8 *cardNo, u8 *str)

  188. {

  189.     u8 Count = 0;

  190.     for(Count = 0; Count < 4; Count++)

  191.     {

  192.         Hex2String(cardNo[Count], str + Count * 4);

  193.         if(Count == 3)

  194.         {

  195.           str[15] = 'n';

  196.         }

  197.         else

  198.         {

  199.           str[Count * 4 + 3] = ':';

  200.         }

  201. ……………………


关键字:STM8  单片机  RC522  读写卡 引用地址:STM8单片机+RC522电路原理图+读写卡源代码

上一篇:stm8 唯一ID号加密方法.思路
下一篇:STM8L151G sx1276-LoRa测试程序

推荐阅读最新更新时间:2024-11-11 21:20

IAR编译stm8出现的奇葩问题
近日使用iar for stm8的软件来调试stm8系列的芯片,使用timer定时器中断时发现一个问题,程序中timer定时器的中断入口如下 #pragma vector=ITC_IRQ_TIM1_OVF + 2 __interrupt void TIM1_UPD_OVF_BRK_IRQHandler(void) { /* 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序 */ TIM1_ClearFlag(TIM1_FLAG_UPDATE); //add your code here } 我在 #pragma vector=ITC_IRQ_TIM1_OVF + 2 和 __interrupt
[单片机]
如何使用单片机模拟读写24C01EEPROM数据
实验目的: 熟悉使用单片机模拟读写24C01EEPROM 1、首先向24C01EEPROM写入数据 2、在从24C01EEPROM中读取数据,并用LED显示 硬件设置: 1、SW4开关全部闭合 2、SW2开关1闭合,其它断开 3、SW3开关7和8闭合,其它断开 #include __CONFIG(0x3545); //FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护 //RB3为数字IO口,低电压复位使能,上电延时开, 看门狗 开,4M晶体XT 振荡器 #defineucharunsignedchar #defineuintunsignedint #defineSCLT RISC
[单片机]
如何使用<font color='red'>单片机</font>模拟<font color='red'>读写</font>24C01EEPROM数据
STM8窗口看门狗
#include stm8s.h uint8_t u8_value; FlagStatus fs; void main(void) { GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_SLOW); fs = RST_GetFlagStatus(RST_FLAG_WWDGF); if(fs != RESET) { RST_ClearFlag(RST_FLAG_WWDGF); GPIO_WriteHigh(GPIOD, GPIO_PIN_0); } WWDG_Init(0x7f, 0x60); while (1)
[单片机]
兆易创新发布多款GD32F3系列主流型Cortex-M4 MCU 全面助力产业升级
GigaDevice GD32F303/305/307系列通用MCU基于120MHz Cortex®-M4内核并支持快速DSP功能,持续以更高性能、更低功耗、更方便易用的灵活性为工控消费及物联网等市场主流应用注入澎湃动力。下面就随单片机小编一起来了解一下相关内容吧。 日前,业界领先的半导体供应商兆易创新(GigaDevice)正式发布基于120MHz Cortex®-M4内核的GD32F303/305/307多个系列主流型微控制器新品,以增强的处理效能和丰富的系统资源为市场主流应用注入澎湃动力。作为GD32微控制器家族的最新成员, GD32F3系列率先提供了3大系列37个产品型号,包括LQFP144、LQFP100、LQFP64
[单片机]
STC单片机如何实现运行中自定义下载
使用STC单片机的用户肯定都有一个经历,烧写程序时每次都要先点下载命令、断电、上电,进行冷启动。整个过程是比较繁琐的一件事,下面介绍一种自定义下载方式(不用断电,不用每次都加载用户下载文件),修改完程序编译好,直接点接发送即可。 自定义下载原理:STC-ISP.exe软件 1、STC-ISP.exe软件,可由用户设置,按UART/RS-232的格式向用户程序发送命令。 波特率: 38400bps, 19200bps, 9600bps, 4800bps, 2400bps, 1200bps 等。 奇偶校验位: 无, 偶校验, 奇校验 数据位几位: 8 位,7 位,6 位,5 位等 停止位几位: 1 位, 1.5
[单片机]
STC<font color='red'>单片机</font>如何实现运行中自定义下载
基于单片机的CANBUS程序(C语言)
CAN-bus(Controller Area Network)即控制器局域网,是国际上应用最广泛的现场总线之一。起先,CAN-bus被设计作为汽车环境中的微控制器之间通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。它是一种多主方式的串行通讯总线,基本设计规范要求有较高的位速率,高抗干扰性,而且能够检测出产生的任何错误。信号传输距离达到10Km时,仍然可提供高达5Kbps的数据传输速率。由于CAN串行通讯总线具有这些特性,它很自然的在汽车、制造业以及航空工业中受到广泛应用。以上是我在单片机上调试好的can总线程序 #include SJA_nnyt.H //SJA存储器定义头文件 #include SJA_n
[单片机]
51单片机入门——定时器与外部中断
1. 定时器 1.1. 定时器的初步认识 在认识定时器之前我们先了解两个基本概念。 时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算方法就是 1 / 时钟源频率,一般情况下单片机的晶振都是 11.0592 MHz 的,对于这个单片机系统来说时钟周期就是 1 / 11059200 秒。 机器周期:我们的单片机完成一个操作的最短的时间。机器周期主要针对于汇编语言,在汇编语言下程序的每一条语句所使用的时间都是机器语言的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句所占用的时间是不确定的,受诸多因数的影响。51 单片机系列,在其标准架构下一个机器语言是 12 个时钟周期,也就是 12 / 11059200
[单片机]
51<font color='red'>单片机</font>入门——定时器与外部中断
基于瑞萨单片机自动寻迹智能车的设计
随着计算机、通信、传感器等技术的发展,智能车成为汽车发展的趋势。传感器技术在智能车的应用中越来越广泛,如在夜间、雾天、高危高污染等环境下的行驶。智能车将成为人们生活的一部分。文中以瑞萨智能车大赛为背景,设计了一种以16位微控制器H8/3048F作为小车的控制核心,采用红外反射传感器检测路面引导线,能根据给定参数行驶的电动车。文中从硬件和软件方面详细阐述了智能车工作原理和设计方法,设计的小车具有电路设计简单、软件控制高效等优点。 1 系统总体设计方案 本智能车利用车体前方的光电传感器采集赛道信息、后轴上的光电编码器采集车轮转速的脉冲信号。这些信号经单片机调理后,用于控制小车的运动。同时,内部模块产生的PWM波驱动直流电机,对
[单片机]
基于瑞萨<font color='red'>单片机</font>自动寻迹智能车的设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved