您当前的位置:首页 > 生活常识 > 正文

校园一卡通感知层设计,基于STM32设计的校园一卡通项目

校园一卡通感知层设计,基于STM32设计的校园一卡通项目

1.信息时代的校园离不开信息管理。数字化“校园一卡通”建设是校园信息化建设的重要组成部分,是为信息化校园提供信息采集的基础工程,也是获取学校信息服务的主要途径之一。

校园一卡通将IC卡的强大功能和计算机网络的数字化理念融入校园,将学校的所有系统连接成一个整体,动态掌握每个持卡人的情况,大大提高了学校的管理水平和服务质量。

介绍了一种利用STM32微控制器RFID RC522设计的校园卡消费充值机的方案,可以模拟充值、消费、修改密码、挂失、登录、查询等操作。

硬件介绍:

单片机:STM32F103ZE6

刷卡模块:RFID-RC522

液晶屏:3.5寸液晶屏触摸屏,准时。

完整项目下载地址:https://download . csdn . net/download/Xiaolong 1126626497/63983899。

文章演示地址:https://live.csdn.net/v/182606

操作效果:

2.本项目实现了2.1 RFID-RC522模块。RFID-RC522模块是直接从淘宝购买的现成模块。该模块的物理图如下:

RC522是恩智浦公司设计的13.56MHz非接触式读写卡芯片,可以读写IC卡。它具有电压低、成本低、体积小的特点。它支持SPI接口通信,任何单片机都可以与之通信。SPI时序仿真也很简单。

目前,地铁卡、校园卡、公交卡都属于M1(S50)卡。M1卡有16个扇区,每个扇区分为4个块,每个块的容量为16字节。每个扇区的最后一块是存储密码。每次读写块内数据,都需要验证IC卡的密码。只有当你有写权限时,你才能读写这个块。密码验证后,可以直接使用密码修改、读写扇区等。去读书。

IC卡详细介绍请看这里:https://blog . csdn . net/Xiaolong 1126626497/article/details/117075834。

在本项目中,用于STM32和RCC522之间通信的SPI是模拟定时,可以方便地移植到其他单片机上。

SPI模拟时序产生如下:

