历史上的今天
今天是:2025年02月15日(星期六)
2019年02月15日 | STM32(RFID)阶段二(读序列,修改金额)
2019-02-15 来源:eefocus
前一段时间进行了USART2串口添加,接收协议改写的工作。这一次就可以利用之前的接收和发送代码来完成miniSTM32单片机与RFID读写器的通信,实现IC卡充值和扣费的操作。资料支持:串口通信数据的LCD显示,中断嵌套等等。
字符串显示使用 sprintf() 函数,中断嵌套修改中断优先级。
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 { 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钱包的大部分功能,还要加上数字键盘,实现任意输入数字充值扣费。
史海拾趣
|
地震发生后,震区内音信全无。庞大的社会应急联动系统没有了信息来源,这是致命的断链。 怎么把里面的信息传出来呢?通信。但是有线通信,包括光缆链路在内全部断掉。手机等无线通信也瘫痪了。 地震后常规电源基本被破 ...… 查看全部问答> |
|
受目前网络环境和产品现有技术水平的限制,IP监控产品的应用受到网络带宽和数字编码/压缩技术这一对互为因果关系的因素制约;同时,相对模拟产品它具有组网方便,远程连接费用较低的特点。因此,IP监控产品的主要目标市场应是一高一低两大类。 ...… 查看全部问答> |
|
wince启动到桌面后 USB 不产生中断,过2分钟后才有中断 各位大哥: 我的 WINCE6 在关闭电源一两个小时后,再上电启动到桌面,这时候 USB 鼠标是不能使用的 监测系统中断时发现没产生中断,当让系统在桌面过2分钟后,USB鼠标可以使用了,而且也产 生了中断 ...… 查看全部问答> |
|
想花3个月时间仔细研究IEEE802.11B协议. 顺便在自己的Windows CE上写个IEEE802.11b驱动. 可是不知道哪里有非常完整的协议规格标准书? 如果有中文就就更好了.… 查看全部问答> |
|
兄弟我做了一个STM32F10XVB的核心小板,包含CPU、晶体、电容、复位,100个管脚用了4个2X13的接插件引出,有个疑问: 将5个VDD接到一块,使用一个脚引出供电?还是使用5个脚供电?5个脚存在回路问题吧?另外VSS呢,地的接法应该怎样? 我初步想 ...… 查看全部问答> |
|
我在網上找了個msp430 JTAG 仿真器的圖紙,按照圖紙的電路,焊接了個板子(IC:74HC244N)。 但是在用IRA的時候出現連接錯誤。大家看看這個圖錯誤還在怎麼了。 我前後焊了3個板子,都是這樣。 … 查看全部问答> |




