STM32(RFID)阶段二(读序列,修改金额)
来源:互联网 发布:小米数据迁移苹果 编辑:程序博客网 时间:2024/06/08 15:29
前一段时间进行了USART2串口添加,接收协议改写的工作。这一次就可以利用之前的接收和发送代码来完成miniSTM32单片机与RFID读写器的通信,实现IC卡充值和扣费的操作。资料支持:串口通信数据的LCD显示,中断嵌套等等。 demo2功能:IC卡设置成自动返回卡号和块数据,读一次;IC卡一接触到读写器,就向读写器发送卡号和指定块数据。接收数据显示在TFTLCD上,在中断函数中,设置KEY1为加100操作,KEY0为减100操作;每一次修改数额,都将钱数刷新一次,并显示通信接收数据包。
上代码:
rfid.c
#include "rfid.h"#include "usart.h"#include "delay.h"#include "lcd.h"u16 money=0;u8 card_id[8];u8 Cmd_Read_money[8] = {0x01,0x08,0xA9,0x20,0x01,0x01,0x00,0x7F}; //查询命令u8 Cmd_ADD_money[11] = {0x01,0x0B,0xA8,0x20,0x01,0x01,0x64,0x00,0x00,0x00,0x19};//加100命令u8 Cmd_SUB_money[11] = {0x01,0x0B,0xA7,0x20,0x01,0x01,0x64,0x00,0x00,0x00,0x16};//减100命令void USART2_Send_Data(u8 *buf)//发送命令函数{ u8 i; u8 num=buf[1]; u8 String[10]; for(i=0;i<num;i++) { USART2->DR=buf[i]; USART_ClearFlag(USART2,USART_FLAG_TC); while((USART2->SR&0X40)==0);//等待发送结束 } delay_ms(100); money=USART_RX_BUF[5]+USART_RX_BUF[6]*256; //两个字节的16进制,转换成10进制 LCD_ShowxNum(102,100,money,4,24,0); sprintf((char*)String,"%2X%2X%2X%2X%2X%2X%2X%2X%2X%2X",USART_RX_BUF[0],USART_RX_BUF[1],USART_RX_BUF[2],USART_RX_BUF[3],USART_RX_BUF[4],USART_RX_BUF[5],USART_RX_BUF[6],USART_RX_BUF[7],USART_RX_BUF[8],USART_RX_BUF[9]); //显示通信数据,sprintf转成字符串,再LCD_ShowString LCD_ShowString(30,180,200,12,12,String);}void Receive_One(void)//第一次接收显示卡号,余额{ if(count==1){ sprintf((char*)card_id,"%2X%2X%2X%2X",USART_RX_BUF[7],USART_RX_BUF[8],USART_RX_BUF[9],USART_RX_BUF[10]); money=USART_RX_BUF[11]+USART_RX_BUF[12]*256; }// Read_money(Cmd_Read_money[8]);//USART_RX_BUF[0]==4}
exti.c
void EXTI9_5_IRQHandler(void){ delay_ms(10); //消抖 if(KEY0==0) { USART2_Send_Data(Cmd_SUB_money);//减操作 LED1=!LED1; } EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位 }void EXTI15_10_IRQHandler(void){ delay_ms(10); //消抖 if(KEY1==0) { USART2_Send_Data(Cmd_ADD_money);//加操作 LED1=!LED1; } EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位}
main.c
#include "led.h"#include "delay.h"#include "sys.h"#include "usart.h"#include "lcd.h"#include "rfid.h"#include "exti.h" int main(void) { u8 times=0; delay_init(); //延时函数初始化 //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2,已写在usart.c里。 uart_init(9600); //串口初始化为9600 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); EXTIX_Init(); LCD_Clear(WHITE); POINT_COLOR=RED; LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^"); LCD_ShowString(30,70,120,24,24,"CardID:"); LCD_ShowString(30,100,200,24,24,"money:"); LCD_ShowString(30,130,200,24,24,"count:"); while(1) { Receive_One(); LCD_ShowString(115,75,120,16,16,card_id); LCD_ShowxNum(102,100,money,4,24,0); LCD_ShowxNum(102,130,count,2,24,0); times++; if(times%300==0) { LED0=!LED0;//闪烁LED,提示系统正在运行. times=0; } delay_ms(10); } }
这只是部分核心代码,在实际文件里,USART接收中断抢占优先级设为0x02,按键中断优先级为0x01,这样在按键中断执行的过程中还可以串口接收数据,不然程序会出问题,我也是尝试了多次才解决这个问题。那么到这里我们已经完成RFID钱包的大部分功能,还要加上数字键盘,实现任意输入数字充值扣费。有不理解的可以评论留言,觉得文章对你有一定帮助的欢迎点个赞,谢谢。
阅读全文
1 0
- STM32(RFID)阶段二(读序列,修改金额)
- STM32(RFID)阶段一:添加串口USART2,修改中断接收协议
- RFID学习(二)国际标准
- MySQL(阶段二)
- JavaScript阶段总结(二)
- 机房准备阶段(二)
- STL算法库-非修改序列式操作(二)
- 二、RFID与物联网关系(第一次作业)
- [RFID]IC卡克隆(二)Proxmark3驱动安装
- [RFID]射频卡介绍(二)IC-Mifare(M1)
- 基础技术篇 2 —— RFID技术(二)
- stm32之CAN(二)
- stm32串口学习(二)
- STM32 F407VG (二)DMA
- Oracle启动三阶段(二)
- 网页开发的阶段总结(二)
- open阶段的一致性检验(二)
- Java制作画图板(阶段二)
- 简单的长连接
- Docker-CE-1
- Android Studio SVN使用指南之文件颜色
- 最新最详细明白的unity3d 和sharesdk 进行登录分享使用过程
- hdu1596 find the safest road
- STM32(RFID)阶段二(读序列,修改金额)
- javaWeb(3)
- java web图片上传和文件上传实例
- 14个你可能不知道的JS调试技巧
- 一个Java小白通向数据结构算法之旅(5)
- 01、UIPickerView
- Oracle之分区表
- 文章标题
- MarkdownPad编辑器之配置