u8rc 522 _ SPI _ read write one byte(u8tx _ data){ u8rx _ data=0;u8i;for(I=0;i8;I){ RC 522 _ SCLK=0;if(tx _ data0x 80){ RC 522 _ OUTPUT=1;} else { RC 522 _ OUTPUT=0;} tx _ data=1;RC 522 _ SCLK=1;rx _ dataCRL |=0x00000003GPIOA-CRH=0x 000 ff 0 ff;GPIOA-CRH |=0x 43330300;RC 522 _ CS=1;RC 522 _ SCLK=1;}2.2液晶屏LCD采用的是正点atom 3.5寸屏幕,驱动芯片为NT35310,支持8080时序。STM32大容量芯片本身就有FSMC接口,所以你可以直接使用FSMC接口操作液晶屏来完成操作。这里考虑到程序的可移植性,由于STM32F103C8T6等中小容量产品没有FSMC界面,为了方便程序的正常运行,目前虽然屏幕刷新的效率比FSMC慢很多,但是这个项目的界面不需要很高的刷新率,也没有频繁的切换效果,所以整体效果还是不错的。

模拟时序代码如下:如果想移植到其他单片机上,只需要修改GPIO口即可。

void LCD _ write _ cmd(u8 reg){ LCD _ CS=0;//拉低片选脚,选中LCDLCD _ RS=0;//拉低数据/命令控制线,选择要操作命令LCD _ RD=1;//禁止读LCD _ WR=0;//拉低WR,准备写操作//数据总线输出命令,把要发送的命令放到数据总线上gpio b-ODR=(u16)reg;LCD _ WR=1;//拉高华氏反应(瓦色尔曼反应)写使能LCD _ CS=1;//拉高片选,结束操作} void LCD _ write _ data(u16 data){ LCD _ CS=0;//拉低片选脚,选中LCDLCD _ RS=1;//拉高数据/命令控制线,选择要操作数据LCD _ RD=1;//禁止读LCD _ WR=0;//拉低WR,准备写操作//数据总线输出数据,把要发送的数据放到数据总线上GPIOB-ODR=数据;LCD _ WR=1;//拉高华氏反应(瓦色尔曼反应)写使能LCD _ CS=1;//拉高片选,结束操作}void lcd_set_cursor(u16 x,u16y){ LCD _ write _ cmd(SET _ X _ ADDR);LCD _ write _ data(x8);LCD _ write _ data(x0xff);LCD _ write _ cmd(SET _ Y _ ADDR);LCD _ write _ data(y8);LCD _ write _ data(y0 xff);}void lcd_write_reg(u16 cmd,u16参数){ LCD _ write _ cmd(cmd);lcd_write_data(参数);}void lcd_draw_dot(u16 x,u16 y,u16 color){lcd_set_cursor(x,y);LCD _ WRITE _ cmd(WRITE _ MEMORY _ START);lcd_write_data(彩色);//[15:0]-[R4-R0:G5-G0:B4-B0]} void LCD _ show _ screen(const u8 * image,u32 size,u16 x,u16y){ u32i=0;lcd_set_cursor(x,y);//设置光标位置LCD _ WRITE _ cmd(WRITE _ MEMORY _ START);//开始写入gram while(I size){ LCD _ write _ data(* image8 | *(image 1));image=2;我;}}//画矩形//(x1,y1),(x2,y2):矩形的对角坐标void lcd_draw_rectblock(u16 y1,u16 y2,u16 color){ u16 I;for(;y1=y2y1){lcd_set_cursor(0,y1);//设置光标位置LCD _ WRITE _ cmd(WRITE _ MEMORY _ START);//开始写入克for(I=0;i0)incy=1;else if(delta _ y==0)incy=0;//水平线else { incy=-1;delta _ y=-delta _ y;} if(delta _ xdetal _ y)距离=delta _ x;//选取基本增量坐标轴其他距离=delta _ y;for(t=0;t距离){ xerr-=距离;uRow=incx } if(yerdinstance){ yerr-=distance;uCol=incy } } } void LCD _ draw _ circle(u16x,u16 y,u8 r,u16 color){int a,b,di;a=0;b=r;di=3-(R1);//判断下个点位置的标志while(a=b){lcd_draw_dot(x a,y-b,color);//5 lcd_draw_dot(x b,y-a,color);//0 lcd_draw_dot(x b,y a,color);//4 lcd_draw_dot(x a,y b,color);//6 lcd_draw_dot(x-a,y b,color);//1 lcd_draw_dot(x-b,y a,color);lcd_draw_dot(x-a,y-b,颜色);//2 lcd_draw_dot(x-b,y-a,color);//7a;//使用布雷森哈姆算法画圆if(di;3.3 触摸屏触摸屏是液晶显示屏本身自带的,触摸芯片是XPT2046,是一个12位的物理输出核心芯片,通信协议是精力时序。

项目里采用模拟精力时序进行与触摸屏芯片通信,因为XPT2046本身是物理输出核心芯片,所以在屏幕上按下后读取出来的数据是模拟数据值—物理坐标值,我们还需要将它转为屏幕坐标与液晶显示屏的像素点对应起来,这样使用起来才比较方便。

XPT2046核心代码如下:

# include ' STM 32 F10 x . h ' # include ' xpt 2046。h '包括'延迟。h 'void xpt 2046 _ init(void){ RCC-APB 2 ENR |=0x 01 CRL |=0x 44000000;//推挽输出GPIOA-CRH=0x fff 00 ff 0;GPIOA-CRH |=0x 00033003;t _ CS=1;t _ SCK=0;}u16 xpt 2046 _ read(u8 cmd){ T _ SCK=0;t _ MO=0;t _ CS=0;for(u8i=0;i8;I){ T _ SCK=0;if(cmd0x 80)T _ MO=1;elseT _ MO=0;cmd=1;t _ SCK=1;}//15时钟周期转换t _ SCK=0;t _ MO=0;t _ SCK=1;u16数据=0;for(u8i=0;i12I){ T _ SCK=0;数据=1;t _ SCK=1;if(T _ MI)data |=0x 01;} T _ CS=1;返回(数据);} u8 xpt 2046 _ position(TOUCH * xpt 2046 _ pos){ if(!T_PEN ){u8 i,j;u16 tmpu16 x[16],y[16];for(I=0;i16I){ x[I]=xpt 2046 _ read(XPOS);y[I]=xpt 2046 _ read(YPOS);} for(I=0;i16I){ for(j=0;JX[j 1]){ tmp=x[j];x[j]=x[j 1];x[j 1]=tmp;} if(y[j]y[j 1]){ tmp=y[j];y[j]=y[j 1];y[j 1]=tmp;}}}u32 sum_x,sum _ y;sum _ x=sum _ y=0;for(I=3;IX=sum _ x/10;xpt 2046 _ pos-y=sum _ y/10;返回0;} elsereturn 1;}u8触摸位置(触摸*触摸_ pos){触摸xpt 2046 _ pos如果(!xpt 2046 _ position(xpt 2046 _ pos)){ touch _ pos-x=320-(xpt 2046 _ pos)。x-300)/11.25;touch _ pos-y=480-(xpt 2046 _ pos。y-200)/7.7;返回0;} else { touch _ pos-x=0x ffff;touch _ pos-y=0x ffff;返回1;}}

审核汤梓红


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 美国为什么是资本主义国家(什么是资本主义国家)

下一篇: excel提取指定位置内容,Excel表格技巧—一键提取符合条件的数据到指定位置(Excel正则表达式提取指定位数字和插入开头文本)



推荐阅读