历史上的今天
返回首页

历史上的今天

今天是:2024年11月12日(星期二)

正在发生

2021年11月12日 | STM8单片机+RC522电路原理图+读写卡源代码

2021-11-12 来源:eefocus

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

电路原理图如下:
0.jpg?imageView2/2/w/550

IMG_20180322_145435.jpg?imageView2/2/w/550 IMG_20180322_145440.jpg?imageView2/2/w/550 IMG_20180322_145505.jpg?imageView2/2/w/550 IMG_20180322_145513.jpg?imageView2/2/w/550

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. ……………………


推荐阅读

史海拾趣

Hi-Tron Semiconductor Corp公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,其发展历程涵盖了从模拟频道增补器到数字卫星、地面及有线电视机顶盒的广泛范畴。而从狭义角度看,机顶盒特指那些具备数字处理能力的设备,如IPTV机顶盒、DVB-S卫星机顶盒、DVB-T地面机顶盒及DVB-C有线电视机顶盒等。

机顶盒的核心功能在于接收并转换数字电视信号,使之能在传统或智能电视上播放。它不仅能接收来自有线电缆、卫星天线及宽带网络的信号,还能提供电子节目指南、网页浏览等增值服务。通过机顶盒,用户能够享受到高清乃至4K超高清的电视节目,体验更为细腻的画面和震撼的音效。此外,机顶盒还具备网络交互能力,支持在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。未来,机顶盒将不仅限于基本的信号接收与解码功能,还将融入更多智能推荐、语音识别等先进技术,为用户提供更加个性化、便捷的娱乐体验。总之,机顶盒作为连接电视与互联网的桥梁,正以其丰富的功能和广泛的应用场景,不断满足用户日益增长的娱乐需求。

FARNELL公司的发展小趣事

随着业务的不断发展,FARNELL公司开始寻求全球化拓展。公司陆续在欧洲、美洲、亚洲等地设立分公司和办事处,形成了覆盖全球的销售网络。这一过程中,FARNELL公司始终坚持“供货可靠、方便快捷、物超所值”的经营理念,为全球客户提供优质的产品和服务。

Acculin Inc公司的发展小趣事

Acculin Inc深知人才是企业发展的核心。为了吸引和留住优秀人才,公司建立了完善的培训体系,并为员工提供了良好的晋升机会。此外,公司还注重团队建设,通过举办各种团建活动活动增强员工之间的凝聚力。这些举措使得Acculin在人才竞争激烈的市场中保持了优势。

Astema公司的发展小趣事

随着公司规模的扩大,Astema开始关注可持续发展和社会责任。公司致力于推动绿色生产,减少对环境的影响。同时,Astema还积极参与社会公益活动,回馈社会。这些举措不仅提升了公司的社会形象,还为公司的长期发展注入了新的动力。

以上这些故事只是模拟Astema公司可能的发展路径和挑战,并非真实情况。真实的电子行业公司发展历程往往更加复杂和多元,需要综合考虑多种因素。如果您对Astema公司的真实发展情况感兴趣,建议查阅相关的行业报告、公司年报或新闻报道等。

General Diode Corp公司的发展小趣事
检查电磁振动系统是否堵塞或损坏,清理或更换故障部件;检查送丝轮是否磨损严重,必要时更换新的送丝轮。
HB公司的发展小趣事

理念:作为一家负责任的企业,Hartmann Codier GmbH始终将环保理念贯穿于产品研发、生产和销售的全过程中。公司严格遵守RoHS/WEEE等国际环保标准,杜绝使用或包含六种有毒重金属物质。

实践:在产品设计阶段,公司就充分考虑环保因素,采用环保材料和工艺;在生产过程中,公司加强了对废弃物的处理和回收利用;在产品销售后,公司还提供了完善的回收服务。这些措施不仅降低了产品对环境的影响,还提升了企业的社会形象。

问答坊 | AI 解惑

半导体制程

  半导体制程   微机电制作技术,尤其是最大宗以硅半导体为基础的微细加工技术(silicon- based micromachining),原本就肇源于半导体组件的制程技术,所以必须先介绍清楚这类制程,以免沦于夏虫语冰的窘态 ...…

查看全部问答>

c51 mx485芯片 485口通信。

c51+mx485芯片+485口通信。C51能够接受到PC通过485发送的命令,但是PC接收不到C51通过485回复的信息。我的PC和C51的485通信通过485转232的。请大家帮忙分析一下。程序用232没有问题。…

查看全部问答>

怎么判断串口接受寄存器目前正有数据,使发送端延迟发送数据,从而实现简单的流量控制?

小弟我现在有一练习,就是在dos平台下,用C语言来实现简单的串口流量控制.    有一个问题是:怎么判断串口接受寄存器目前正有数据,使发送端延迟发送数据,从而实现简单的流量控制?我个人看了串口的几个寄存器都没有这个状态信息的.请各位高 ...…

查看全部问答>

AND元件作用是什么?

一个电路用这个元件,不知什么作用,资料也搜不到,有用过的吗? 请教了!…

查看全部问答>

8位控制器数据集成到32位APB总线上怎么处理比较合理?

请教各位大侠,我现在想集成一个8位的CAN控制器在APB总线上 CAN控制器的输入输出数据都是8位的,而APB总线的输入输出数据都是32位的。。。 那把这个控制器集成在APB总线上的时候怎么处理比较合理? 高24位补零,好像太浪费了。。。CAN的波特率比 ...…

查看全部问答>

DIY自制太阳能夜晚应急灯

电路很简朴不复杂 电路很简单 …

查看全部问答>

谁有AVR自带的函数库?

谁有AVR自带的函数库,请问怎样用啊···········急······…

查看全部问答>

SAM R21跑轻量级网软件堆栈DEMO

本帖最后由 蓝雨夜 于 2014-12-17 11:20 编辑 SAM R21跑轻量级网软件堆栈DEMO 在Atmel Studio 6.2中有关无线收发测试的 demo没几个,只找到个Peer2Peer先测试下 功能很简单:A串口接收数据,通过无线发送B,同时A串口反送数据 ATEML在程序结构 ...…

查看全部问答>

Quartus II 虚拟引脚Virtual pin的使用

一个比较大的FPGA项目往往由许多模块组合而成,开发时我们可能要一个一个模块地验证,有时候一个模块可能会有非常多的模块之间的接口信号或者有些大工程会有好几百个引脚,这样FPGA提供的引脚接口就可能不够,而我们在进行单一功能验证时有些引脚可 ...…

查看全部问答>

应变片调理电路

这是一个应变片调理电路,图中的RV代表应变片,有没有高手帮忙定量分析一下啊 …

查看全部问答>